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.
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.
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.
C'était suffisant pour Ubuntu 18.04 LTS:
Sudo service network-manager restart
Sudo resolvconf -u
Sudo service dnsmasq restart
Sudo service docker restart