Os contêineres do Docker não têm acesso à Internet até que o serviço de encaixe reinicie

4

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ê?

    
por Félix Sanz 30.06.2016 / 15:25

1 resposta

3

Meu mal. Eu não percebi que estava usando --internal . Auto-explicativo!

    
por 01.07.2016 / 23:20