Fiche mémo : Résolution du blocage DNS Ubuntu & Docker (Netplan / systemd-resolved)
Modifier les serveurs DNS sur un serveur Linux semble trivial, mais l'interaction entre Netplan, systemd-resolved et le démon Docker peut vite bloquer les téléchargements d'images ou les mises à jour automatisées (Watchtower).
Remplacer les serveurs DNS par défaut ou pointer vers la box locale peut couper la résolution si celle-ci ne relaie pas correctement les requêtes WAN ou bloque le port 53. Résultat : Docker renvoie un timeout silencieux (net/http: request canceled while waiting for connection) ou un échec direct de résolution (Could not resolve host).
1. Diagnostic rapide : identifier l'origine du blocage
Tester la connectivité et la résolution sur l'hôte
# Vérifier la passerelle par défaut
ip route show default
# Tester la joignabilité IP brute (ICMP)
ping -c 3 1.1.1.1
# Tester l'accès HTTPS direct aux registres
curl -I https://registry-1.docker.io/v2/
Si la commande renvoie Could not resolve host (code 6), le problème vient de la résolution DNS de l'hôte, pas de Docker.
Inspecter les résolveurs actifs
resolvectl status
Repérer l'interface active et vérifier la ligne DNS Servers. Tester ensuite quel serveur répond réellement :
# Test sur la passerelle locale
dig @192.168.1.1 registry-1.docker.io +short
# Test sur un résolveur public
dig @1.1.1.1 registry-1.docker.io +short
2. Corriger la configuration DNS avec Netplan
Sur les distributions récentes, la configuration statique doit être portée au niveau de Netplan pour être persistante.
Éditer le fichier de configuration réseau
sudo nano /etc/netplan/*.yaml
Renseigner des résolveurs publics éprouvés
Dans la section de l'interface concernée, remplacer ou compléter les adresses DNS (et retirer temporairement les serveurs IPv6 locaux s'ils ne répondent pas) :
network:
version: 2
ethernets:
eth0: # Adapter selon le nom de l'interface
dhcp4: false
addresses:
- 192.168.1.50/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses:
- 1.1.1.1
- 8.8.8.8
Appliquer et relancer les services
sudo netplan apply
sudo systemctl restart systemd-resolved
3. Vérifier la liaison systemd-resolved
S'assurer que /etc/resolv.conf pointe bien vers le résolveur local de systemd :
ls -l /etc/resolv.conf
Si le lien est rompu ou pointe vers un fichier statique obsolète :
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
4. Forcer les DNS globaux dans Docker (optionnel mais recommandé)
Pour éviter que Docker n'hérite d'une boucle locale instable (127.0.0.53), il est conseillé de déclarer des résolveurs explicites pour le démon.
Éditer /etc/docker/daemon.json
{
"dns": ["1.1.1.1", "8.8.8.8"]
}
Recharger Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
5. Validation finale
Côté Watchtower :
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --run-oCôté Docker :
docker pull hello-world
Sur l'hôte :
curl -I https://registry-1.docker.io/v2/
# Réponse attendue : HTTP/2 401 Unauthorized (connexion réussie)