Como configurar corretamente o Docker de rede no Ubuntu Gnome 15.10

7

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

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 receberá apenas um endereço ipv6 e nenhuma conexão de rede será possível do contêiner, até onde eu saiba. Não consigo fazer o ping do IP do host, IPs da LAN ou IPs da Internet. Eu estou usando o Ubuntu: imagem confiável e executando o bash como 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á como 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 eu reiniciar minha máquina, ou provavelmente hackear um script de inicialização para fazer isso por mim (eu não tentei). Alguém sabe de uma maneira clean para corrigir isso?

    
por marcv81 28.10.2015 / 16:34

2 respostas

7

TL; DR: Eu tinha instalado o Docker usando o "apt-get install docker.io". A instalação da versão mais recente após o link corrige o problema.

Após investigar o problema, parece que a versão do Docker no 15.10 não pode criar e inicializar corretamente a interface docker0. Na primeira execução (inicialização da estação de serviço), ela criará a interface, mas falhará ao inicializá-la e, na execução subseqüente (reinicialização da estação de serviço), ela será inicializada. Isso pode ser reproduzido consistentemente adicionando e excluindo a interface manualmente com brctl. Este bug foi corrigido no Docker mais recente.

    
por marcv81 29.10.2015 / 08:12
1

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

Para interromper o funcionamento do NetworkManager, adicione

iface docker0 inet manual

para /etc/network/interfaces , assumindo NetworkManager.conf ,

[ifupdown] managed=false

que é o padrão em 15.10

(o bug provavelmente deve ser levantado para impedir que o NetworkManager interfira em interfaces específicas do docker)

    
por greg one 11.12.2015 / 14:21