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

如上文所示:
eth0与vethXXX配对vethXXX与docker0的链接与连接到交换机的机器相同但是docker0和宿主eth0之间的关系是什么呢?更具体而言:
问题2可能有点混乱,我将把它保留在这里,并解释得更多一点:
eth0。它是如何被转发到集装箱的?我的意思是,一定有什么地方可以储存这些信息,我该怎么查呢?提前感谢!
在阅读了答案和官方网络文章之后,我发现以下图表更加准确,即docker0和eth0没有直接链接,而是可以转发数据包:
http://dockerone.com/uploads/article/20150527/e84946a8e9df0ac6d109c35786ac4833.png
发布于 2016-05-31 06:27:20
默认docker0桥和主机以太网设备之间没有直接链接。如果对容器使用--net=host选项,那么主机网络堆栈将在容器中可用。
当数据包从容器流到docker0时,它如何知道它将被转发到eth0,然后转发到外部世界?
docker0桥具有分配给它的码头网络的.1地址,这通常是一个172.17或172.18左右的东西。
$ 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桥上。
$ bridge link
10: vethcece7e5 state UP @(null): <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master docker0 state forwarding priority 32 cost 2在默认Docker网络上创建的容器将接收.1地址作为其默认路由。
$ 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。
$ 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也不用于入站流量。我遇到了一些问题,试图将大量端口映射到容器中,这导致了映射真实世界接口完全进入容器。
发布于 2017-09-14 07:14:23
您可以通过网络接口从容器中检测到iflink和主机上的ifindex。
从容器中获取iflink:
$ docker exec ID cat /sys/class/net/eth0/iflink
17253然后在主机上的接口中找到这个ifindex:
$ grep -l 17253 /sys/class/net/veth*/ifindex
/sys/class/net/veth02455a1/ifindexhttps://stackoverflow.com/questions/37536687
复制相似问题