Meu mal. Eu não percebi que estava usando --internal
. Auto-explicativo!
Estou criando uma bridge manualmente, com este comando:
docker network create --driver bridge --internal --subnet=172.20.0.0/24 br0
Em seguida, inicio contêineres usando esse parâmetro de ponte --net=br0 --ip=172.20.0.x
.
O problema é que esses contêineres não têm acesso à Internet, eu nem consigo pingar para o lado de fora.
O problema real está relacionado com o iptables. Quando eu reinicio o servidor, o iptables me mostra algumas regras e os containers não têm acesso à Internet.
Mas quando eu reinicio o serviço docker, o iptables tem regras diferentes e os containers NÃO têm acesso à Internet.
Vou colar aqui apenas as diferenças entre o conjunto de regras.
Quando eu reinicializo o servidor, essas regras aparecem:
*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
Quando reinicio o serviço docker, essas duas regras desaparecem e vejo isso:
*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
e
*nat
-A POSTROUTING -s 172.20.0.0/24 ! -o br-aa4c507d3f06 -j MASQUERADE
-A DOCKER -i br-aa4c507d3f06 -j RETURN
COMMIT
Então, adicioná-los manualmente provavelmente é uma má ideia e eu gostaria de ter isso funcionando como deveria.
Por que preciso reiniciar o serviço docker apenas para carregar as regras do iptables que permitem que os contêineres usem a Internet?
Como posso consertar isso?
A criação da ponte deve modificar as regras do iptables e eu não deveria ter que reiniciar o serviço do docker apenas para isso, certo?
EDITAR:
Eu notei que a criação da ponte SÓ adiciona essas regras ao 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
Então parece que após a criação da ponte, eu tenho que reiniciar o docker? por quê?