web-dev-qa-db-fra.com

Cliquez sur le serveur DNS dans le système hôte

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?

MODIFIER

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.

EDIT2

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.

6
dangonfast

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 + ).

1
Eugene Yarmash