![Docker网络中bridge和veth的关系](https://linux22.com/image/219635/Docker%E7%BD%91%E7%BB%9C%E4%B8%ADbridge%E5%92%8Cveth%E7%9A%84%E5%85%B3%E7%B3%BB.png)
在我的 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
显然,这两个接口是相关的,因为第二个接口将第一个接口列为“主接口”。有什么关系?
这个问题的一些背景信息:我实际上有两个 Docker 网络,每个网络中都有一个容器。使用 iptables,我已经在它们之间设置NAT(或者,至少,我认为我已经做到了)并且正在尝试从一个容器对另一个容器进行 ping 操作。在主机上运行 Wireshark,我看到 ICMP 数据包从网桥接口进入并从 veth 接口(而不是另一个网桥)出去。
答案1
桥接设备是一个虚拟交换机。接口veth
是一条虚拟以太网电缆,将容器连接到“交换机”:当您创建 veth 设备时,您会获得两个接口; Docker 将一个接口放入容器内(即成为eth0
容器内的接口),设备的另一端连接到桥接器。
本文有关于 veth 设备的一些附加详细信息以及各种其他虚拟接口类型的总体概述。