.docker (bis)

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.