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
échec).
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?
la source
Je n'utilise pas moi-même le docker, je ne m'occuperais donc pas normalement d'une question à propos du docker, mais je suis tombé sur le sujet et je suis tombé sur une documentation du docker qui semble régler exactement ce problème . 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
:où le DNS fourni pourrait être un serveur DNS local, tel que 192.168.1.1 (passerelle). Ensuite, redémarrez avec
Une solution alternative consiste à désactiver Dnsmasq dans NetworkManager en commentant la configuration de la
/etc/NetworkManager/NetworkManager.conf
manière suivante:puis, redémarrez les deux
la source
/etc/default/docker
n’a plus d’effet. Voir ma solution pour savoir comment résoudre ce problème dans un monde post-init.d / upstart./etc/NetworkManager/NetworkManager.conf
n'existe pas sur Ubuntu 18.04 LTS. : /systemd-resolved
le serveur DNS en cache agit par défaut et provoque leWARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it.
problème (les configurations Ubuntu 16.04 ne semblent pas l'activer par défaut). La solution de contournement consiste à désactiversystemd-resolved
ou à utiliser l'--dns
option lors du démarrage du conteneur comme indiqué dans la réponse principale.Je me suis heurté à cela dans ma situation qui est spécifiquement
npm install
des tâches telles que celles exécutées à partir d'un référentiel personnalisé sur le VPN , à l'intérieur du conteneur.npm
une recherche DNS réussie est impossible.Ubuntu utilise par défaut,
dnsmasq
démarré par NetworkManager, pour mettre en cache les requêtes DNS et configure/etc/resolv.conf
pour pointer vers cette instance sur127.0.1.1
/etc/resolv.conf
ce qui écrase la configuration de NetworkManager./etc/resolv.conf
au conteneur par défautdnsmasq
situation.docker0
pont réseau vers les serveurs DNS via l'tap0
adaptateur VPN .La solution :
Il semblerait plus élégant d’utiliser NetworkManager et son
dnsmasq
instance captive dans sa conception.Dites à Docker d'utiliser votre
dnsmasq
instance pour DNSAjouter ou modifier un fichier
/etc/docker/daemon.json
pour indiquer au menu fixe d'utiliser l'docker0
adaptateur de pont pour DNSConfigurez l'
dnsmasq
instance NM pour qu'elle écoute également les ponts Docker, car par défaut, elle n'écoute que 127.0.1.1 - create file/etc/NetworkManager/dnsmasq.d/docker-bridge.conf
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
à la connexion et maintenant tout le DNS passe àdnsmasq
nouveau)Ajoutez un fichier de configuration pour indiquer
dnsmasq
aux demandes DNS directes de votre domaine - ajoutez le fichier `/etc/NetworkManager/dnsmasq.d/vpn-dns.confAjoutez éventuellement un domaine de recherche pour votre domaine afin de pouvoir utiliser des noms abrégés.
Redémarrez NetworkManager et Docker
À ce stade, vos conteneurs Docker devraient pouvoir se passer de
nslookup
problèmes lorsque vous êtes sur un réseau VPN, pour les domaines à l'intérieur et à l'extérieur de votre réseau.la source
cannot unmarshal string into Go value of type []string
lors du redémarrage du service Docker.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.
Le fichier /etc/init/docker.io.conf et le script contiennent la ligne suivante:
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:
Redémarrage du service avec:
A couru
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 est le serveur DNS local correct.
la source
J'ai eu un problème similaire, signalé à StackOverflow . Il semble que je n’ai pas pu interroger le
8.8.8.8
serveur de noms spécifié dans l’installation par défaut de Docker sous Ubuntu; Cependant, je pourrais faire un ping. Dans ce cas, utilisez un serveur DNS sur lequel vous pouvez réellement interroger. Test avecet démarrez le conteneur via
Je n'ai pas encore trouvé de moyen de https://askubuntu.com/q/607172/30266 pour dériver une solution automagic.
la source
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, un conteneur/etc/resolv.conf
aura le serveur de noms127.0.0.11
(le serveur DNS intégré du Docker ), qui peut transférer correctement les demandes DNS à l'adresse de bouclage de l'hôte.Si vous utilisez
docker-compose
, il va configurer automatiquement un réseau personnalisé pour vos conteneurs (avec un format de fichier v2 + ). Notez cependant que même s'ildocker-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 constructions, vous pouvez spécifier lenetwork
paramètre dans la configuration de la construction (nécessite le format de fichier v3.4 + ).la source