揭秘 docker 桥接网络

问题描述 投票:0回答:0

下图展示了我的网络配置。我正在根据 Docker 的 bridge 网络教程 启动一个 alpine 容器,并使用 ping/traceroute 来尝试了解发生了什么。有些事情我认为我明白了,但有些事情我仍然很困惑。任何见解表示赞赏! (这里的主机都是Ubuntu机器)。

以下是我尝试过的一些事情以及我的解释/问题:

  • 从M1
$ ping 172.17.0.2
<no response>

我认为这是一个通用的路由问题。数据包到达 eth0,但该主机不知道如何将其路由到不同的子网。也许我可以使用 iptables 规则来完成这项工作?

  • 来自 Docker 主机
$ traceroute 172.17.0.2
<single hop gets to destination>

$ traceroute -i eth0 172.17.0.2
1 _gateway (192.168.0.1)
2 * * *
...

我实际上并不完全确定traceroute是否具有多个接口,但也许它会尝试所有接口?第二个示例有点道理,因为强制数据包从该接口发出并到达网关,但随后什么也没有发生,因为我们没有返回的路由。

  • 来自 Docker 容器
$ traceroute 192.168.0.10
1 192.168.0.10

$ traceroute <M1's IP>
1 172.17.0.1
2 <M1's IP>

$ traceroute <M2's IP>
1 172.17.0.1
2 <M2's IP>

$ traceroute google.com
1 172.17.0.1
2 192.168.0.1
<bunch of hops out on the internet>

那么在第一种情况下,为什么我可以一跳到达docker主机呢?这是因为 docker0 是主机的桥接接口吗?

在第二/第三/第四种情况下,为什么访问某个子网(或互联网)上的机器会在 docker0 而不是 eth0 或 eth1 上跳转?

对于第四种情况,该数据包如何知道它必须从 eth0 发出? (可能不是 Docker 问题)

最后,Docker iptables 规则是否会在这些场景中发挥作用?我想可能是从 docker 容器到本地子网/互联网的数据包必须返回时的伪装规则?

docker docker-networking
© www.soinside.com 2019 - 2024. All rights reserved.