gpt4 book ai didi

networking - docker0 网桥如何在主机内部工作?

转载 作者:行者123 更新时间:2023-12-02 18:23:45 24 4
gpt4 key购买 nike

我正在尝试了解桥接 docker0 接口(interface)的工作原理。

  • 当 docker 守护进程启动时,它会创建一个桥接设备 docker0;
  • 当一个容器启动时,它会创建一个接口(interface)vthn并绑定(bind)到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,但是这个包是如何转发到容器的呢?有几个问题要问

  • eth0 和 docker0 没有桥接,docker0 怎么从 eth0 拿数据包?
  • 即使 docker0 收到数据包,它如何在内部将数据包发送到 vth0?它是否在内部维护一些映射,以便它可以在不同的 mac 地址之间转换数据包?
  • iptables 在这里有什么关系?

干杯。

最佳答案

Docker 在这里没有做任何特别神奇的事情,你的问题并不是真正依赖于 docker/相关。

docker0 只是一个网桥。一旦创建了这个网桥(在启动 docker 服务时),您就可以假设一台新机器(在本例中为 VM/docker 形式)已加入您的网络。

当从主机 ping docker 容器时,反之亦然,您基本上是在 ping 网络中的另一台机器。

关于 docker,除非您创建了一个新的网络接口(interface)(我对此表示怀疑,因为您正在 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 容器。

关于networking - docker0 网桥如何在主机内部工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39992858/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com