Docker网络原理
Docker 网络原理
Bridge模式
1 第一次启动时,网络变化
- 在centos上执行
ifconfig
可见:
创建了一个虚拟网卡docker0:
- ip为172.17.0.1。
- netmask255.255.0.0。
- 执行
route -n
可见:
- 目标位172.17.0.0/16的地址由docker0网卡转发。
2 运行一个容器,网络变化
- 在容器中执行
ifconfig
可见:- lo,回环网卡。
- eth0,通信网卡,ip 172.17.0.2与docker0在同一网段。
- 在容器中执行
netstat -rn
可见:
容器的默认网关是172.17.0.1,即docker0网卡。 - 在宿主机执行
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局限性。
目前没有太好的跨主机支持.