在了解了docker的一般使用规则之后,笔者再次较为深入的研究了docker的桥接模式
桥接模式工作原理
在我们创建docker应用之后,docker会自动在我们的宿主机上生成一个docker0的网卡,可以认为该网卡是所有docker容器的管理网卡,然后一般会为这个网卡生成一个内网IP地址,并且在之后容器的创建中为容器分配该网段的地址。
桥接模式具体工作流程
桥接模式网络拓扑图:
在每个容器创建之后,docker会为容器自动分配一对虚拟网卡,veth pair设备。该设备会桥接到docker0的网卡上,类似于OVS的交换机原理。在这个通道中进行所有的信息传输。 一般为容器分配的网卡为eth0,主机分配的网卡为veth*。容器在桥接模式下创建成功之后,我们在宿主机上ifconfig
命令就可以看到了。
通信流程
现在我们大致知道了,是在怎样的虚拟网卡中开始我们的通信。然后就是具体的通信流程。
-
容器发包 假设我们的容器需要ping谷歌的IP地址,是怎么做到的那? 首先,在我们的容器中除了有网卡eth0,然后会在我们的容器中生成默认路由,到主机docker0.ICMP包根据默认路由到达docker0.docker0再将IP包发到宿主机的网卡上,最终将包转发出去。所有容器对外都是不可见的。感觉这个包就是宿主机自己发出去的一样。
-
容器收包 在知道了容器如何发包之后,简单理解一下容器是如何收包的。 在桥接模式下,所有的容器都需要端口映射,比如。我将容器的80端口映射到主机的8080端口。可以简单的理解,容器对外而言就只是宿主机的一个端口。当一个包到达宿主机8080端口之后,宿主机就知道这个包应该发到容器中去,所以将包发给docker0。再由docker0将包发到容器里面做出相应的措施。