Introduction
Le registre Docker est le moyen standard de stocker et de distribuer des images de conteneurs. Lorsque la communication réseau entre votre client Docker, le démon et le registre échoue, les envois (push) et les récupérations (pull) d'images s'interrompent, bloquant les développeurs et les déploiements. Les causes peuvent provenir de la résolution DNS, de ports incorrects, de problèmes de routage, de pare-feu ou de mauvaises configurations TLS. Sans une approche systématique, le dépannage devient un jeu de devinettes.
Ce guide fournit une méthodologie pratique, neutre vis-à-vis des fournisseurs, pour diagnostiquer et corriger les problèmes réseau d'un registre Docker. Vous apprendrez à inventorier votre environnement, à tester les modifications de configuration en toute sécurité, à vérifier la connectivité avec des commandes concrètes et à récupérer après un échec. Chaque étape comprend des exemples de commandes réelles et les sorties attendues, afin que vous puissiez suivre et gagner en confiance. À la fin, vous disposerez d'une liste de contrôle reproductible pour maintenir le trafic de votre registre fluide.
Inventaire des versions et de l'environnement
Avant de modifier quoi que ce soit, documentez votre configuration. Connaître les versions exactes et la topologie réseau évite de courir après de fausses pistes. Rassemblez :
- Version du client Docker :
docker version --format '{{.Client.Version}}' - Version du démon Docker :
docker version --format '{{.Server.Version}}'(si accessible) - Version du registre : souvent visible à
https://<registry>/v2/dans les en-têtes ou viadocker-registry --versionsi vous l'opérez. - Systèmes d'exploitation du client, de l'hôte du démon et de l'hôte du registre.
- Chemin réseau : le client et le registre sont-ils sur le même hôte, le même réseau local ou à travers Internet ? Un proxy ou un VPN est-il impliqué ?
- Résolution DNS : quels serveurs DNS sont utilisés ?
/etc/resolv.confsur Linux ouipconfig /allsur Windows. - Règles de pare-feu : existe-t-il des pare-feu locaux ou réseau susceptibles de bloquer le port 5000 (port par défaut du registre) ou 443 (courant pour TLS) ?
Exemple de commande d'inventaire :
docker version
Extrait de sortie attendu :
Client: Docker Engine - Community
Version: 24.0.5
API version: 1.43
Go version: go1.20.4
Git commit: ced0996
Built: Fri Jul 21 00:00:00 2023
OS/Arch: linux/amd64
Server: Docker Engine - Community
Engine:
Version: 24.0.5
API version: 1.43 (minimum version 1.12)
Go version: go1.20.4
Git commit: a61e2b4
Built: Fri Jul 21 00:00:00 2023
OS/Arch: linux/amd64
Experimental: false
Enregistrez tous les détails. Si vous utilisez un service de registre comme Docker Hub, notez la région et toute configuration de miroir (par exemple, registry-mirrors dans /etc/docker/daemon.json).
Chemin de configuration sûr
Lors du diagnostic, effectuez une modification à la fois et testez. Évitez les modifications trop larges qui pourraient perturber d'autres services. Adoptez une approche ciblée :
- Isolez le point de défaillance : déterminez si le problème se situe du côté client (par exemple, la configuration du démon Docker) ou sur le chemin réseau.
- Testez avec un point de terminaison fiable : si possible, essayez de récupérer une petite image publique depuis Docker Hub pour vérifier le fonctionnement du client.
- Utilisez une configuration temporaire : au lieu de modifier directement
/etc/docker/daemon.json, testez avec des options en ligne de commande qui remplacent les paramètres. Par exemple, utilisez--registry-mirrorsur un processus de démon unique. - Sauvegardez les configurations : avant de modifier des fichiers comme
daemon.jsonou/etc/hosts, créez une sauvegarde horodatée.
Exemple : définition temporaire d'un miroir de registre pour un démon de test :
sudo dockerd --registry-mirror=https://mirror.example.com --debug
Attendu : le démon démarre avec la journalisation de débogage, et vous pouvez observer les connexions au registre dans la sortie du terminal.
Si vous devez modifier la résolution DNS pour un hôte spécifique, testez avec une entrée modifiée dans /etc/hosts avant de changer les serveurs DNS globalement.
Modes de défaillance courants et causes profondes
De nombreux problèmes se classent en quelques catégories. Connaître les symptômes accélère le diagnostic.
| Symptôme | Cause probable | Vérification rapide |
|---|---|---|
docker pull se bloque puis expire | Pare-feu bloquant le port 5000 ou 443 | telnet <registry> 5000 ou nc -zv <registry> 5000 |
Get https://registry.example.com/v2/: dial tcp: lookup registry.example.com: no such host | Échec de la résolution DNS | nslookup registry.example.com |
x509: certificate signed by unknown authority | Certificat auto-signé non approuvé ou mauvais nom d'hôte dans le certificat | openssl s_client -connect <registry>:443 |
denied: requested access to the resource is denied | Problème d'authentification (souvent après un changement de proxy) | docker login <registry> |
| connection refused | Le registre ne fonctionne pas ou écoute sur un autre port | docker logs ou ss -tulpn | grep 5000 |
| no route to host | Problème de routage ou pare-feu sur un saut intermédiaire | ip route get |
Problèmes DNS
Le DNS peut provoquer des pannes intermittentes. Vérifiez :
nslookup registry.example.com
Sortie correcte attendue :
Server: 192.168.1.1
Address: 192.168.1.1#53
Name: registry.example.com
Address: 10.0.0.5
Si aucune adresse n'est retournée, vérifiez /etc/hosts, la configuration du serveur DNS ou la délégation du domaine.
Problèmes de port et de pare-feu
Le port par défaut du registre est 5000 (HTTP) ou 443 (HTTPS). De nombreux pare-feu bloquent les ports non standard. Utilisez telnet ou nc pour tester la connectivité :
nc -zv registry.example.com 5000
Sortie si le port est ouvert :
Connection to registry.example.com 5000 port [tcp/*] succeeded!
En cas d'échec, vérifiez les groupes de sécurité, iptables ou les règles de pare-feu du fournisseur cloud.
Problèmes TLS et de certificats
Si votre registre utilise HTTPS, une incompatibilité de certificat bloque les connexions. Inspectez le certificat :
openssl s_client -connect registry.example.com:443 -servername registry.example.com | openssl x509 -noout -subject -dates
Vérifiez que le CN (Common Name) ou le SAN (Subject Alternative Name) du certificat correspond au nom d'hôte que vous utilisez.
Vérification et diagnostics
Voici un flux de diagnostic étape par étape avec des commandes et les sorties attendues.
Étape 1 : Vérifier la connectivité du démon Docker
Exécutez docker info pour voir si le démon est joignable :
docker info --format '{{.ServerVersion}}'
Attendu :
24.0.5
Étape 2 : Tenter une petite récupération
Essayez de récupérer une image minuscule comme hello-world depuis Docker Hub pour écarter les problèmes côté client :
docker pull hello-world
Sortie en cas de succès :
Using default tag: latest
latest: Pulling from library/hello-world
Digest: sha256:...
Status: Image is up to date for hello-world: latest
docker.io/library/hello-world: latest
Étape 3 : Tester l'API du registre avec curl
Utilisez curl pour appeler le point de terminaison de version du registre :
curl -v https://registry.example.com/v2/
Sortie attendue (si une authentification est requise, attendez-vous à un code 401 mais la connexion est établie) :
* Trying 10.0.0.5:443...
* Connected to registry.example.com (10.0.0.5) port 443 (#0)
...
< HTTP/2 401
< content-type: application/json
...
Si la connexion échoue, notez l'erreur : DNS, refus, délai d'attente, TLS.
Étape 4 : Tester avec docker login
Pour les registres privés, des informations d'identification valides sont nécessaires :
docker login registry.example.com
Succès attendu :
Login Succeeded
Étape 5 : Effectuer un push/pull ciblé vers un dépôt de test
Étiquetez une petite image locale et poussez-la vers un espace de noms de test :
docker tag hello-world registry.example.com/test/hello:v1
docker push registry.example.com/test/hello:v1
Succès attendu :
The push refers to repository [registry.example.com/test/hello]
...
v1: digest: sha256:... size: 524
Ensuite, récupérez-la depuis un autre hôte pour vérifier l'aller-retour complet.
Récupération après échec et retour en arrière
Lorsqu'une modification casse la connectivité, revenez au dernier état stable connu et retestez.
Scénarios de retour en arrière
- Modification DNS / fichier hosts : restaurez le fichier
/etc/hostsou les paramètres DNS d'origine. Videz le cache DNS (sudo systemd-resolve --flush-cachessur Linux,ipconfig /flushdnssur Windows). - Modification du pare-feu : supprimez la règle nouvellement ajoutée ou restaurez la configuration précédente du groupe de sécurité.
- Configuration du démon Docker : si vous avez modifié
/etc/docker/daemon.json, restaurez depuis la sauvegarde et redémarrez Docker (sudo systemctl restart docker). - Configuration du registre : si vous avez modifié les paramètres du registre (par exemple, les certificats TLS), revenez aux certificats précédents et redémarrez le conteneur ou le service du registre.
Vérification de la récupération
Après le retour en arrière, répétez les commandes de diagnostic. Concentrez-vous sur la couche qui a été affectée. Par exemple, après un retour en arrière du pare-feu :
nc -zv registry.example.com 5000
Devrait à nouveau signaler succeeded!.
Si vous ne pouvez pas revenir en arrière immédiatement, envisagez des solutions de contournement temporaires :
- Utilisez un miroir de registre pour les pulls si seul le registre principal est en panne.
- Ajoutez une exception dans le pare-feu pour des adresses IP source spécifiques.
- Utilisez l'adresse IP au lieu du nom d'hôte pour contourner temporairement les problèmes DNS.
Pièges courants et comment les éviter
1. Ignorer les incompatibilités de versions
Pourquoi cela arrive : les équipes mettent souvent à niveau la CLI Docker mais pas le démon, ou vice versa.
Comment éviter ou récupérer : assurez-vous que les versions du client et du démon sont compatibles. Utilisez docker version et vérifiez la matrice de compatibilité des versions d'API. En cas d'incompatibilité, mettez à niveau ou rétrogradez en conséquence.
2. Négliger les paramètres de proxy
Pourquoi cela arrive : les proxys d'entreprise peuvent intercepter et modifier le trafic, entraînant des erreurs d'authentification ou TLS.
Comment éviter ou récupérer : configurez le démon Docker avec les paramètres de proxy dans /etc/systemd/system/docker.service.d/http-proxy.conf ou ~/.docker/config.json pour le client. Assurez-vous que NO_PROXY inclut les noms d'hôte du registre.
3. Supposer que le port 5000 est ouvert
Pourquoi cela arrive : de nombreux fournisseurs cloud restreignent les ports non standard par défaut.
Comment éviter ou récupérer : vérifiez les groupes de sécurité cloud et les règles de pare-feu locales. Utilisez nc -zv pour confirmer.
4. Certificats TLS mal configurés
Pourquoi cela arrive : certificats auto-signés non installés sur le client, ou le CN/SAN du certificat ne correspond pas au nom d'hôte utilisé.
Comment éviter ou récupérer : utilisez openssl s_client pour inspecter le certificat. Installez le certificat de l'autorité de certification dans le magasin de confiance du client Docker (/etc/docker/certs.d/<registry>/ca.crt).
5. Mise en cache DNS et obsolescence du fichier hosts
Pourquoi cela arrive : les modifications des enregistrements DNS peuvent prendre du temps à se propager ; les entrées locales dans /etc/hosts peuvent prendre le dessus.
Comment éviter ou récupérer : videz les caches DNS après les modifications. Utilisez getent hosts <hostname> pour voir l'adresse résolue. Évitez de modifier /etc/hosts sauf si nécessaire, et documentez les changements.
6. Ne pas tester avec docker login
Pourquoi cela arrive : beaucoup supposent que le registre est public ou que les informations d'identification sont valides.
Comment éviter ou récupérer : testez toujours avec docker login après les changements de configuration. Utilisez un gestionnaire de jetons ou de mots de passe pour éviter les fautes de frappe.
Liste de contrôle des opérations
Utilisez cette liste de contrôle lorsqu'un problème réseau de registre est signalé ou lors de la maintenance périodique. Attribuez un responsable à chaque élément pour garantir la responsabilité. Par exemple, Priya Shah, responsable de l'ingénierie est propriétaire des vérifications DNS et pare-feu et les examine trimestriellement.
- [ ] Enregistrer les versions du client Docker, du démon et du registre. Responsable : Ingénieur DevOps (examen mensuel).
- [ ] Confirmer la résolution DNS avec
nslookupoudig. Responsable : Administrateur réseau (examen mensuel). - [ ] Tester la connectivité port vers le registre (5000, 443) avec
nc -zv. Responsable : Ingénieur sécurité (examen trimestriel). - [ ] Valider le certificat TLS avec
openssl s_client. Responsable : Ingénieur sécurité (examen trimestriel). - [ ] Vérifier les journaux du démon Docker pour les erreurs liées au registre (
sudo journalctl -u docker). Responsable : Équipe plateforme (examen hebdomadaire). - [ ] Tenter
docker loginet un petit pull/push vers un dépôt de test. Responsable : Ingénieur DevOps (examen hebdomadaire). - [ ] Examiner les règles de pare-feu et les paramètres de proxy. Responsable : Administrateur réseau (examen trimestriel).
- [ ] Documenter tout changement et vérifier la procédure de retour en arrière. Responsable : Rédacteur technique (examen trimestriel).
Conclusion
Les problèmes réseau d'un registre Docker sont souvent simples une fois que vous isolez la couche : DNS, port, TLS ou authentification. Ce guide a fourni une approche systématique : inventorier votre environnement, apporter des modifications ciblées, vérifier avec des commandes concrètes et récupérer rapidement avec un retour en arrière. Utilisez la liste de contrôle des opérations pour prévenir les pannes futures.
Commencez par les tests les plus simples : confirmez les versions du client et du démon, résolvez le DNS, vérifiez la connectivité des ports, puis passez aux appels API et aux opérations d'images réelles. Documentez vos conclusions et partagez-les avec votre équipe. Grâce à ces étapes pratiques, vous pouvez maintenir vos pipelines d'images fluides.
N'oubliez pas de conserver une sauvegarde stable de la configuration de votre démon Docker et des certificats du registre. Des vérifications régulières des règles de pare-feu et des enregistrements DNS peuvent détecter les problèmes avant qu'ils n'affectent vos développeurs. Vous êtes désormais équipé pour aborder le prochain incident réseau de registre avec confiance.