我试图了解桥接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,但是这个包如何转发到容器?有几个问题要问
干杯。
答案 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。