web-dev-qa-db-fra.com

Le DNS de docker.io ne fonctionne pas, il essaye d'utiliser 8.8.8.8

Je viens d'installer une nouvelle Ubuntu 14.04 et je veux utiliser Docker pour exécuter mes anciennes choses nécessitant 12.04. Le DNS à l'intérieur de Docker ne fonctionne pas.

Le resolv.conf de mon ordinateur portable ressemble à:

nameserver 127.0.0.1

Ce qui ne fonctionne pas avec Docker, apparemment. Il essaie donc de définir les serveurs de noms sur 8.8.8.8 et 8.8.4.4; quand je fais

$ Sudo docker run -i -t ubuntu /bin/bash

Ça dit:

WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it. Using default external servers : [8.8.8.8 8.8.4.4]

Et bien sûr, dans l'instance de Docker, resolv.conf ressemble à:

nameserver 8.8.8.8
nameserver 8.8.4.4

Je peux cingler avec succès les deux à partir de l'instance Docker. Cependant, il n'y a pas de DNS (par exemple, ping google.com échoue).

sortie ifconfig dans Docker:

eth0      Link encap:Ethernet  HWaddr aa:e9:9f:83:9d:92  
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::a8e9:9fff:fe83:9d92/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:648 (648.0 B)  TX bytes:738 (738.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:1500  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)

Maintenant quoi?

32
RemcoGerlich

Lorsque le paquet Ubuntu Docker a été mis à jour pour utiliser systemd, il a abandonné la prise en charge du fichier de configuration /etc/default/docker; la solution initiale suggérée par rocketman10404 ne fonctionnera plus (la désactivation de dnsmasqcontinuerait, mais elle aurait l'inconvénient de empêcher Ubuntu de mettre à jour automatiquement le serveur DNS).

Correction dans le nouveau fichier de configuration daemon.json

Recherchez le serveur DNS de votre réseau:

$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]:                             10.0.0.2

Ouvrez ou créez, s'il n'existe pas, /etc/docker/daemon.json et ajoutez des paramètres DNS à la ligne ExecStartname__:

# /etc/docker/daemon.json
{
    "dns": ["10.0.0.2", "8.8.8.8"]
}

Redémarrez le démon docker:

$ Sudo service docker restart

J'ai écrit n article de blog approfondi et aussi signalé un bogue à propos de ce problème si vous souhaitez plus de détails.

(À l'origine je l'ai résolu par ouvrir /lib/systemd/system/docker.service et ajouter des paramètres DNS à la ligne ExecStart, mais c’est mauvais - nous ne devrions pas éditer les fichiers systemd directement .)

22
Robin Winslow

Je n'utilise pas moi-même le docker, je ne m'occuperais donc pas normalement d'une question à propos du docker, mais il se trouve que j'ai lu quelque chose à ce sujet et que je suis tombé sur une documentation du docker qui semble adresse le problème exact . Pour résumer...

La documentation suggère quelques solutions de contournement. La première consiste à spécifier le serveur DNS devant être utilisé par le démon docker pour les conteneurs en ajoutant la ligne suivante à /etc/default/docker:

docker_OPTS="--dns 8.8.8.8"

où le DNS fourni pourrait être un serveur DNS local, tel que 192.168.1.1 (passerelle). Ensuite, redémarrez avec

Sudo restart docker

Une autre solution consiste à désactiver Dnsmasq dans NetworkManager en commentant la configuration dans /etc/NetworkManager/NetworkManager.conf comme suit:

#dns=dnsmasq

puis, redémarrez les deux

Sudo restart network-manager
Sudo restart docker
15
rocketman10404

Je me suis heurté à cela dans ma situation qui est spécifiquement

  • Exécution de conteneurs Docker sur ma machine de développement locale
  • Qui est connecté à un VPN
  • Certains de nos scripts de construction de conteneur effectuent des opérations telles que l'exécution de npm install à partir d'un référentiel personnalisé sur le VPN, à l'intérieur du conteneur.
    • Cela fonctionne à partir d'un pipeline de CI mais pas à partir de nos machines de développement, car npmne peut pas effectuer de recherche DNS réussie.
    • Nous avons également rencontré des problèmes avec les conteneurs nécessitant des recherches pour appeler des API externes REST

Ubuntu utilise par défaut dnsmasqlancé par NetworkManager pour mettre en cache les requêtes DNS, et configure /etc/resolv.conf pour qu'il pointe vers cette instance sur 127.0.1.1

  • Le client VPN que nous utilisons n'est pas compatible avec NetworkManager et impose son propre code /etc/resolv.conf, qui écrase la configuration de NetworkManager.
  • Ceci configure les serveurs DNS pour le VPN
  • Docker associe votre /etc/resolv.conf au conteneur par défaut
    • Habituellement, sur Ubuntu, il transmet les serveurs DNS Google au conteneur (car il connaît la situation dnsmasqname__.
    • Mais c'est un plaisir de passer la configuration du serveur DNS VPN au conteneur
    • Il n'y a pas de route du conteneur sur le pont réseau docker0 vers les serveurs DNS via l'adaptateur VPN tap0.
  • Ainsi, toutes les recherches DNS dans le conteneur échouent car il ne peut pas atteindre les seuls serveurs DNS fournis.
  • De plus, certains réseaux bloquent les requêtes adressées aux serveurs DNS Google, car ils veulent pouvoir surveiller toutes vos recherches DNS.

La solution :

Il semblerait plus élégant d’utiliser NetworkManager et son instance captive dnsmasqdans sa conception.

  1. Dites à Docker d'utiliser votre instance dnsmasqpour DNS

    • Ajoutez ou modifiez le fichier /etc/docker/daemon.json pour indiquer à docker d’utiliser l’adaptateur de pont docker0 pour DNS.

      {
        "dns": ["172.17.0.1"]
      }
      
  2. Configurez l'instance NM dnsmasqpour écouter également les ponts Docker, car par défaut, elle n'écoute que 127.0.1.1 - créer le fichier /etc/NetworkManager/dnsmasq.d/docker-bridge.conf

    # Default Docker bridge
    interface=docker0
    # Other Docker bridges
    interface=br-*
    
  3. Je n'aime pas le comportement grossier de ce client VPN et je préfère utiliser uniquement le DNS à l'extrémité du VPN pour les recherches de VPN (si vous avez un client VPN poli qui utilise NetworkManager correctement configuré, vous n'aurez pas à le faire.) )

    • Désactiver la fonctionnalité DNS dans le client VPN (cela arrête d'écraser resolv.conf lors de la connexion et maintenant tout DNS passe à nouveau à dnsmasqname__)
    • Ajoutez un fichier de configuration indiquant à dnsmasqde diriger les demandes DNS de votre domaine de manière appropriée - ajoutez le fichier `/etc/NetworkManager/dnsmasq.d/vpn-dns.conf

      server=/myprivatedomain.net/10.0.0.1  
      # or whatever your private DNS server is
      
    • Ajoutez éventuellement un domaine de recherche pour votre domaine afin de pouvoir utiliser des noms abrégés.

      • Je viens d'ajouter notre domaine local à la liste de recherche dans ma connexion réseau par défaut
  4. Redémarrez NetworkManager et Docker

    Sudo service network-manager restart
    Sudo service docker restart
    

À ce stade, vos conteneurs Docker devraient pouvoir exécuter nslookupsans problème lorsque vous êtes sur un réseau VPN, pour les domaines à la fois internes et externes à votre VPN.

9
Adrian

Voici comment j'ai installé docker sur mon serveur Ubuntu 14.04 fonctionnant sans tête.

J'exécute le serveur Ubuntu 14.04 avec la version suivante de docker installée.

#docker version
Client version: 0.9.1
Go version (client): go1.2.1
Git commit (client): 3600720
Server version: 0.9.1
Git commit (server): 3600720
Go version (server): go1.2.1

Le fichier /etc/init/docker.io.conf et le script contiennent la ligne suivante:

# modify these in /etc/default/$UPSTART_JOB (/etc/default/docker)
    DOCKER=/usr/bin/$UPSTART_JOB
    DOCKER_OPTS=

La réponse ci-dessus m'a aidé à trouver le fichier ci-dessus.

J'ai supprimé les commentaires suivants dans /etc/default/docker.io et ajouté mon serveur DNS local:

# Use DOCKER_OPTS to modify the daemon startup options.  
DOCKER_OPTS="--dns 192.168.X.X"

Redémarrage du service avec:

Sudo service docker.io restart

Ran docker run <image> /bin/bash

Aucun message DNS lors du démarrage du conteneur.

Commencé un nouveau conteneur, installé dnsutils.

Ran Dig et le message du serveur correspondent au serveur DNS local correct.

2
Hank

Vous pouvez utiliser le résolveur DNS local de l'hôte (par exemple, dnsmasq) à partir de vos conteneurs Docker s'ils se trouvent sur un réseau défini par l'utilisateur . Dans ce cas, le /etc/resolv.conf du conteneur aura le serveur de noms 127.0.0.11 (a.k.a. du Docker serveur DNS intégré ), qui peut transférer correctement les demandes DNS à l'adresse de bouclage de l'hôte.

$ cat /etc/resolv.conf
nameserver 127.0.0.1
$ docker run --rm Alpine cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
$ docker network create demo
557079c79ddf6be7d6def935fa0c1c3c8290a0db4649c4679b84f6363e3dd9a0
$ docker run --rm --net demo Alpine cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0    

Si vous utilisez docker-compose , un réseau personnalisé sera automatiquement configuré pour vos conteneurs (avec un format de fichier v2 + ). Notez cependant que, si docker-compose exécute des conteneurs dans un réseau défini par l'utilisateur, il les construit toujours dans le réseau par défaut . Pour utiliser un réseau personnalisé pour les générations, vous pouvez spécifier le paramètre network dans configuration de la construction (requiert le format de fichier v3.4 + ).

0
Eugene Yarmash

J'ai eu un problème similaire, signalé à StackOverflow . Il semble que je ne puisse pas interroger le serveur de noms 8.8.8.8 spécifié dans l'installation par défaut d'Ubuntu de Docker; Cependant, je pourrais faire un ping. Dans ce cas, utilisez un serveur DNS sur lequel vous pouvez réellement interroger. Test avec

nslookup - dns.server.name

et démarrez le conteneur via

docker run --dns=ip.addr.of.dns

Je n'ai pas encore trouvé le moyen de https://askubuntu.com/q/607172/30266 pour dériver une solution automagic.

0
krlmlr