首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >docker0桥是如何在主机内部工作的?

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

Stack Overflow用户
提问于 2016-10-12 07:29:26
回答 2查看 1.6K关注 0票数 2

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

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

假设我们从容器内部向外部主机发出ping命令。

代码语言:javascript
复制
[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在这里有什么关系?

干杯。

EN

回答 2

Stack Overflow用户

发布于 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桥到达您的码头容器。

票数 2
EN

Stack Overflow用户

发布于 2018-04-14 11:35:01

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

如果您使用:sudo iptables -t nat -L列出您的Iptables / NAT规则

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

代码语言:javascript
复制
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        anywhere

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39992858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档