Docker容器间的通信 | 8lovelife's life
0%

Docker容器间的通信

简单记录下容器间的网络通信。

网络驱动

  1. network drivers是docker提供容器间网络通信的基础。docker默认提供了两中驱动:bridge和overlay
  2. docker network ls指令会列出当前存在的网络
  3. docker在安装完成后会自动创建三个网络
    这里写图片描述

BRIDGE

  1. 宿主机中使用ip addr show查看网卡状况
    这里写图片描述

  2. docker0为宿主机中的虚拟网桥即为docker自动创建的bridge网络

  3. bridge为docker运行容器(docker run)默认使用的网络

容器与外部的网络通信前提

  1. 保证宿主机开启了ip_forward功能
  2. 保证iptables的相关策略的设置,如地址伪装,NAT等

宿主机与容器的端口映射

  1. docker run -itd -P --name mongoService mongo,-P表示:容器暴露的端口将会映射到宿主机中的随机端口号,随机范围见:/proc/sys/net/ipv4/ip_local_port_range

  2. 每当启动容器与外部网络的通信,docker都会建立响应的iptables规则。iptables -L -n -t nat查看规则

容器间的网络通信

容器间可以通过IP或容器名进行网络通信

使用自己创建的NETWORK

  1. 创建my_bridge网络: docker network create -d bridge --subnet=10.0.0.0/24 my_bridge

  2. 运行使用my_bridge网络的容器 docker run -itd --network=my_bridge --ip=10.0.0.254 --name db busybox

不同NETWORK间的容器通信

  1. docker run -itd --name=web busybox,使用默认的bridge network
  2. 将当前容器加入到需要与之通信的网络 docker network connect my_bridge web
  3. 网络结构

这里写图片描述

容器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

参考

Docker v17.09

Mars will come to fear my botany skills. - Mark Watney

The Martian