En 2018,
je partageais ici une configuration pour résoudre en DNS vos conteneurs sous le domaine local .docker
.
Depuis, la technologie et mes usages ont évolués.
Voici une petite mise-à-jour !
resolved vs dnsmasq
La solution était basé sur dnsmasq, or, depuis systemd 258, le service resolved permet de déléguer la résolution DNS d'une zone à un serveur spécifique.
L'intérêt ? La simplicité d'administration et la performance. dnsmasq est aussi un serveur DHCP, un cache DNS. Ce n'est pas utile pour ce besoin.
dnsdock
C'est toujours dnsdock qui résoud les noms de domaine en .docker. La commande pour lancer le service est toujours la même:
$ docker run --detach \
--restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
--name dnsdock -p 172.17.0.1:53:53/udp \
aacebedo/dnsdock \
--alias
$ host dnsdock.docker 172.17.0.1
Using domain server:
Name: 172.17.0.1
Address: 172.17.0.1#53
Aliases:
dnsdock.docker has address 172.17.0.2
dnsdock.docker mail is handled by 0 dnsdock.docker.
$
host
est un client DNS simple, comme dig
.
La commande host
sert juste à valider l'état du service dnsdock
en lui demandant de donner l'adresse de son propre nom.
Point important pour la suite: le port 53 de dnsdock est exposé sur une adresse routable: 172.17.0.1:1053.
Aiguillage
En passant à Omarchy, j'ai abandonné NetworkManager et son dnsmasq. En revanche, systemd 258 est là et la résolution DNS passe par resolved par défaut. Parfait.
Comment dire à resolved de renvoyer les requêtes DNS en .docker à dnsdock ?
Très simple: créer le fichier /etc/systemd/dns-delegate.d/docker.dns-delegate
avec le contenu suivant:
[Delegate]
Domains=docker
DNS=172.17.0.1:1053
Simple. Basique.
Recharger resolved avec sudo systemctl reload systemd-resolved
et tester:
$ getent hosts dnsdock.docker
172.17.0.2 dnsdock.docker
$
Victoire !
Contrairement à host
, getent hosts
utilise la libc pour résoudre le nom:
fichiers /etc/host, mdns, resolv.conf, etc.
Quels noms ?
À la création d'un conteneur,
dnsdock résoud automatiquement le nom de l'image.
L'option --alias
active la résolution sur le nom du conteneur.
L'étiquette de conteneur com.dnsdock.alias
permet de définir un CNAME arbitraire.
Les paramètres domain
et environment
aboutissent également à un nom résolvable.
Bref, il y a le choix. La documentation de dnsdock est précise.
Attention, le tiret bas est interdit dans un nom de domaine ! Si l'image ou le conteneur contient un tiret bas dans son nom, ce dernier sera ignoré.
Désormais, démarrer plusieurs PostgreSQL sans conflit de port 5432 est un jeu d'enfant !
Vous pouvez réagir à cet article sur journalduhacker.net.