web-dev-qa-db-fra.com

Docker ne peut pas résoudre DNS sur un réseau privé

Ma machine se trouve sur un réseau privé avec des serveurs DNS privés et une zone privée pour la résolution DNS. Je peux résoudre des hôtes sur cette zone à partir de ma machine hôte, mais je ne peux pas les résoudre à partir de conteneurs exécutés sur ma machine hôte.

Hôte:

root@Host:~# 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.1.1

root@Host:~# ping privatedomain.io
PING privatedomain.io (192.168.0.101) 56(84) bytes of data.

Conteneur:

root@container:~# 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 8.8.8.8
nameserver 8.8.4.4

root@container:~# ping privatedomain.io
ping: unknown Host privatedomain.io

Il est assez évident que les serveurs DNS publics de Google ne résoudront pas mes demandes DNS privées. Je sais que je peux le forcer avec docker --dns 192.168.0.1, ou définissez DOCKER_OPTS="--dns 192.168.0.1" dans /etc/default/docker, mais mon ordinateur portable change fréquemment de réseau. Il semble qu'il devrait y avoir un moyen systématique de résoudre ce problème.

16
wizulus

Docker remplit /etc/resolv.conf en copiant le /etc/resolv.conf, et en filtrant tous les serveurs de noms locaux tels que 127.0.1.1. S'il ne reste plus de serveurs de noms après cela, Docker ajoutera les serveurs DNS publics de Google (8.8.8.8 et 8.8.4.4).

Selon la documentation Docker :

Remarque : Si vous avez besoin d'accéder au résolveur localhost d'un hôte, vous devez modifier votre service DNS sur l'hôte pour écouter sur une adresse non-localhost accessible de l'intérieur du conteneur.

Le service DNS sur l'hôte est dnsmasq, donc si vous faites écouter dnsmasq sur votre IP docker et que vous l'ajoutez à resolv.conf, docker configurera les conteneurs pour l'utiliser comme serveur de noms.

1 . Créer/modifier /etc/dnsmasq.conf et ajoutez ces lignes:

interface=lo
interface=docker0

2 . Trouvez votre IP docker (dans ce cas, 172.17.0.1):

root@Host:~# ifconfig | grep -A2 docker0
docker0   Link encap:Ethernet  HWaddr 02:42:bb:b4:4a:50  
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0

3 . Créer/modifier /etc/resolvconf/resolv.conf.d/tail et ajoutez cette ligne:

nameserver 172.17.0.1

4 . Redémarrez le réseau, mettez à jour resolv.conf, redémarrez docker:

Sudo service network-manager restart
Sudo resolvconf -u
Sudo service docker restart

Vos conteneurs pourront désormais résoudre le DNS à partir des serveurs DNS que la machine hôte utilise.

† Le chemin peut être /etc/dnsmasq.conf, /etc/dnsmasq.conf.d/docker.conf, /etc/NetworkManager/dnsmasq.conf, ou /etc/NetworkManager/dnsmasq.d/docker.conf selon votre système et vos préférences personnelles.

21
wizulus

Pour Ubuntu 18.04 et d'autres systèmes qui utilisent résolu par systemd, il peut être nécessaire d'installer dnsmasq et resolvconf. résolu par systemd est codé en dur pour écouter sur 127.0.0.5 , et Docker filtre toute adresse de bouclage lors de la lecture de resolv.conf .

1 . Installez dnsmasq et resolvconf.

Sudo apt update
Sudo apt install dnsmasq resolvconf

2 . Modifier /etc/dnsmasq.conf et ajoutez ces lignes:

interface=docker0
bind-interfaces
listen-address=172.17.0.1

3 . Créer/modifier /etc/resolvconf/resolv.conf.d/tail et ajoutez cette ligne:

nameserver 172.17.0.1

4 . Redémarrez le réseau, mettez à jour resolv.conf, redémarrez docker:

Sudo service network-manager restart
Sudo resolvconf -u
Sudo service dnsmasq restart
Sudo service docker restart

Vos conteneurs pourront désormais résoudre le DNS à partir des serveurs DNS que la machine hôte utilise.

12
wizulus

C'était suffisant pour Ubuntu 18.04 LTS:

Sudo service network-manager restart
Sudo resolvconf -u
Sudo service dnsmasq restart
Sudo service docker restart
0
Mexidense