Como configurar de forma limpa o Docker de rede no Ubuntu Gnome 15.10

Como configurar de forma limpa o Docker de rede no Ubuntu Gnome 15.10

No Ubuntu Gnome 15.10, o Docker quase funciona imediatamente, mas há uma sutileza. Os contêineres parecem não conseguir acessar a rede até que eu reinicie o serviço docker.

Após inicializar o host, a interface docker0 não possui nenhum endereço IP.

$ ifconfig docker0
docker0   Link encap:Ethernet  HWaddr ea:03:cc:9c:7a:cd
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:108 (108.0 B)

Se eu iniciar um contêiner, a interface docker0 obterá apenas um endereço ipv6 e nenhuma conexão de rede será possível a partir do contêiner, pelo que eu saiba. Não consigo executar ping no IP do host, nos IPs da LAN ou nos IPs da Internet. Estou usando a imagem ubuntu:trusty e executando o bash como o processo principal do contêiner.

$ ifconfig docker0 
docker0   Link encap:Ethernet  HWaddr 00:00:00:00:00:00
          inet6 addr: fe80::7801:6eff:fe86:6dd8/64 Scope:Link
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:14 errors:0 dropped:0 overruns:0 frame:0
          TX packets:25 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:704 (704.0 B)  TX bytes:3917 (3.9 KB)

Se eu reiniciar o docker, o docker0 obterá um endereço ipv4 (além do endereço ipv6) e tudo funcionará conforme o esperado.

$ sudo service docker restart 
$ ifconfig docker0
docker0   Link encap:Ethernet  HWaddr 00:00:00:00:00:00
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::7801:6eff:fe86:6dd8/64 Scope:Link
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:14 errors:0 dropped:0 overruns:0 frame:0
          TX packets:25 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:704 (704.0 B)  TX bytes:3917 (3.9 KB)

É claro que posso reiniciar o serviço docker toda vez que reiniciar minha máquina ou provavelmente hackear um script de inicialização para fazer isso por mim (não tentei). Alguém sabe de umlimparmaneira de consertar isso?

Responder1

DR: instalei o Docker usando "apt-get install docker.io". Instalando a versão mais recente a seguirhttps://docs.docker.com/installation/ubuntulinux/corrige o problema.

Depois de investigar o problema, parece que a versão do Docker em 15.10 não consegue criar e inicializar a interface docker0 corretamente. Na primeira execução (service docker start) ele criará a interface, mas não conseguirá inicializá-la, e na execução subsequente (service docker restart) ele a inicializará. Isso pode ser reproduzido de forma consistente adicionando e excluindo a interface manualmente com brctl. Este bug foi corrigido no Docker mais recente.

Responder2

Para mim é o NetworkManager que bagunça. O serviço Docker cria uma ponte como deveria e depois a expõe no dbus. O NetworkManager começa a ver a nova interface no dbus e tenta configurá-la (já que é estúpido o suficiente saber que a ponte docker0 já está configurada corretamente). Às vezes, o NetworkManager consegue configurar (reconfigurar) o docker0, mas às vezes falha. Então, às vezes você reinicia a caixa e o docker0 terá o IP atribuído, outras vezes não.

Para impedir que o NetworkManager estrague, adicione

iface docker0 inet manual

assumir /etc/network/interfacesque NetworkManager.conftem

[ifupdown] managed=false

que é o padrão em 15.10

(o bug provavelmente deve ser gerado para impedir que o NetworkManager bagunce as interfaces específicas do docker)

informação relacionada