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

Networking docker0桥在主机内部是如何工作的?,networking,docker,bridge,Networking,Docker,Bridge,我试图理解桥接docker0接口是如何工作的 当docker守护进程启动时,它会创建一个桥接设备docker0 当容器启动时,它会创建一个接口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

我试图理解桥接docker0接口是如何工作的

  • 当docker守护进程启动时,它会创建一个桥接设备docker0
  • 当容器启动时,它会创建一个接口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
只是一个网桥。一旦创建了此网桥(在启动docker服务时),您就可以假设一台新机器(在本例中为VM/docker形式)已加入您的网络

从主机ping docker容器或从主机ping docker容器时,基本上是在ping网络中的另一台机器

关于docker,除非您创建了一个新的网络接口(我对此表示怀疑,因为您正在ping
eth0
),否则您基本上是在ping自己

如果以以下方式运行容器:

docker run-i-t-rm-p10.0.0.99:80:8080 ubuntu:16.04

您正在告诉docker在iptables中创建一个NAT规则,以将任何前往
10.0.0.99:80
的数据包转发到端口
8080
上的docker容器

当您以以下方式运行容器时:

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


然后,您是说docker容器应该与主机具有相同的网络堆栈,因此所有发送到主机的数据包也将通过
docker0
网桥到达docker容器。

要回答您的问题,容器如何ping外部主机,这也是通过NAT实现的

如果您使用以下命令列出Iptables/NAT规则:
sudo Iptables-t NAT-L

您可能会看到类似于下面的内容(docker子网可能不同)


这基本上是指NAT从docker子网发出的任何传出数据包。因此,传出的数据包似乎来自docker主机。当ping数据包返回时,NAT表将用于确定docker主机是否确实发出了请求,并且数据包将转发给docker veth。

是的,我的问题不是docker。我仍在试图找出docker容器ping外部主机时发生了什么。在容器中,如果一个数据包想要伸出并返回,它如何通过主机接口并转换到docker容器中?
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        anywhere