我试图了解桥接的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,但是这个包是如何被转发到容器的呢?有一些棘手的问题要问
干杯。
发布于 2016-10-12 16:45:24
Docker在这里没有做任何特别神奇的事情,你的问题也不是真正的码头依赖者/相关者。
docker0只是一座网络桥梁。一旦创建了这个桥(在启动对接服务时),您就可以假设一台新机器(在本例中是VM/docker表单)已经加入了您的网络。
当从主机或反之亦然地敲击码头容器时,您基本上是在您的网络中敲击另一台机器。
关于docker,除非您已经创建了一个新的网络接口(我对此表示怀疑,因为您正在点击eth0),否则您基本上就是在点击自己。
如果您将容器运行为:
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 run -i -t --rm -p --net=host ubuntu:16.04
然后,您说码头容器应该具有与主机相同的网络堆栈,所以所有要主机的数据包也将通过docker0桥到达您的码头容器。
发布于 2018-04-14 11:35:01
要回答您的问题,容器如何平一个外部主机,这也是通过NAT实现的。
如果您使用:sudo iptables -t nat -L列出您的Iptables / NAT规则
您可能会看到,类似于下面的内容(docker子网可能有所不同)
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 anywhere这基本上意味着NAT从码头子网发出的任何传出数据包。因此,传出的数据包似乎来自码头主机。当ping数据包返回时,NAT表将用于确定码头主机是否实际提出了请求,并将该数据包转发给码头veth。
https://stackoverflow.com/questions/39992858
复制相似问题