Когда я смотрю на 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-адресом.