首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >docker0和eth0之间的关系是什么?

docker0和eth0之间的关系是什么?
EN

Stack Overflow用户
提问于 2016-05-31 04:11:06
回答 2查看 35.3K关注 0票数 48

默认情况下,我知道docker创建一个虚拟桥docker0,并且所有容器网络都链接到docker0

如上文所示:

  • 容器eth0vethXXX配对
  • vethXXXdocker0的链接与连接到交换机的机器相同

但是docker0和宿主eth0之间的关系是什么呢?更具体而言:

  1. 当数据包从容器流到docker0时,它如何知道它将被转发到eth0,然后转发到外部世界?
  2. 当一个外部包到达eth0时,为什么它被转发到docker0然后容器?而不是处理它还是删除它?

问题2可能有点混乱,我将把它保留在这里,并解释得更多一点:

  • 它是一个由容器初始化的返回包(在问题1中):由于外部不知道容器网络,该数据包被发送到主机eth0。它是如何被转发到集装箱的?我的意思是,一定有什么地方可以储存这些信息,我该怎么查呢?

提前感谢!

在阅读了答案和官方网络文章之后,我发现以下图表更加准确,即docker0eth0没有直接链接,而是可以转发数据包:

http://dockerone.com/uploads/article/20150527/e84946a8e9df0ac6d109c35786ac4833.png

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-31 06:27:20

默认docker0桥和主机以太网设备之间没有直接链接。如果对容器使用--net=host选项,那么主机网络堆栈将在容器中可用。

当数据包从容器流到docker0时,它如何知道它将被转发到eth0,然后转发到外部世界?

docker0桥具有分配给它的码头网络的.1地址,这通常是一个172.17或172.18左右的东西。

代码语言:javascript
复制
$ ip address show dev docker0
8: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:03:47:33:c1 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever

容器被分配一个veth接口,该接口连接到docker0桥上。

代码语言:javascript
复制
$ bridge link
10: vethcece7e5 state UP @(null): <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master docker0 state forwarding priority 32 cost 2

在默认Docker网络上创建的容器将接收.1地址作为其默认路由。

代码语言:javascript
复制
$ docker run busybox ip route show
default via 172.17.0.1 dev eth0 
172.17.0.0/16 dev eth0  src 172.17.0.3 

Docker使用NAT伪装从那里进行出站通信,它将遵循主机上的标准出站路由,这可能涉及也可能不涉及eth0

代码语言:javascript
复制
$ iptables -t nat -vnL POSTROUTING
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0  

iptables处理连接跟踪和返回流量。

当一个外部包到达eth0时,为什么它被转发到docker0然后容器?而不是处理还是放弃?

如果您询问来自容器的出站流量的返回路径,请参见上面的iptables,因为MASQUERADE将映射该连接。

如果您指的是新的入站通信量,默认情况下数据包不会转发到容器中。实现这一目标的标准方法是设置端口映射。Docker启动一个守护进程,它侦听端口X上的主机,并转发到端口Y上的容器。

我不知道为什么NAT也不用于入站流量。我遇到了一些问题,试图将大量端口映射到容器中,这导致了映射真实世界接口完全进入容器。

票数 47
EN

Stack Overflow用户

发布于 2017-09-14 07:14:23

您可以通过网络接口从容器中检测到iflink和主机上的ifindex

从容器中获取iflink

代码语言:javascript
复制
$ docker exec ID cat /sys/class/net/eth0/iflink

17253

然后在主机上的接口中找到这个ifindex

代码语言:javascript
复制
$ grep -l 17253 /sys/class/net/veth*/ifindex

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

https://stackoverflow.com/questions/37536687

复制
相关文章

相似问题

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