一、Docker 网络
docker网络主要是解决容器联网问题,也是我们使用容器中最重要的一个环节,如果容器没有网络则无法向网络中提供服务。
网络管理命令:docker network
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@k8s-master1 ~]# docker network --help Usage: docker network COMMAND Manage networks Commands: connect Connect a container to a network create Create a network disconnect Disconnect a container from a network inspect Display detailed information on one or more networks ls List networks prune Remove all unused networks rm Remove one or more networksRun 'docker network COMMAND --help' for more information on a command.
二、docker网络类型
创建容器的时候可以通过—network命令来指定容器的网络,网络类型有以下四种
bridge
host
none
容器网络或联盟网络
bridge
桥接网络是指容器通过桥接的方式将容器网卡桥接到宿主机的docker0网桥,然后在通过宿主机防火墙的NAT表实现与外网的联系。
宿主机docker0网桥
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 [root@k8s-master1 ~] docker0: flags =4163 <UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17 .0.1 netmask 255.255 .0.0 broadcast 172.17 .255.255 inet6 fe80::42 :c7ff:fe37:8 e8 prefixlen 64 scopeid 0 x20<link> ether 02 :42 :c7:37 :08 :e8 txqueuelen 0 (Ethernet) RX packets 6618 bytes 277975 (271.4 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8152 bytes 24675021 (23.5 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 .....省略了本机的网卡信息 vethf75a942: flags =4163 <UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::9085 :f5ff:fe34:77 b5 prefixlen 64 scopeid 0 x20<link> ether 92 :85 :f5:34 :77 :b5 txqueuelen 0 (Ethernet) RX packets 2850 bytes 158484 (154.7 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 3397 bytes 11613136 (11.0 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 如果想看更清楚一下 可以使用 ip add show命令 [root@k8s-master1 ~]4 : docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02 :42 :c7:37 :08 :e8 brd ff:ff:ff:ff:ff:ff inet 172.17 .0.1 /16 brd 172.17 .255.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42 :c7ff:fe37:8 e8/64 scope link valid_lft forever preferred_lft forever 容器网卡14 : vethf75a942@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 92 :85 :f5:34 :77 :b5 brd ff:ff:ff:ff:ff:ff link-netnsid 1 inet6 fe80::9085 :f5ff:fe34:77 b5/64 scope link valid_lft forever preferred_lft forever 注意: 这里的vethf75a942@if13指的就是容器网卡,V代表虚拟网卡的意思,eth 以太网卡,f75a942网卡编号,if13指的是宿主机网桥(docekr0)的一个端口,对应容器的网卡编号加一。 所以容器内的网卡编号应该是 eth0@if14 通过在容器中执行命令 ip add show 也可以看到 [root@k8s-master1 ~]1 : lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00 :00 :00 :00 :00 :00 brd 00 :00 :00 :00 :00 :00 inet 127.0 .0.1 /8 scope host lo valid_lft forever preferred_lft forever13 : eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02 :42 :ac:11 :00 :03 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17 .0.3 /16 brd 172.17 .255.255 scope global eth0 valid_lft forever preferred_lft forever
防火墙的NAT表内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [root@k8s-master1 ~]# iptables -t nat -L Chain PREROUTING (policy ACCEPT) target prot opt source destination DOCKER all -- anywhere anywhere ADDRTYPE match dst-type LOCAL Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination DOCKER all -- anywhere !loopback/8 ADDRTYPE match dst-type LOCAL Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 172.17 .0.0 /16 anywhere Chain DOCKER (2 references) target prot opt source destination RETURN all -- anywhere anywhere
docker0 与容器网卡桥接
1 2 3 4 通过brctl show命令可以看到容器网卡和docker0网卡的桥接信息 [root@k8s-master1 ~]bridge name bridge id STP enabled interfaces docker0 8000 .0242 c73708e8 no vethf75a942
创建一个网络为bridge类型的容器,不指定默认也是这个类型
1 [root@k8s-master1 ~] # docker run -d --network bridge --name centos1 baishuming2020/centos_nginx
host
容器和真机共用网卡及对应的端口,缺点就是同一个端口只能宿主机或者某个容器使用,其他容器不能用。
1 2 创建一个网络类型host的容器[root@k8s-master1 ~] # docker run -d --network host --name centos2 baishuming2020/centos_nginx
none
容器仅有lo网卡,是一个不能联网的本地容器
1 2 创建一个网络类型为lo的容器[root@k8s-master1 ~] # docker run -d --network none --name centos3 baishuming2020/centos_nginx
2.1、实现网桥网络
目的:不同的服务容器组应用不同的网桥,避免同一网络内容器太多,保持容器网络独立性。
关于新网桥联网问题:创建网桥后,宿主机会自动帮你做NAT,所以不用担心联网问题
查看网络-ls
1 2 3 4 5 6 7 8 9 10 11 12 [root@k8s - master1 ~ ]# docker network ls NETWORK ID NAME DRIVER SCOPE 80982 d2613cd bridge bridge local 40 c179ab420a docker1 bridge local 04 aadb7475c0 docker100 bridge local ce79e9d7525a host host local 8 f0358469e57 none null local NETWORK ID 网桥ID NAME 名称 DRIVER 网络类型 SCOPE 作用范围
创建网桥-create
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [root@k 8s-master1 ~]6 a410e27b66ea587142d967f7dff6f36c04ced3c27116a79831412f3743aba56 [root@k 8s-master1 ~] NETWORK ID NAME DRIVER SCOPE6 ee1e928b710 bridge bridge local ce79e9d7525a host host local 6 a410e27b66e mydocker0 bridge local 8 f0358469e57 none null local 修改docker网桥名字1 、关闭新建网桥 [root@k 8s-master1 ~]2 、修改名字 [root@k 8s-master1 ~]3 、启动网桥 [root@k 8s-master1 ~]4 、重启docker服务 [root@k 8s-master1 ~]
删除未使用的网桥-prune
1 2 3 4 5 [root@k8s-master1 ~] WARNING! This will remove all networks not used by at least one container. Are you sure you want to continue ? [y/N] y Deleted Networks: docker1
删除某个网桥-rm
1 2 3 4 5 [root@k8s -master1 ~]# docker network rm docker100 docker100 注意: 不能被活动容器占用
容器连接到网桥
前提是该容器是桥接网络
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [root@k8s-master1 ~] [root@k8s-master1 ~] eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet) RX packets 8 bytes 656 (656.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 发现centos1容器多了一块网卡,使用的正是docker1的网段 eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.2 netmask 255.255.255.0 broadcast 192.168.1.255 ether 02:42:c0:a8:01:02 txqueuelen 0 (Ethernet) RX packets 16 bytes 1312 (1.2 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
容器断开网桥
1 2 将centos1容器的网络从docker1网桥断开 [root@k8s-master1 ~]
常见故障
FAQ1:使用改名后的新网桥的容器可能无法解析域名
原因:没有配置新网桥的DNS
解决方法:为容器手动配置一个DNS地址即可
FAQ2:Networking will not work
1 2 3 4 5 6 7 8 9 10 [root@k8s-master1 ~]# docker run -d --network docker100 --name centos4 baishuming2020/centos_nginxWARNING: IPv4 forwarding is disabled. Networking will not work. 67f2c276123c993cd66b9d7a99ba22402331a13f9ea8817e57324a934896b805 解决方案 1、打开转发 [root@k8s-master1 ~]# echo "net.ipv4.ip_forward=1" >> /usr/lib/sysctl.d/00-system.conf 2、重启网络 [root@k8s-master1 ~]# systemctl restart network
三、不同主机间的容器通信
3.1、 macvlan
在 Docker 中,macvlan 是众多 Docker 网络模型中的一种,并且是一种跨主机的网络模型,作为一种驱动启用,Docker macvlan 只支持 bridge 模式
1 2 3 4 5 6 7 8 9 docker network create -d macvlan --subnet =172.16.10.0/24 --gateway =172.16.10.1 -o parent =ens224 mtacvlan-1 -o parent =网卡名称 指定用来给 macvlan 网络使用的物理网卡 注意,要在所有需要运行 macvlan 的主机上执行这条命令,但是要记得更改网关的地址,避免造成IP冲突 docker run -itd --network macvlan-1 centos /bin/bash
3.2、 overlay
在 Docker 中,overlay 是众多 Docker 网络模型中的一种,并且是一种跨主机的全局网络模型,有一个数据库专门的来存储网络分配信息,避免 IP 冲突,同时内部还有一个小型的 DNS 我们可以直接通过主机名进行访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 consul 服务端: docker run -itd -h consul -h 主机名 –name 容器名 –restart =always 重启策略 progrium/consul 镜像名称 -server 以服务节点启动 -bootstrap 预期的启动节点数:自举 在浏览器内输入 IP地址+端口号 可以看到 web 页面 在所有主机上编辑 daemon.json 文件: { "hosts": ["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"], 监听相关端口 "cluster-store":"consul://192.168.1.150:8500", 集群的主机地址 "cluster-advertise":"192.168.1.150:2375” 宣告自己的地址 } 重启 docker 服务 创建 overlay 网络(全局网络):一台主机上创建自动同步 docker network create -d overlay overlay-1 启动容器测试: docker run -it --name docker-1 --network=overlay-1 centos /bin/bash docker run -it --name docker-2 --network=overlay-1 centos /bin/bash 验证:ping docker-1
常见故障
如发现各容器内分配的ip之间相互ping不通
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 原因:可能由于防火墙问题引起的,默认forward链是drop状态,需要打开才可以 解决方案: 执行下面操作,保证INPUT FORWARD链都是ACCEPT状态 清除其他规则[ root@k8s -master1_node1 ~] [ root@k8s -master1_node1 ~] [ root@k8s -master1_node1 ~] [ root@k8s -master1_node1 ~] [ root@k8s -master1_node2 ~] [ root@k8s -master1_node2 ~] [ root@k8s -master1_node2 ~] [ root@k8s -master1_node2 ~]