Когда я смотрю на docker_gwbridge
, Я вижу, что все контейнеры на этом хосте являются членами моста.
bridge name bridge id STP enabled interfaces
docker_gwbridge 8000.0242e581b3f5 no veth0987748
veth21aa5ea
veth358d367
veth473e3a5
vetha199713
vethf482f5f
vethf4ceab6
Однако как может случиться так, что физический интерфейс на хосте не является членом этого моста? Документация описывает эту сеть как выходной мост для трафика, покидающего кластер Docker Swarm. То есть трафик, который, скорее всего, уйдет с хоста. Какой механизм обеспечивает попадание пакетов в docker_gwbridge
(из любого заданного контейнера) в конечном итоге покидает хост на физическом интерфейсе, когда в мосте не участвует физический интерфейс?
Docker использует механизм iptables. Правила Iptables добавляются Docker, поэтому пакеты из docker_gwbridge перенаправляются, а затем обрабатываются (маскируются), когда трафик отправляется во внешний мир.
Вот выдержка из вывода 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": {}
}
]
Вы можете видеть, что докер использует сеть 172.20.0.0/16 и что com.docker.network.bridge.enable_ip_masquerade имеет значение true.
Docker создает следующие правила:
Таким образом, хотя к мосту не подключены физические интерфейсы, трафик в этом мосте может быть маршрутизирован / перенаправлен, и, поскольку он настроен на natted (маскарад), трафик будет передаваться на физический интерфейс, связанный с адресом nat.