79 votes

Les conteneurs Docker ne peuvent pas résoudre les DNS sur l'hôte de bureau Ubuntu 14.04

Je rencontre un problème avec mes conteneurs Docker sur Ubuntu 14.04 LTS. Docker a bien fonctionné pendant deux jours, puis j'ai soudainement perdu toute connectivité réseau à l'intérieur de mes conteneurs. La sortie d'erreur ci-dessous m'a d'abord fait croire que c'était parce qu'apt-get essaie de résoudre le DNS via IPv6.

J'ai désactivé l'IPv6 sur ma machine hôte et malgré cela, j'ai supprimé toutes les images, tiré la base ubuntu, et j'ai toujours rencontré le problème.

J'ai changé mes serveurs de noms /etc/resolve.conf de mon serveur DNS local aux serveurs DNS publics de Google (8.8.8.8 et 8.8.4.4) et je n'ai toujours pas de chance. J'ai également défini le DNS sur Google dans DOCKER_OPTS de /etc/default/docker et redémarré docker.

J'ai aussi essayé de tirer coreos, et yum n'a pas pu résoudre DNS non plus.

C'est bizarre, car si le DNS ne fonctionne pas, j'obtiens quand même une réponse lorsque j'envoie un ping aux mêmes serveurs de mise à jour qu'apt-get ne peut pas résoudre.

Je ne suis pas derrière un proxy, je suis sur un réseau local très standard, et cette version d'Ubuntu est à jour et fraîche (je l'ai installée il y a deux jours pour être plus proche de Docker).

J'ai fait des recherches approfondies à ce sujet en consultant d'autres messages sur stackoverflow et les problèmes de github, mais je n'ai pas trouvé de solution. Je suis à court d'idées sur la façon de résoudre ce problème, quelqu'un peut-il m'aider ?

Message d'erreur

  arthouse git:(docker)  docker build --no-cache .
Sending build context to Docker daemon 51.03 MB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu:14.04
 ---> 5506de2b643b
Step 1 : RUN apt-get update
 ---> Running in 845ae6abd1e0
Err http://archive.ubuntu.com trusty InRelease
Err http://archive.ubuntu.com trusty-updates InRelease
Err http://archive.ubuntu.com trusty-security InRelease   
Err http://archive.ubuntu.com trusty-proposed InRelease  
Err http://archive.ubuntu.com trusty Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-updates Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-security Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-proposed Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-security/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-proposed/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-security/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-proposed/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Some index files failed to download. They have been ignored, or old ones used instead.

Conteneur IFCONFIG/PING

  code  docker run -it ubuntu /bin/bash
root@7bc182bf87bb:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:04  
          inet addr:172.17.0.4  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:4/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:7 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:738 (738.0 B)  TX bytes:648 (648.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

root@7bc182bf87bb:/# ping google.com
PING google.com (74.125.226.0) 56(84) bytes of data.
64 bytes from lga15s42-in-f0.1e100.net (74.125.226.0): icmp_seq=1 ttl=56 time=12.3 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 12.367/12.367/12.367/0.000 ms
root@7bc182bf87bb:/# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=44 time=21.8 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=21.7 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=44 time=21.7 ms

De même, apt-get update échoue lorsque je force l'IPv4 :

root@6d925cdf84ad:/# sudo apt-get update -o Acquire::ForceIPv4=true
Err http://archive.ubuntu.com trusty InRelease

Err http://archive.ubuntu.com trusty-updates InRelease

Err http://archive.ubuntu.com trusty-security InRelease

Err http://archive.ubuntu.com trusty-proposed InRelease

Err http://archive.ubuntu.com trusty Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-updates Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-security Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-proposed Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Reading package lists... Done
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease

92voto

Drakel Points 78

Woo, j'ai trouvé un post sur github qui a résolu mon problème.

Après que Steve K. m'ait fait remarquer qu'il ne s'agissait pas d'un problème de DNS mais d'un problème de connectivité, j'ai pu trouver un post sur github qui décrivait comment résoudre ce problème.

Apparemment le pont réseau docker0 était bloqué. L'installation de bridge-utils et l'exécution de ce qui suit a remis mon Docker en état de marche :

apt-get install bridge-utils
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
service docker restart

33voto

wisbucky Points 859

S'il s'agit d'un problème de résolveur DNS, voici la solution :

La première chose à vérifier est de lancer cat /etc/resolv.conf dans le conteneur docker . S'il possède un serveur DNS invalide, tel que nameserver 127.0.x.x le conteneur ne sera pas en mesure de résoudre les noms de domaine en adresses IP. ping google.com échouera.

La deuxième chose à vérifier est de lancer cat /etc/resolv.conf sur le machine hôte . En fait, Docker copie les données de l'hôte. /etc/resolv.conf au conteneur à chaque fois qu'un conteneur est démarré. Ainsi, si l'hôte /etc/resolv.conf est erronée, alors le conteneur docker le sera aussi.

Si vous avez constaté que l'hôte /etc/resolv.conf est faux, alors vous avez 2 options :

  1. Coder en dur le serveur DNS dans daemon.json. C'est facile, mais pas idéal si vous vous attendez à ce que le serveur DNS change.

  2. Fixer les hôtes /etc/resolv.conf . C'est un peu plus délicat, mais il est généré dynamiquement, et vous n'avez pas à coder en dur le serveur DNS.


1. Coder en dur le serveur DNS dans le fichier docker daemon.json

  • Modifier /etc/docker/daemon.json

    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
  • Redémarrez le démon Docker pour que ces changements prennent effet :
    sudo systemctl restart docker

  • Maintenant, lorsque vous exécutez/démarrez un conteneur, docker remplira /etc/resolv.conf avec les valeurs de daemon.json .


2. Fixer les hôtes /etc/resolv.conf

A. Ubuntu 16.04 et antérieures

  • Pour Ubuntu 16.04 et antérieures, /etc/resolv.conf a été généré dynamiquement par NetworkManager.

  • Commentez la ligne dns=dnsmasq (avec un # ) en /etc/NetworkManager/NetworkManager.conf

  • Redémarrez le NetworkManager pour régénérer les données. /etc/resolv.conf :
    sudo systemctl restart network-manager

  • Vérifier sur l'hôte : cat /etc/resolv.conf

B. Ubuntu 18.04 et plus

  • Ubuntu 18.04 a changé pour utiliser systemd-resolved pour générer /etc/resolv.conf . Maintenant, par défaut, il utilise un cache DNS local 127.0.0.53. Cela ne fonctionnera pas à l'intérieur d'un conteneur. Docker utilisera donc par défaut le serveur DNS 8.8.8.8 de Google, ce qui peut poser problème aux personnes situées derrière un pare-feu.

  • /etc/resolv.conf est en fait un lien symbolique ( ls -l /etc/resolv.conf ) qui pointe vers /run/systemd/resolve/stub-resolv.conf (127.0.0.53) par défaut dans Ubuntu 18.04.

  • Il suffit de changer le lien symbolique pour qu'il pointe vers /run/systemd/resolve/resolv.conf qui énumère les serveurs DNS réels :
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • Vérifier sur l'hôte : cat /etc/resolv.conf

Maintenant, vous devriez avoir un /etc/resolv.conf sur l'hôte pour que docker le copie dans les conteneurs.

13voto

Dans une tentative d'ajouter une valeur supplémentaire à un problème que j'ai également rencontré ; avec une réponse alternative :

Mon réseau était lié au bureau et les paramètres DNS de Google étaient bloqués de sorte que le conteneur pouvait envoyer des adresses IP mais pas de noms de domaine.

Mon hôte /etc/resolv.conf ressemblait à l'origine ;

#Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.1.1
search companyDomain.co.za

Cela est dû au fait que Network Manager masque en quelque sorte les détails du serveur DNS.

Malheureusement, selon le manuels de docker Lors de la construction du fichier resolv.conf du conteneur, docker filtrera toutes les adresses IP de localhost et les remplacera par les adresses IP du DNS de Google. Dans mon cas, les noms de domaine sont donc hors limites.

Je devais le faire :

  • Réinitialiser mon /etc/default/docker par défaut pour que les conteneurs utilisent le contenu du fichier resolv.conf de mon hôte à la place.
  • Modifier /etc/NetworkManager/NetworManager.conf et commentez la ligne dns=dnsmasq . Cela permet à NM de spécifier les adresses IP DNS réelles au lieu de 127.0.0.1.
  • Redémarrer NM avec sudo service network-manager restart .
  • Redémarrez le service Docker avec sudo service docker restart .

L'exécution d'un conteneur lui permettrait alors de faire apt-get update/upgrade par exemple.

11voto

siva Points 276

Document officiel de Docker donne des instruments pour configurer un serveur DNS à utiliser par Docker

  1. Ouvrez le /etc/default/docker pour l'éditer :

    sudo nano /etc/default/docker
  2. Ajouter un paramètre pour Docker :

    DOCKER_OPTS="--dns 8.8.8.8"
  3. Remplacer 8.8.8.8 avec un serveur DNS local tel que 192.168.1.1 . Vous pouvez également spécifier plusieurs serveurs DNS. En les séparant par des espaces, par exemple exemple :

    --dns 8.8.8.8 --dns 192.168.1.1

    Avertissement : Si vous effectuez cette opération sur un ordinateur portable qui se connecte à différents réseaux, veillez à choisir un serveur DNS public.

    PS : nm-tool peut être utilisé pour vérifier le serveur DNS de l'hôte local.

  4. Enregistrez et fermez le fichier.

  5. Redémarrez le démon Docker.

    sudo service docker restart

9voto

Votre erreur est ici :

 Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19).
 connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]

Il ne s'agit pas d'une erreur de DNS. Votre système tente de se connecter à des hôtes IPv6 et échoue. Probablement parce que vous n'avez pas d'accès IPv6 sur votre hôte. La recherche de l'adresse IPv6 réussit. (Le miroir/archive ubuntu est disponible à la fois sur IPv6 et IPv4. Vous avez juste eu la malchance de tomber sur une adresse IPv6 parce que votre système pense que cela devrait fonctionner).

Vous devriez soit réparer cela, en installation de miredo ou réessayer jusqu'à ce que vous trouviez un miroir IPv4.

Une fois de plus, il est important de comprendre que le DNS n'est pas en cause, comme vous pouvez le constater par vos propres tests ping.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X