web-dev-qa-db-fra.com

Comment configurer proprement le réseau Docker dans Ubuntu Gnome 15.10

Dans Ubuntu Gnome 15.10, Docker fonctionne quasiment sans problème, mais il y a une subtilité. Les conteneurs ne semblent pas pouvoir accéder au réseau tant que je n'ai pas redémarré le service Docker.

Après l’amorçage de l’hôte, l’interface docker0 ne possède aucune adresse 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)

Si je lance ensuite un conteneur, l'interface docker0 ne reçoit qu'une adresse ipv6 et aucune connexion réseau n'est possible à partir du conteneur pour autant que je sache. Je ne parviens pas à envoyer une requête ping à l'adresse IP de l'hôte, aux adresses LAN ou Internet. J'utilise ubuntu: trusty image et l'exécution de bash en tant que processus principal du conteneur.

$ 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)

Si je relance docker, docker0 obtient une adresse ipv4 (en plus de l'adresse ipv6) et tout fonctionne comme prévu.

$ 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)

Bien sûr, je peux redémarrer le service Docker à chaque fois que je redémarre ma machine, ou probablement pirater un script de démarrage pour le faire pour moi (je n'ai pas essayé). Est-ce que quelqu'un sait d'un propre moyen de résoudre ce problème?

7
marcv81

TL; DR: J'avais installé Docker en utilisant "apt-get install docker.io". L'installation de la dernière version suivante https://docs.docker.com/installation/ubuntulinux/ corrige le problème.

Après avoir examiné le problème, il apparaît que la version de Docker dans 15.10 ne peut à la fois créer et initialiser correctement l'interface docker0. Lors de la première exécution (démarrage du docker de service), il créera l'interface mais ne l'initialisera pas. Lors de l'exécution suivante (redémarrage du docker de service), il l'initialisera. Cela peut être reproduit de manière cohérente en ajoutant et en supprimant l'interface manuellement avec brctl. Ce bogue a été corrigé dans le dernier Docker.

7
marcv81

Pour moi, c'est NetworkManager qui fait foirer. Le service Docker crée un pont comme il se doit, il l'expose ensuite sur dbus. NetworkManager commence à voir la nouvelle interface sur dbus et essaie de la configurer (car il est assez stupide de savoir que le pont docker0 est déjà configuré correctement). NetworkManager réussit parfois à configurer (reconfigurer) docker0 mais parfois, il échouera. Donc, parfois, vous redémarrez la boîte et docker0 aura IP assigné, d'autres fois ce ne sera pas.

Pour arrêter les erreurs de NetworkManager, ajoutez

iface docker0 inet manual

à /etc/network/interfaces en supposant que NetworkManager.conf a

[ifupdown] managed=false

qui est par défaut sur 15.10

(Un bogue devrait probablement être soulevé pour empêcher NetworkManager de gâcher des interfaces spécifiques de docker)

2
greg one