J'ai dnsmasq
exécuté dans l'hôte et je veux que les conteneurs de docker l'utilisent au lieu des serveurs Google par défaut (8.8.8.8
).
Mon hôte /etc/resolv.conf
se présente comme suit:
» cat /etc/resolv.conf
# 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.0.1
search mydomain.net
Et le /etc/resolv.conf
du conteneur ressemble à ceci:
root@ubuntu:/# cat /etc/resolv.conf
# 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
search mydomain.net
nameserver 8.8.8.8
nameserver 8.8.4.4
Il semble que docker réutilise le /etc/resolv.conf
de l'hôte, mais supprime l'entrée 127.0.0.1
et ajoute à la place les serveurs de noms de Google.
J'ai essayé d'ajouter une entrée de DNS se référant à l'interface docker0
:
» ifconfig docker0
docker0 Link encap:Ethernet HWaddr 02:42:8e:65:b0:88
inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:8eff:fe65:b088/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:55824 errors:0 dropped:0 overruns:0 frame:0
TX packets:74365 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:15702804 (15.7 MB) TX bytes:60639605 (60.6 MB)
Comme suit:
docker run \
-it \
--name ubuntu.bionic \
--restart always \
--dns 172.17.0.1 \
ubuntu:bionic
Mais le DNS ne fonctionne pas:
root@ubuntu:/# apt-get update
Err:1 http://security.ubuntu.com/ubuntu bionic-security InRelease
Temporary failure resolving 'security.ubuntu.com'
Comment puis-je utiliser un conteneur Docker pour utiliser le serveur DNS dans le système hôte?
Il semble que je doive dire à dnsmasq
de se lier à l'interface docker0
:
listen-address=127.0.0.1,172.17.0.1
Je n'aime toujours pas cela. Je dois donner l'adresse IP de l'interface docker0
deux fois , une fois pour la commande docker run
pour chaque conteneur qui Je veux créer, ainsi que pour la configuration dnsmasq
.
Je peux dire à docker
d'utiliser par défaut mon serveur DNS local (qui est lancé dans un conteneur et accessible aux autres conteneurs de l'interface docker0
: 172.17.0.1
):
» Sudo cat /etc/docker/daemon.json
{
"dns": ["172.17.0.1", "8.8.8.8"]
}
Et puis redémarrez le démon docker:
Sudo service docker restart
Je suis toujours quelque peu inquiet que docker
puisse décider de changer l'adresse IP de l'interface docker0
et je serai obligé de reconfigurer docker
et dnsmasq
et de reconstruire les conteneurs.
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. le serveur DNS intégré du Docker ), qui peut transférer correctement les requêtes 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 créé pour vos services (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 la configuration de la construction (nécessite le format de fichier v3. 4 + ).