简单记录下容器间的网络通信。
网络驱动
- network drivers是docker提供容器间网络通信的基础。docker默认提供了两中驱动:bridge和overlay
docker network ls
指令会列出当前存在的网络- docker在安装完成后会自动创建三个网络
BRIDGE
宿主机中使用
ip addr show
查看网卡状况
docker0为宿主机中的虚拟网桥即为docker自动创建的bridge网络
bridge为docker运行容器(
docker run
)默认使用的网络
容器与外部的网络通信前提
- 保证宿主机开启了ip_forward功能
- 保证iptables的相关策略的设置,如地址伪装,NAT等
宿主机与容器的端口映射
docker run -itd -P --name mongoService mongo
,-P表示:容器暴露的端口将会映射到宿主机中的随机端口号,随机范围见:/proc/sys/net/ipv4/ip_local_port_range每当启动容器与外部网络的通信,docker都会建立响应的iptables规则。
iptables -L -n -t nat
查看规则
容器间的网络通信
容器间可以通过IP或容器名进行网络通信
使用自己创建的NETWORK
创建my_bridge网络:
docker network create -d bridge --subnet=10.0.0.0/24 my_bridge
运行使用my_bridge网络的容器
docker run -itd --network=my_bridge --ip=10.0.0.254 --name db busybox
不同NETWORK间的容器通信
docker run -itd --name=web busybox
,使用默认的bridge network- 将当前容器加入到需要与之通信的网络
docker network connect my_bridge web
- 网络结构
容器DNS
容器间如何通过别名进行网络通信?
默认bridge网络
-- 创建测试容器 docker run -itd --name c1 busybox docker run -itd --name c2 busybox
-- 进入容器c1内部 docker attach c1 / # ping c2 ping: bad address 'c2' -- 创建容器时指定link容器 docker run -itd --link c2:c2_alias --name c3 busybox -- 进入容器c3内部 docker attach c3 / # ping -w1 c2 PING c2 (172.17.0.4): 56 data bytes 64 bytes from 172.17.0.4: seq=0 ttl=64 time=0.083 ms / # ping -w1 c2_alias PING c2_alias (172.17.0.4): 56 data bytes 64 bytes from 172.17.0.4: seq=0 ttl=64 time=0.096 ms / # cat /etc/hosts #(容器别名相互耦合) 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.4 c2_alias 7e4850ad6320 c2 #通信原因 172.17.0.6 fe51353cb1e3 -- 进入容器c2内部 docker attach c2 / # ping c3 ping: bad address 'c3'
用户创建的bridge网络
-- 创建测试容器 docker run -itd --name c4 --net=my_bridge busybox docker run -itd --name c5 --net=my_bridge busybox -- 进入容器c4内部 docker attach c4 / # ping -w1 c5 #(自动创建DNS服务) PING c5 (10.0.0.3): 56 data bytes 64 bytes from 10.0.0.3: seq=0 ttl=64 time=0.066 ms
网络层可见别名
-- 创建测试容器 docker run -itd --name c7 --net=my_bridge --network-alias c7_net_alias busybox -- 进入容器c4内部 docker attach c4 / # ping -w1 c7_net_alias PING c7_net_alias (10.0.0.5): 56 data bytes 64 bytes from 10.0.0.5: seq=0 ttl=64 time=0.205 ms
参考
Mars will come to fear my botany skills. - Mark Watney