docker0桥如何在主机内部工作?

我想了解桥接docker0接口如何工作。

  • 当docker守护进程启动时,它会创build一个桥接设备docker0;
  • 当容器启动时,它创build一个接口vthn并绑定到docker0

比方说,我们从容器内向外部主机发出一个ping命令

[root@f505f022eb5b app]# ping 130.49.40.130 PING 130.49.40.130 (130.49.40.130) 56(84) bytes of data. 64 bytes from 130.49.40.130: icmp_seq=1 ttl=52 time=11.9 ms 

所以我的主机eth0正在接收这个ping回来,但是这个包怎么被转发到容器? 有几个问题要问

  • eth0和docker0没有桥接,docker0怎么得到eth0的报文?
  • 即使docker0收到数据包,它是如何工作的内部发送数据包到vth0? 它是否在内部维护一些地图,以便它可以将数据包转换为不同的MAC地址?
  • iptables是如何与这里相关的?

干杯。

Docker在这里没有做任何特别神奇的事情,你的问题不是真正的docker依赖/相关。

docker0只是一个networking桥梁。 一旦这个桥被创build(在启动docker服务的时候),你可以假设一个新的机器(在这个例子中是一个VM / dockerforms)已经join了你的networking。

当从主机ping泊坞站容器,反之亦然,你基本上是ping你的networking内的另一台机器。

关于docker工人,除非你已经创build了一个新的networking接口(我很怀疑,因为你正在ping eth0 ),你基本上是在自我testing。

如果您运行容器为:

docker run -i -t --rm -p 10.0.0.99:80:8080 ubuntu:16.04

您正在告诉docker在iptables中创build一个NAT规则,将任何10.0.0.99:8010.0.0.99:80数据包10.0.0.99:80到端口8080上的docker容器。

当你运行容器为:

docker run -i -t --rm -p --net=host ubuntu:16.04

然后你说Docker容器应该和主机有相同的networking堆栈,所有到主机的数据包也会通过docker0桥到达你的docker0容器。