Я создаю мост вручную с помощью этой команды:
docker network create --driver bridge --internal --subnet=172.20.0.0/24 br0
Затем я запускаю контейнеры, используя этот параметр моста --net=br0 --ip=172.20.0.x
.
Проблема в том, что у этих контейнеров нет доступа к Интернету, я даже не могу пинговать снаружи.
Настоящая проблема связана с iptables. Когда я перезагружаю сервер, iptables показывает мне некоторые правила, а у контейнеров нет доступа в Интернет.
Но когда я перезапускаю службу докеров, iptables имеет другие правила, а контейнеры ДОЛЖНЫ иметь доступ в Интернет.
Я вставлю здесь только различия между набором правил.
Когда я перезагружаю сервер, появляются следующие правила:
*filter
-A DOCKER-ISOLATION ! -s 172.20.0.0/24 -o br-aa4c507d3f06 -j DROP
-A DOCKER-ISOLATION ! -d 172.20.0.0/24 -i br-aa4c507d3f06 -j DROP
COMMIT
Когда я перезапускаю службу Docker, эти 2 правила исчезают, и вместо этого я вижу следующее:
*filter
-A FORWARD -o br-aa4c507d3f06 -j DOCKER
-A FORWARD -o br-aa4c507d3f06 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i br-aa4c507d3f06 ! -o br-aa4c507d3f06 -j ACCEPT
-A FORWARD -i br-aa4c507d3f06 -o br-aa4c507d3f06 -j ACCEPT
-A DOCKER-ISOLATION -i br-aa4c507d3f06 -o docker0 -j DROP
-A DOCKER-ISOLATION -i docker0 -o br-aa4c507d3f06 -j DROP
COMMIT
&
*nat
-A POSTROUTING -s 172.20.0.0/24 ! -o br-aa4c507d3f06 -j MASQUERADE
-A DOCKER -i br-aa4c507d3f06 -j RETURN
COMMIT
Итак, добавление их вручную, вероятно, плохая идея, и я хотел бы, чтобы это работало так, как должно.
Почему мне нужно перезапустить службу докеров только для того, чтобы загрузить правила iptables, которые позволяют контейнерам использовать Интернет?
Как я могу это исправить?
Создание моста должно изменить правила iptables, и мне не нужно перезапускать службу Docker только для этого, верно?
РЕДАКТИРОВАТЬ:
Я заметил, что создание моста ТОЛЬКО добавляет эти правила в iptables:
-A DOCKER-ISOLATION ! -s 172.20.0.0/24 -o br-aa4c507d3f06 -j DROP
-A DOCKER-ISOLATION ! -d 172.20.0.0/24 -i br-aa4c507d3f06 -j DROP
Так, похоже, после создания моста мне нужно перезапустить докер? Зачем?
Виноват. Я не заметил, что использовал --internal
. Понятно!