Docker 网络原理

Bridge模式

1 第一次启动时,网络变化

  1. 在centos上执行ifconfig可见:
    创建了一个虚拟网卡docker0:
    • ip为172.17.0.1。
    • netmask255.255.0.0。
  2. 执行route -n可见:
    • 目标位172.17.0.0/16的地址由docker0网卡转发。

2 运行一个容器,网络变化

  1. 在容器中执行ifconfig可见:
    • lo,回环网卡。
    • eth0,通信网卡,ip 172.17.0.2与docker0在同一网段。
  2. 在容器中执行netstat -rn可见:
    容器的默认网关是172.17.0.1,即docker0网卡。
  3. 在宿主机执行ifconfig可见: 多了一条以veth开头的网卡。即我们在linux网络重的veth设备,而veth的另一个设备即是容器的eth0。

3 查看网桥

在宿主机运行brctl show可见: docker0是一条网桥,连接了veth设备的两边,配置了一个ip。所以容器可以与外界通信。

4 查看iptables

4.0 docker启动,但容器未启动时,或容器未开启端口映射

执行iptables-save
可见NAT表:

-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

参数含义:

 -s  :源地址172.17.0.0/16  
 ! -o:指定数据报文流出接口不是docker0
 -j :动作为MASQUERADE(地址伪装)

也就是说当从docker网络发出的数据目标地址不是docker0即外网时,做SNAT转换。

Filter表:

-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

目标地址是docker0 连接状态是以前连接好的,可以直接通过。

-A FORWARD -i docker0 ! -o docker0 -j ACCEP

从dokcer网络发出,重定向到非doker网络是可以的。即允许docker访问外网

-A FORWARD -i docker0 -o docker0 -j ACCEPT

表示容器可以相互访问。

4.1 容器开始端口映射9091:9095

执行iptables-save。 NAT表不同:

-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 9095 -j MASQUERADE
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 9091 -j DNAT --to-destination 172.17.0.2:9095

通过DNAT转换,将访问宿主机9091端口的流量转到docker Filter表不同:

-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 9095 -j ACCEPT

目的地址是172.17.0.2,端口是9095的外部数据可以通过

Docker局限性。

目前没有太好的跨主机支持.