发布时间:2024-11-12 人气:77次
Docker网络模式
前面用的容器间通信方式:link,但是link有局限性,是单向的。目前的架构Wordpress还好,但若是需要双向的通信呢?比如zabbix 服务端需要连客户端,客户端也需要连服务端。
桥接模式
创建一个容器,默认就桥接模式。所创建容器的IP与宿主机docker 0网卡是桥接的,所以都在同一网段。
## 查看docker的网络模式[root@docker01 ~]# docker network lsNETWORK ID NAME DRIVER SCOPE26e92ba33e52 bridge bridge local95d934d84d9e host host locald5ffe092a454 none null local
## 查看详细信息(docker inspect既可以看镜像和容器,也可以看网络)[root@docker01 ~]# docker inspect bridge...
## 查看桥接网卡信息[root@docker01 ~]# yum install -y bridge-utils[root@docker01 ~]# brctl show //查看桥接网卡有哪些。bridge namebridge idSTP enabledinterfacesdocker08000.024220d487a4no veth0ca285c vethc81af12 ## docker常用网络工具镜像:busybox[root@docker01 ~]# docker pull busybox[root@docker01 ~]# docker run -it busybox /bin/sh/ # ifconfig比如起第一个是172.17.0.5,再起一个就是172.17.0.6/ # ping 172.17.0.4、6都是通的
如何修改桥接网卡网段(比如公司要求容器都跑在某个网段)
# 方法一:修改docker启动脚本[root@docker01 ~]# vim /usr/lib/systemd/system/docker.service...ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --bip=192.168.1.1/24
dockerd --help 可以看一眼--bip就是bridge ip,比如--bip=192.168.1.1是docker 0的IP地址
[root@docker01 ~]# systemctl daemon-reload[root@docker01 ~]# systemctl restart docker
看一下,已改为192.168.1.1[root@docker01 ~]# ifconfigdocker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::42:87ff:fe26:c6c0 prefixlen 64 scopeid 0x20<link> ether 02:42:87:26:c6:c0 txqueuelen 0 (Ethernet) RX packets 266260 bytes 17590018 (16.7 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 365156 bytes 210130583 (200.3 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@docker01 ~]# docker run -it busybox /bin/sh/ # ip a114: eth0@if115: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:c0:a8:01:02 brd ff:ff:ff:ff:ff:ff inet 192.168.1.2/24 brd 192.168.1.255 scope global eth0 valid_lft forever preferred_lft forever
# 方法二:修改docker配置文件[root@docker02 ~]# vim /etc/docker/daemon.json{ "bip": "192.168.10.1/24", #加上这一行,json格式的。 "registry-mirrors": ["https://pgz00k39.mirror.aliyuncs.com"]}[root@docker01 ~]# systemctl daemon-reload[root@docker01 ~]# systemctl restart docker[root@docker01 ~]# ifconfig //看一下,已变为192.168.10.1docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 192.168.10.1 netmask 255.255.255.0 broadcast 192.168.10.255 [root@docker01 ~]# docker run -it busybox /bin/sh/ # ifconfigeth0 Link encap:Ethernet HWaddr 02:42:C0:A8:0A:02 inet addr:192.168.10.2 Bcast:192.168.10.255 Mask:255.255.255.0
共享主机模式HOST
相当于VM里面的仅主机,是与宿主机共享网卡。namespace不做网卡隔离。
--network=host。性能最高。
[root@docker01 ~]# docker run -it --network=host busybox /bin/sh看下,与宿主机一毛一样;再起一个也是一样。所有宿主机网卡都被共享进来,起多少容器IP都一样,所以用的少。
容器模式Container
与另一运行的容器共享网络,几个容器都是同样网卡。
K8s用的就是这个模式 --network=container:containerID
无网络模式None
不为容器配置任何网络功能,就你起的容器没有网。没啥卵用。
--net=none
[root@docker01 ~]# docker run -it --network=none busybox /bin/sh (仅有本机回环地址)/ # ifconfiglo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
自定义网络模式
先创建网络模式,启动容器的时候指定即可。
相当于划分网段
比如我有3个项目,每个项目20台服务器。前面20台一个网段可以互通,再20台在另一个网段,不能与前面的互通。
## 创建网络模式的语法(可任选上面4种除了none以外的模式)docker network create -d <mode> --subnet <CIDR> --gateway <网关> <自定义网路名称>-d <mode> 指定模式--subnet <CIDR> :子网
## 比如先创建个桥接王者农药项目所有机器的网络[root@docker01 ~]# docker network create -d bridge --subnet 172.16.10.0/24 --gateway 172.16.10.1 wzry_net569523ef0a1a8297e5a78c907959b5d4b0a2f31af1635ceab33373040a977abf[root@docker01 ~]# docker network lsNETWORK ID NAME DRIVER SCOPE2247958d209d bridge bridge localfd205709680c harbor_harbor bridge locald525d5850de6 host host local62adafdbdc95 none null local569523ef0a1a wzry_net bridge local #这个
[root@docker01 ~]# docker run -it --network=wzry_net busybox /bin/sh/ # ifconfigeth0 Link encap:Ethernet HWaddr 02:42:AC:10:0A:02 inet addr:172.16.10.2 Bcast:172.16.10.255 Mask:255.255.255.0...
[root@docker01 ~]# docker run -it --network=wzry_net busybox /bin/sh/ # ifconfigeth0 Link encap:Ethernet HWaddr 02:42:AC:10:0A:03 inet addr:172.16.10.3 Bcast:172.16.10.255 Mask:255.255.255.0
## 其他项目:比如再创建个桥接的lol项目[root@docker01 ~]# docker network create -d bridge --subnet 172.16.11.0/24 --gateway 172.16.11.1 lol_net
[root@docker01 ~]# docker run -it --network=lol_net busybox /bin/sh/ # ifconfigeth0 Link encap:Ethernet HWaddr 02:42:AC:10:0B:02 inet addr:172.16.11.2 Bcast:172.16.11.255 Mask:255.255.255.0[root@docker01 ~]# docker run -it --network=lol_net busybox /bin/sh/ # ifconfigeth0 Link encap:Ethernet HWaddr 02:42:AC:10:0B:02 inet addr:172.16.11.3 Bcast:172.16.11.255 Mask:255.255.255.0/ # ifconfig ping 172.16.11.2 通/ # ifconfig ping 172.16.10.2 不通## 通信测试:相同网络模式之间的容器可以互通