docker.io DNS ne fonctionne pas, il essaie d'utiliser 8.8.8.8

29

J'ai une nouvelle installation Ubuntu 14.04 et souhaite utiliser Docker pour exécuter mes anciennes données nécessitant la version 12.04. Le DNS à l'intérieur de Docker ne fonctionne pas.

Le fichier resolv.conf de mon ordinateur portable se présente comme suit:

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

Il est écrit:

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 de Docker. Cependant, il n'y a pas de DNS ( ping google.com échoue, par exemple).

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?

    
posée RemcoGerlich 02.06.2014 - 16:12
la source

6 réponses

19

Lorsque le paquet Ubuntu Docker a été mis à jour pour utiliser systemd, il a cessé de prendre en charge le fichier /etc/default/docker de configuration. La solution initiale suggéré par rocketman10404 ne fonctionnera plus (la désactivation de dnsmasq fonctionnerait toujours, mais elle présente l'inconvénient de empêcher Ubuntu de mettre à jour automatiquement le serveur DNS).

Correction dans le nouveau fichier daemon.json config

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 ExecStart :

# /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 un article de blog détaillé et aussi a déposé un bogue sur ce problème si vous souhaitez plus de détails.

(À l'origine, je l'ai résolu en ouvrant /lib/systemd/system/docker.service et en ajoutant des paramètres DNS à la ligne ExecStart , mais c'est dommage - nous n'éditez pas les fichiers systemd directement .)

    
réponse donnée Robin Winslow 24.06.2016 - 00:47
la source
15

Je n'utilise pas moi-même le docker, je n'interviens donc pas ici pour une question sur le docker, mais je suis tombé sur une lecture à ce sujet et je suis tombé sur une documentation du docker qui semble résolvez ce 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 mettant en commentaire la configuration dans /etc/NetworkManager/NetworkManager.conf comme suit:

#dns=dnsmasq

puis redémarrez les deux

sudo restart network-manager
sudo restart docker
    
réponse donnée rocketman10404 05.06.2014 - 00:01
la source
9

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

  • Exécution des conteneurs Docker sur mon ordinateur de développement local
  • 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 npm ne peut pas effectuer de recherche DNS réussie
    • Nous avons également rencontré des problèmes avec les conteneurs qui devaient effectuer des recherches pour appeler des API REST externes

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

  • Le client VPN que nous utilisons n'est pas compatible avec NetworkManager et force son propre /etc/resolv.conf qui écrase la configuration de NetworkManager
  • Ceci configure les serveurs DNS pour le VPN
  • Docker assombrit votre /etc/resolv.conf du conteneur par défaut
    • Généralement, sous Ubuntu, il transmet les serveurs DNS Google au conteneur (car il connaît la situation dnsmasq .
    • Mais c'est un plaisir de passer la configuration du serveur DNS VPN au conteneur
    • Il n'y a aucune route du conteneur sur le pont réseau docker0 vers les serveurs DNS via l'adaptateur VPN tap0 .
  • Ergo, toutes les recherches DNS dans le conteneur échouent car il ne peut pas atteindre les seuls serveurs DNS fournis avec
  • 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 que l'utilisation de NetworkManager soit plus élégante et que son instance captive dnsmasq soit telle qu'elle a été conçue.

  1. Dites à Docker d'utiliser votre instance dnsmasq pour DNS

    • Ajoutez ou modifiez le fichier /etc/docker/daemon.json pour que le menu fixe utilise l’adaptateur de pont docker0 pour DNS

      {
        "dns": ["172.17.0.1"]
      }
      
  2. Configurez l'instance NM dnsmasq pour écouter 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é VPN pour les recherches VPN (si vous avez un client VPN poli qui utilise NetworkManager correctement configuré, vous n'aurez pas faire cela)

    • Désactiver la fonctionnalité DNS dans le client VPN (cela arrête d'écraser resolv.conf lors de la connexion et tout le DNS passe à nouveau à dnsmasq )
    • Ajoutez un fichier de configuration indiquant à dnsmasq de diriger correctement les requêtes DNS de votre domaine - 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 à votre domaine pour pouvoir utiliser des noms abrégés

      • Je viens d'ajouter notre domaine local à la liste de recherche de 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 nslookup sans problème lorsque vous êtes sur un réseau VPN, pour les domaines situés à l'intérieur et à l'extérieur de votre réseau.

    
réponse donnée Adrian 19.09.2016 - 12:44
la source
2

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

J'utilise Ubuntu Server 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émarrez le service avec:

sudo service docker.io restart

Ran docker run <image> /bin/bash

Aucun message DNS lors du démarrage du conteneur.

Commencez un nouveau conteneur, installez dnsutils.

Ran dig et le message du serveur correspond au serveur DNS local approprié.

    
réponse donnée Hank 15.07.2014 - 06:41
la source
0

J'ai eu un problème similaire, l'a signalé à StackOverflow . Il semble que je ne pouvais 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. Testez avec

nslookup - dns.server.name

et démarrez le conteneur via

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

Je n'ai pas encore trouvé de moyen de lien pour dériver une solution automagique.

    
réponse donnée krlmlr 09.04.2015 - 15:33
la source
0

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, /etc/resolv.conf du conteneur aura le serveur de noms 127.0.0.11 (autrement dit le du Docker serveur DNS intégré ), qui peut transférer les demandes DNS à l'adresse de bouclage de l'hôte correctement.

$ 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 créé pour vos conteneurs (avec un format de fichier < a href="https://docs.docker.com/compose/compose-file/compose-versioning/#version-2"> v2 + ). Notez cependant que, bien que 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 la configuration de génération (obligatoire). format de fichier v3.4 + ).

    
réponse donnée 09.09.2018 - 10:19
la source

Lire d'autres questions sur les étiquettes