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

时间:2016-10-12 07:29:26

标签: 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=1 ttl=52 time=11.9 ms

所以显然我的主机eth0正在接收此ping,但是这个包如何转发到容器?有几个问题要问

  • eth0和docker0没有桥接,为什么docker0从eth0获取数据包?
  • 即使docker0获得了数据包,它如何在内部发送数据包到vth0?它内部维护一些地图,以便它可以将数据包转换到不同的mac地址之间吗?
  • iptables如何与此相关?

干杯。

2 个答案:

答案 0 :(得分:1)

Docker在这里没有做任何特别神奇的事情,你的问题并不是依赖于docker / related。

docker0只是一个网桥。创建此桥后(启动docker服务时),您可以假设新计算机(在此情况下为VM / docker形式)已加入您的网络。

当从主机ping对接器容器时,反之亦然,你基本上正在ping网络中的另一台机器。

关于docker,除非你已经创建了一个新的网络接口(我怀疑你正在ping eth0),你基本上是在ping你自己。

如果您将容器运行为:

docker run -i -t --rm -p 10.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容器。

答案 1 :(得分:0)

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

如果您使用以下代码列出Iptables / NAT规则:sudo iptables -t nat -L

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

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        anywhere

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