Docker容器间的网络通信

来源:互联网 发布:手机能做淘宝链接 编辑:程序博客网 时间:2024/06/06 03:30

Docker Network

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


  • Docker Network
    • 网络驱动
    • BRIDGE
      • 容器与外部的网络通信前提
      • 宿主机与容器的端口映射
    • 容器间的网络通信
      • 使用自己创建的NETWORK
      • 不同NETWORK间的容器通信
    • 容器DNS
      • 默认bridge网络
      • 用户创建的bridge网络
      • 网络层可见别名
    • 参考

网络驱动

  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

原创粉丝点击