在我的 Ubuntu 22.04 主机上,我使用网桥驱动程序创建了一个 Docker 网络,并在该网络中启动了一个容器。
在我的主机上运行ip addr
,我看到这两个界面:
5: br-fc7599764562: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:d4:4f:b9:39 brd ff:ff:ff:ff:ff:ff
inet 172.21.0.1/16 brd 172.21.255.255 scope global br-fc7599764562
valid_lft forever preferred_lft forever
inet6 fe80::42:d4ff:fe4f:b939/64 scope link
valid_lftforever preferred_lft forever
6: vethe6879a0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-fc7599764562 state UP group default
link/ether e2:e8:0f:5b:37:a0 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::e0e8:fff:fe5b:37a0/64 scope link
valid_lft forever preferred_lft forever
显然,这两个接口是相关的,因为第二个接口将第一个接口列为“master”。什么关系?
这个问题的一些背景:我实际上有两个 Docker 网络,每个网络中都有一个容器。使用 iptables,我在它们之间设置了 NAT(或者,至少,我认为我已经设置了),并试图从另一个容器 ping 一个容器。在主机上运行 Wireshark,我看到 ICMP 数据包从网桥接口传入并从 veth 接口(而不是其他网桥)传出。
网桥设备是一个虚拟交换机。接口
veth
是将容器连接到“交换机”的虚拟以太网电缆:当你创建一个 veth 设备时,你会得到两个接口;Docker 将一个接口放在容器内(成为eth0
容器中的接口),设备的另一端连接到网桥。这篇文章有一些关于 veth 设备的额外细节和各种其他虚拟接口类型的一般概述。