安装完了Flanned,按道理来讲,网络应该是通的但是我的服务器就是不通,当时就据花疼了,后来发现,是自己容器的宿主机之间,防火墙搞的鬼,做法是将防火墙关闭

1、Flanned网络原理

数据从源容器中发出后,经由所在主机的docker0虚拟网卡转发到flannel0虚拟网卡,这是个P2P的虚拟网卡,flanneld服务监听在网卡的另外一端。

源主机的flanneld服务将原本的数据内容UDP封装后根据自己的路由表投递给目的节点的flanneld服务,数据到达以后被解包,然后直接进入目的节点的flannel0虚拟网卡,然后被转发到目的主机的docker0虚拟网卡,最后就像本机容器通信一下的有docker0路由到达目标容器。

Docker之Flanned容器网络不通-yellowcong_其他

Flanned做的就是将数据的包进行封装,然后解包操作,原始数据是在起始节点的Flannel服务上进行UDP封装的,投递到目的节点后就被另一端的Flannel服务还原成了原始的数据包,两边的Docker服务都感觉不到这个过程的存在。

Docker之Flanned容器网络不通-yellowcong_flanned_02

2、查看路由规则

目标容器地址(172.17.8.2)
Docker之Flanned容器网络不通-yellowcong_数据_03

本机容器地址(172.17.45.2)
Docker之Flanned容器网络不通-yellowcong_其他_04

route -n

可以看到,网络先进过我自己本机的网络,发现不匹配,后走了172.17.0.0/16网段(flannel0)

例如现在有一个数据包要从IP为172.17.45.2(本机)的容器发到IP为172.17.8.2(目标)的容器。根据数据发送节点的路由表,它只与172.17.0.0/16匹配这条记录匹配,因此数据从docker0出来以后就被投递到了flannel0。同理在目标节点,由于投递的地址是一个容器,因此目的地址一定会落在docker0对于的172.17.8.0/24(目标)这个记录上,自然的被投递到了docker0网卡。

Docker之Flanned容器网络不通-yellowcong_docker_05

3、网络访问

本机是172.17.45.0/24网段,访问 172.17.8.0/24网段 成功(我把目标主机的防火墙关闭了)

service iptables stop

Docker之Flanned容器网络不通-yellowcong_docker_06

打开了目标宿主机的防火墙,就完犊子了

service iptables restart 

Docker之Flanned容器网络不通-yellowcong_其他_07

4、修改防火墙

//TODO 这个地方,我也不知道咋该规则,改了也没用,非常蛋疼啊,解决方案只能是关闭防火墙了,以后有方法了,在写出来吧。。