当我查看时docker_gwbridge
,我发现该主机上的所有容器都是桥的成员。
bridge name bridge id STP enabled interfaces
docker_gwbridge 8000.0242e581b3f5 no veth0987748
veth21aa5ea
veth358d367
veth473e3a5
vetha199713
vethf482f5f
vethf4ceab6
但是,主机上的物理接口怎么会不是该网桥的成员呢?文档将此网络描述为离开 Docker 群集的流量的出口桥。也就是说,流量最有可能离开主机。docker_gwbridge
当没有物理接口参与桥接时,什么机制可以确保进入(来自任何给定容器)的数据包最终通过物理接口离开主机?
答案1
Docker 使用的机制是 iptables。Docker 添加 iptables 规则,以便转发来自 docker_gwbridge 的数据包,然后在将流量发送到外界时进行 natted(伪装)。
以下是docker network inspect docker_gwbridge
[
{
"Name": "docker_gwbridge",
...
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.20.0.0/16",
"Gateway": "172.20.0.1"
}
]
},
...
"Options": {
"com.docker.network.bridge.enable_icc": "false",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.name": "docker_gwbridge"
},
"Labels": {}
}
]
您可以看到docker使用172.20.0.0/16网络,并且com.docker.network.bridge.enable_ip_masquerade设置为true。
Docker 创建以下规则:
- MASQUERADE all -- 172.20.0.0/16 任何地方(在表 nat 中)
- 接受所有 -- docker_gwbridge !docker_gwbridge 任何地方任何地方(在前向链中)
因此,尽管没有物理接口连接到网桥,但该网桥中的流量被允许路由/转发,并且由于它被设置为 nat(伪装),因此流量将被放置在与 nat 地址关联的物理接口上。