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?
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 dnsmasq
continuerait, mais elle aurait l'inconvénient de empêcher Ubuntu de mettre à jour automatiquement le serveur DNS).
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 ExecStart
name__:
# /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 .)
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
Je me suis heurté à cela dans ma situation qui est spécifiquement
npm install
à partir d'un référentiel personnalisé sur le VPN, à l'intérieur du conteneur. npm
ne peut pas effectuer de recherche DNS réussie.Ubuntu utilise par défaut dnsmasq
lancé 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
/etc/resolv.conf
, qui écrase la configuration de NetworkManager./etc/resolv.conf
au conteneur par défaut dnsmasq
name__.docker0
vers les serveurs DNS via l'adaptateur VPN tap0
.La solution :
Il semblerait plus élégant d’utiliser NetworkManager et son instance captive dnsmasq
dans sa conception.
Dites à Docker d'utiliser votre instance dnsmasq
pour 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"]
}
Configurez l'instance NM dnsmasq
pour é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-*
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.) )
resolv.conf
lors de la connexion et maintenant tout DNS passe à nouveau à dnsmasq
name__)Ajoutez un fichier de configuration indiquant à dnsmasq
de 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.
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 à la fois internes et externes à votre VPN.
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.
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 + ).
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.