背景说明
Docker默认的网络模式为bridge使用的是docker0网桥。
[root@vm1 ~]# ip addr show docker0
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:12:26:57:fe brd ff:ff:ff:ff:ff:ff
inet 192.168.100.1/24 brd 192.168.100.255 scope global docker0
valid_lft forever preferred_lft forever
[root@vm1 ~]#
解决方案
容器视角
docker0对于运行在同一个主机上的各个容器来说,是二层交换机的角色:洪范,维护CAM表,在二层转发数据包;同时,docker0 自身也具有MAC地址,并且绑定了IP,因此在容器中还可以作为默认网关存在。
主机视角
物理交换机提供了由硬件实现的高效的背板通道,供连接在交换机上的主机高效实现二层通信;对于开启了三层协议的物理交换机而言,其ip路由的处理 也是由物理交换机管理程序提供的。
对于docker0而言,其负责处理二层交换机逻辑以及三层的处理程序其实就是宿主机上的Linux内核 tcp/ip协议栈程序。而从宿主机来看,所有docker0从veth(只是个二层的存在,没有绑定ipv4地址)接收到的数据包都会被宿主机看成从docker0这块网卡接收进来的数据包,尤其是在进入三层时,宿主机上的iptables就会 对docker0进来的数据包按照rules进行相应处理(通过一些内核网络设置也可以忽略docker0 brigde数据的处理)。
通过,docker0的网桥功能,可以实现在同一个主机上的各个容器之间的通信。