Introduction
Docker Hub est au cœur de nombreux flux de travail conteneurisés, mais lorsque quelque chose ne fonctionne pas, les symptômes peuvent être déroutants : un pull qui se bloque, un push rejeté, une authentification qui échoue, ou un conteneur qui se comporte différemment après un redémarrage. Un dépannage efficace consiste à passer d'un problème observé à une correction vérifiée sans conjecture. Ce guide propose une approche systématique pour les développeurs, les consultants DevOps et les équipes de startup. Il associe chaque étape de diagnostic à des commandes concrètes, des sorties attendues, des signaux d'échec et des décisions de récupération, le tout fondé sur le principe de sécurité opérationnelle : observer avant de modifier, limiter le rayon d'impact, protéger les données sensibles et vérifier avant de déclarer victoire.
Nous couvrirons les domaines essentiels : inventorier votre version et votre environnement Docker, configurer l'accès à Docker Hub en toute sécurité, vérifier la connectivité et les opérations sur les images, diagnostiquer les échecs courants et mettre en place une liste de contrôle opérationnelle reproductible. Tout au long, nous insistons sur la vérification des prérequis, la lecture des journaux et la compréhension de la gestion des données par Docker afin d'éviter de transformer un petit problème en panne.
Inventaire de la version et de l'environnement
Avant de pouvoir dépanner les interactions avec Docker Hub, vous devez avoir une image claire de votre installation Docker et de l'environnement dans lequel elle s'exécute. Commencez par des commandes en lecture seule qui révèlent l'état actuel sans rien modifier.
Identifier la version de Docker et ses composants
La première commande à exécuter est :
docker version
Cela affiche les versions du client et du serveur (démon), ainsi que les détails du système d'exploitation et de l'architecture. Exemple de sortie :
Client: Docker Engine - Community
Version: 24.0.5
API version: 1.43
Go version: go1.20.6
Git commit: ced0996
Built: Fri Jul 21 13:01:09 2023
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 24.0.5
API version: 1.43 (minimum version 1.12)
Go version: go1.20.6
Git commit: a61e2b4
Built: Fri Jul 21 13:01:09 2023
OS/Arch: linux/amd64
Experimental: false
Points clés à vérifier :
- Compatibilité des versions : certaines fonctionnalités de Docker Hub nécessitent une version minimale de Docker. Par exemple, les builds BuildKit avec
--mount=type=cacherequièrent Docker 18.09 ou supérieur. Si une fonctionnalité échoue, vérifiez que votre version la prend en charge. - Version de l'API : si vous utilisez des scripts ou des SDK Docker, assurez-vous qu'ils sont alignés avec la version de l'API rapportée.
- Fonctionnalités expérimentales : si
Experimental: true, certains comportements peuvent différer. En production, il est généralement plus sûr de désactiver les fonctionnalités expérimentales.
Si vous voyez une erreur Cannot connect to the Docker daemon, le démon n'est peut-être pas en cours d'exécution. Sur Linux, vérifiez avec systemctl status docker et démarrez-le si nécessaire : sudo systemctl start docker. Sur macOS ou Windows, assurez-vous que Docker Desktop est lancé.
Vérifier les conteneurs en cours d'exécution et leur état de santé
Utilisez docker ps pour voir les conteneurs actifs :
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
Exemple de sortie :
NAMES STATUS PORTS
web Up 5 minutes (healthy) 0.0.0.0:8080->80/tcp
db Up 10 minutes 5432/tcp
cache Restarting (1) 2 seconds ago
Recherchez les conteneurs en boucle de crash (Restarting), en mauvaise santé, ou sans mappage de port alors que vous en attendez un. Pour des vérifications de santé plus approfondies, inspectez les conteneurs individuellement :
docker inspect <nom_du_conteneur> --format '{{json .State.Health}}'
Cela renvoie la configuration du health check et les derniers résultats. Exemple :
{"Status":"unhealthy","FailingStreak":3,"Log":[{"Start":"2023-08-01T10:00:00Z","End":"2023-08-01T10:00:05Z","ExitCode":1,"Output":"..."}]}
Si l'état est malsain, examinez les journaux du conteneur (abordés plus loin) pour trouver la cause de l'échec du health check.
Inspecter les détails d'un conteneur
docker inspect est inestimable pour comprendre les montages, les réseaux, les variables d'environnement et d'autres configurations. Pour un conteneur nommé web :
docker inspect web
Concentrez-vous sur ces sections :
Mounts: montre les volumes et les montages bind. Notez les chemins source et destination.NetworkSettings.Networks: montre à quels réseaux le conteneur est attaché et son adresse IP.Config.Env: liste les variables d'environnement ; vérifiez les secrets ou les paramètres de proxy mal configurés.HostConfig.RestartPolicy: détermine si le conteneur redémarre automatiquement.
Vous pouvez extraire des champs spécifiques avec --format, par exemple :
docker inspect web --format '{{json .Mounts}}'
Exemple de sortie :
[{"Type":"volume","Name":"app_data","Source":"/var/lib/docker/volumes/app_data/_data","Destination":"/var/lib/app","Driver":"local","Mode":"z","RW":true,"Propagation":""}]
Cela montre que les données sont stockées dans un volume nommé, ce qui a des implications pour la sauvegarde et la persistance.
Vérifier le contexte Docker et la configuration du registre
Si vous travaillez avec plusieurs environnements (local, distant, cloud), assurez-vous d'utiliser le contexte Docker prévu :
docker context ls
Exemple :
NAME DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
default * Current DOCKER_HOST based configuration unix:///var/run/docker.sock swarm
remote Remote Docker host ssh://user@myhost:22
Le * marque le contexte actif. Pour changer de contexte : docker context use remote.
Pour l'authentification et la configuration du registre, inspectez ~/.docker/config.json (ou le chemin défini dans DOCKER_CONFIG). Ce fichier stocke les identifiants et peut contenir des paramètres de proxy ou de miroir. Exemple (expurgé) :
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "base64_encoded_credentials"
}
},
"proxies": {
"default": {
"httpProxy": "http://proxy.example.com:3128",
"httpsProxy": "http://proxy.example.com:3128",
"noProxy": "localhost,127.0.0.1"
}
}
}
Des proxys mal configurés peuvent faire échouer les pulls Docker Hub, en particulier dans les environnements d'entreprise.
Vérifier la configuration de la persistance des données
De nombreux problèmes Docker Hub impliquent indirectement les données des conteneurs. Assurez-vous que vos conteneurs stockent les données persistantes dans des volumes ou des montages bind, et non dans la couche inscriptible du conteneur. Si les données sont écrites dans le système de fichiers du conteneur, elles seront perdues lorsque le conteneur sera supprimé.
Pour voir tous les volumes :
docker volume ls
Pour inspecter le point de montage et les libellés d'un volume :
docker volume inspect app_data
Pour tester la persistance : arrêtez et supprimez le conteneur, recréez-le, et vérifiez si les données existent toujours. Par exemple, avec un conteneur de base de données :
# Démarrer un conteneur PostgreSQL avec un volume nommé
docker run -d --name db -v app_data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=mysecret postgres:15
# Créer une table de test et insérer des données (à l'intérieur du conteneur)
docker exec -it db psql -U postgres -c "CREATE TABLE test (id int); INSERT INTO test VALUES (1);"
# Arrêter et supprimer le conteneur
docker stop db
docker rm db
# Recréer le conteneur avec le même volume
docker run -d --name db -v app_data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=mysecret postgres:15
# Vérifier si les données persistent
docker exec -it db psql -U postgres -c "SELECT * FROM test;"
Si la requête renvoie la ligne, la persistance fonctionne. Sinon, le volume n'a pas été utilisé correctement.
Résumé : inventaire avant action
Effectuez ces étapes avant d'apporter des modifications :
- Exécutez
docker versionet notez les versions client/serveur. - Listez les conteneurs en cours d'exécution avec
docker pset vérifiez les états. - Inspectez un conteneur suspect avec
docker inspect. - Confirmez le contexte Docker avec
docker context ls. - Examinez
~/.docker/config.jsonpour les paramètres de proxy et d'authentification. - Validez la persistance des données avec un test de redémarrage.
Cet inventaire établit une base de référence et révèle souvent la cause racine sans investigation supplémentaire.
Chemin de configuration sûre
Les changements de configuration doivent être effectués avec prudence, surtout en production. Cette section couvre les pratiques sûres pour configurer l'accès à Docker Hub, y compris l'authentification, les miroirs de registre et les paramètres réseau.
Gérer les identifiants Docker Hub
Utilisez docker login pour vous authentifier auprès de Docker Hub. La commande de base :
docker login
Cela demande le nom d'utilisateur et le mot de passe et stocke les identifiants dans ~/.docker/config.json après une authentification réussie. Exemple d'interaction :
Username: myuser
Password:
Login Succeeded
Pour une connexion non interactive (par exemple, en CI), passez les identifiants via des variables d'environnement ou stdin :
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
Important : ne codez jamais en dur les mots de passe dans les scripts. Utilisez la gestion des secrets (variables secrètes CI, Vault, etc.).
Après la connexion, vérifiez l'état d'authentification en listant le fichier de configuration :
cat ~/.docker/config.json
Recherchez la section auths. Le champ auth contient un nom d'utilisateur:mot de passe encodé en base64. Pour décoder (uniquement pour le dépannage) :
echo "base64_string" | base64 -d
Note de sécurité : si les identifiants sont compromis, révoquez-les immédiatement sur Docker Hub et régénérez des jetons. Utilisez des jetons d'accès avec une portée limitée pour les systèmes automatisés plutôt que votre mot de passe principal.
Configurer un miroir de registre
Dans certains environnements (Internet lent, réseaux restreints), extraire des images directement depuis Docker Hub est lent ou bloqué. Un miroir de registre (par exemple, un cache local comme Docker Registry ou un miroir de fournisseur cloud) peut aider. Configurez-le dans le fichier de configuration du démon Docker, généralement /etc/docker/daemon.json sur Linux :
{
"registry-mirrors": ["https://mirror.example.com"]
}
Après modification, redémarrez le démon Docker :
sudo systemctl restart docker
Vérifiez que le miroir est utilisé en extrayant une image :
docker pull alpine:latest
Si le miroir fonctionne, le pull devrait être rapide et aucune erreur n'apparaît. Vous pouvez consulter les journaux du démon pour l'utilisation du miroir :
journalctl -u docker.service | grep mirror
Risques : des erreurs de configuration du miroir peuvent empêcher complètement les pulls. Testez d'abord dans un environnement non productif. De plus, les miroirs peuvent ne pas disposer de toutes les images ou tous les tags ; le comportement de repli est d'essayer Docker Hub directement si le miroir échoue, mais cela peut entraîner des retards.
Configurer un proxy pour le démon Docker
Si votre réseau nécessite un proxy pour atteindre Docker Hub, configurez le démon Docker pour l'utiliser. Dans /etc/systemd/system/docker.service.d/http-proxy.conf :
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:3128"
Environment="HTTPS_PROXY=http://proxy.example.com:3128"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com"
Ensuite, rechargez systemd et redémarrez Docker :
sudo systemctl daemon-reload
sudo systemctl restart docker
Vérifiez en consultant l'environnement du démon :
sudo systemctl show docker --property Environment
Si les paramètres de proxy sont incorrects, docker pull échouera avec des délais d'attente ou une connexion refusée. Assurez-vous que NO_PROXY inclut les adresses des registres internes pour éviter de contourner les registres locaux.
Comprendre les limites de débit de Docker Hub
Les utilisateurs anonymes et gratuits authentifiés sont soumis à des limites de débit de pull sur Docker Hub (selon les politiques récentes). Utilisateurs anonymes : 100 pulls par 6 heures par IP ; utilisateurs gratuits authentifiés : 200 pulls par 6 heures par utilisateur. Les plans payants ont des limites plus élevées.
Pour vérifier votre statut actuel de limite de débit, utilisez l'API Docker Hub :
TOKEN=$(curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:library/alpine:pull" | jq -r .token)
curl -I -H "Authorization: Bearer $TOKEN" https://registry-1.docker.io/v2/library/alpine/manifests/latest
Recherchez des en-têtes comme RateLimit-Limit et RateLimit-Remaining. Exemple :
rateLimit-Limit: 200;w=21600
rateLimit-Remaining: 150;w=21600
Si vous atteignez les limites, envisagez :
- Vous authentifier avec votre compte Docker Hub (limite plus élevée).
- Utiliser un proxy de cache ou un miroir de registre.
- Passer à un plan payant.
- Planifier les pulls pendant les heures creuses.
Éviter les pièges de configuration courants
- Stocker les identifiants de manière non sécurisée : assurez-vous que les permissions du fichier
config.jsonsont restrictives (par exemple, 600). Sur les systèmes partagés, utilisez un gestionnaire d'identifiants comme Docker Credential Helper pour votre plateforme. - Modifier daemon.json incorrectement : validez toujours la syntaxe JSON avant de redémarrer Docker. Utilisez
jqou un linter JSON. Un fichier mal formé peut empêcher le démon de démarrer. - Écraser des environnements : lors de la configuration du proxy dans systemd, ne remplacez pas les autres variables d'environnement. Ajoutez de nouvelles variables au lieu de remplacer.
- Ne pas documenter les changements : tenez un journal des modifications de configuration avec des horodatages et des étapes de restauration. Si un changement cause des problèmes, revenez rapidement en arrière.
Résumé de la configuration sûre
- Utilisez
docker loginavec des jetons, pas des mots de passe, pour l'automatisation. - Configurez les miroirs de registre et les proxys dans les paramètres du démon, testez avant la production.
- Surveillez les limites de débit et planifiez en conséquence.
- Sauvegardez toujours les fichiers de configuration avant de les modifier.
Vérification et diagnostic
Cette section se concentre sur la vérification de la connectivité à Docker Hub, l'extraction et l'envoi d'images, et le diagnostic des erreurs courantes avec des commandes pratiques.
Tester la connectivité à Docker Hub
La connectivité de base peut être testée avec docker pull et docker push. Pour un pull minimal :
docker pull hello-world
Sortie attendue :
Using default tag: latest
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:...
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
Si cela échoue, vous verrez des erreurs comme :
Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on 192.168.1.1:53: no such host(problème DNS)Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)(délai d'attente/proxy)Error response from daemon: denied: requested access to the resource is denied(authentification/permissions)
Pour des diagnostics réseau avancés, utilisez curl pour vérifier l'API du registre :
curl -I https://registry-1.docker.io/v2/
Une réponse réussie inclut 200 OK ou 401 Unauthorized (indiquant une connectivité mais nécessitant une authentification). Un délai d'attente indique un problème de pare-feu ou de proxy.
Lister et rechercher des images
Pour voir les images disponibles localement :
docker images
Cela montre le dépôt, le tag, l'ID de l'image, la date de création et la taille. Si une image est manquante, vous devez la récupérer. Pour rechercher Docker Hub depuis la CLI (bien que limité) :
docker search nginx
Exemple de sortie :
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 17800 [OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS... 2000
Remarque : docker search peut ne pas afficher tous les résultats. Pour une recherche complète, utilisez le site web de Docker Hub ou l'API.
Extraire des tags et des digests spécifiques
Une erreur courante est de récupérer latest et d'obtenir une version inattendue. Spécifiez toujours un tag ou un digest pour la reproductibilité. Exemple :
docker pull nginx:1.25-alpine
Cela extrait l'image Nginx 1.25 basée sur Alpine. Pour extraire par digest (le plus précis) :
docker pull nginx@sha256:abcdef123456...
Comment trouver le digest : sur la page web de Docker Hub, cliquez sur le tag et copiez le digest. Ou utilisez docker manifest inspect :
docker manifest inspect nginx:1.25-alpine
Extrait de sortie :
{
"manifests": [
{
"digest": "sha256:...",
"platform": {
"architecture": "amd64",
"os": "linux"
}
},
...
]
}
Vérifier l'intégrité des images et les couches
Inspectez les couches et les métadonnées d'une image :
docker image inspect nginx:1.25-alpine
Cela renvoie un JSON avec RootFS.Layers, l'environnement, et plus encore. Pour voir l'historique (comment l'image a été construite) :
docker history nginx:1.25-alpine
Exemple :
IMAGE CREATED CREATED BY SIZE COMMENT
2e4c2e157d06 4 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon... 0B
...
Cela aide à vérifier que l'image est bien celle attendue, et non un substitut malveillant.
Tester le push vers Docker Hub
Avant de pousser, assurez-vous d'être connecté et d'avoir les permissions correctes sur le dépôt. D'abord, taguez votre image pour votre nom d'utilisateur Docker Hub :
docker tag myapp:latest myhubusername/myapp:1.0
Ensuite, poussez :
docker push myhubusername/myapp:1.0
La sortie montre la progression du téléversement des couches. Erreurs de push courantes :
denied: requested access to the resource is denied- non connecté ou permissions insuffisantes.manifest invalidoublob upload invalid- corruption d'image ; reconstruisez et réessayez.413 Request Entity Too Large- image trop volumineuse ; envisagez de nettoyer les couches.
Lire les journaux des conteneurs pour le diagnostic
Lorsqu'un conteneur échoue, les journaux sont votre source principale. Utilisez docker logs avec des options :
docker logs <nom_du_conteneur> --tail 50 -f
--tail 50: affiche les 50 dernières lignes-f: suit la sortie (en direct)--timestamps: affiche les horodatages
Exemple de sortie d'une application en échec :
2024-01-01T12:00:00Z [ERROR] Failed to connect to database: connection refused
Si les journaux montrent des problèmes de connexion, vérifiez la configuration réseau, les identifiants et si les services dépendants sont en cours d'exécution. Pour les conteneurs avec plusieurs processus, vous devrez peut-être spécifier un flux : --stdout ou --stderr.
Utiliser les événements Docker pour la surveillance en temps réel
Les événements Docker peuvent révéler ce qui se passe en arrière-plan :
docker events --filter 'type=container' --filter 'event=die'
Cela montre quand les conteneurs s'arrêtent. Vous pouvez également filtrer par image, libellé, etc. En dépannage, exécutez cette commande dans un terminal séparé pendant que vous reproduisez le problème pour capturer les événements.
Résumé des commandes de vérification
docker pull/docker pushpour tester l'accès au registre.docker search/docker imagespour inventorier les images.docker manifest inspectpour vérifier les architectures multiples et les digests.docker image inspect/docker historypour valider le contenu de l'image.docker logs/docker eventspour les diagnostics d'exécution.
Modes de défaillance et récupération
Malgré une configuration soignée, des échecs surviennent. Cette section décrit les modes de défaillance courants de Docker Hub, comment les identifier et les étapes de récupération.
Échecs d'authentification
Symptôme : docker pull ou push renvoie Error response from daemon: Get https://registry-1.docker.io/v2/: unauthorized: authentication required ou denied: requested access to the resource is denied.
Causes :
- Non connecté ou identifiants expirés.
- Utilisation d'un nom d'utilisateur ou d'un jeton incorrect.
- Tentative d'accès à un dépôt privé sans permission.
Diagnostic :
docker login
Si la connexion échoue, vérifiez le nom d'utilisateur/mot de passe (pour l'authentification par mot de passe) ou la validité du jeton (pour les jetons). Pour les jetons, créez un nouveau jeton depuis les paramètres de Docker Hub.
Vérifiez que l'authentification est stockée :
docker system info | grep Username
Ou inspectez le fichier de configuration :
cat ~/.docker/config.json | grep auth
Récupération :
- Reconnectez-vous avec
docker loginen utilisant les identifiants corrects. - Assurez-vous que l'utilisateur a les bonnes permissions sur le dépôt (par exemple, accès en écriture pour le push).
- Si vous utilisez CI, vérifiez que les secrets sont correctement définis et non expirés.
- Pour Docker Desktop, redémarrez-le ; parfois les identifiants ne sont pas rafraîchis.
Limite de débit dépassée
Symptôme : le pull échoue avec toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit.
Causes : dépassement des limites de pull anonymes ou du niveau gratuit.
Diagnostic : vérifiez les en-têtes de réponse comme décrit dans la section précédente. Alternativement, le message d'erreur lui-même indique le problème.
Récupération :
- Authentifiez-vous avec votre compte Docker Hub (augmente la limite si compte gratuit).
- Si vous atteignez toujours la limite, envisagez de passer à Pro/Team.
- Implémentez un cache de registre local ou un miroir pour réduire les pulls Docker Hub.
- Répartissez les pulls dans le temps ou sur différentes IP (non recommandé mais possible).
- Utilisez des digests spécifiques pour éviter de re-télécharger le même tag d'image.
Problèmes de réseau et de proxy
Symptôme : le pull/push se bloque, expire ou échoue avec des erreurs de connexion (dial tcp: lookup registry-1.docker.io: no such host, Client.Timeout exceeded, proxyconnect tcp: dial tcp: connection refused).
Causes : mauvaise configuration DNS, pare-feu bloquant, paramètres de proxy incorrects, restrictions du réseau d'entreprise.
Diagnostic :
- Testez la connectivité du conteneur : exécutez un conteneur avec des outils réseau, par exemple
docker run --rm alpine nslookup registry-1.docker.io - Depuis l'hôte,
curl -v https://registry-1.docker.io/v2/pour voir où cela échoue. - Vérifiez les paramètres de proxy du démon Docker :
sudo systemctl show docker --property Environment - Vérifiez la résolution DNS :
dig registry-1.docker.ioounslookup.
Récupération :
- Corrigez la configuration du proxy dans le démon ou l'environnement.
- Assurez-vous que le pare-feu autorise le HTTPS sortant sur le port 443 vers registry-1.docker.io et auth.docker.io.
- Si vous utilisez un DNS interne, assurez-vous qu'il peut résoudre les noms externes ou configurez un redirecteur.
- Pour les réseaux d'entreprise, travaillez avec l'équipe réseau pour mettre en liste blanche les domaines Docker Hub.
Épuisement de l'espace disque
Symptôme : le pull échoue avec no space left on device ou write /var/lib/docker/...: no space left on device ; le démon Docker peut devenir non réactif.
Causes : accumulation d'images, de conteneurs, de volumes, de cache de build.
Diagnostic :
docker system df
Exemple de sortie :
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 54 12 15.2GB 9.8GB (64%)
Containers 30 5 2.1GB 1.9GB (90%)
Local Volumes 10 2 3.4GB 2.8GB (82%)
Build Cache 150 0 4.5GB 4.5GB (100%)
Récupération :
- Supprimez les images inutilisées :
docker image prune -a(attention : supprime toutes les images inutilisées). - Supprimez les conteneurs arrêtés :
docker container prune. - Supprimez les volumes inutilisés :
docker volume prune(avertissement : supprime les données). - Supprimez le cache de build :
docker builder prune. - Ou exécutez
docker system prune -a --volumespour tout nettoyer (utilisez avec une extrême prudence). - Prévenez la récurrence : planifiez un nettoyage régulier, ou utilisez la rotation des journaux pour les conteneurs.
Échecs de pull d'image dus à des tags ou digests manquants
Symptôme : manifest for image:tag not found ou unknown: repository name or tag not found.
Causes : faute de frappe dans le tag, image supprimée de Docker Hub, ou dépôt privé sans accès.
Diagnostic : vérifiez l'interface web de Docker Hub pour voir si le tag existe. Utilisez docker manifest inspect pour voir les tags disponibles (peut nécessiter une authentification pour les dépôts privés).
Récupération :
- Corrigez l'orthographe du tag.
- Utilisez un autre tag ou digest qui existe.
- Pour les dépôts privés, assurez-vous d'avoir accès et d'être connecté.
Le conteneur échoue après une mise à jour
Symptôme : après avoir extrait une nouvelle image et redémarré le conteneur, l'application plante ou se comporte différemment.
Causes : changements cassants dans l'image, dépendances manquantes, incompatibilité de configuration, ou changements de format de données.
Diagnostic :
- Consultez les journaux du conteneur :
docker logs <conteneur> --tail 50. - Comparez les couches des anciennes et nouvelles images :
docker history <ancienne_image>vsdocker history <nouvelle_image>. - Consultez les notes de version sur Docker Hub pour les problèmes connus.
- Inspectez les variables d'environnement et les montages :
docker inspect <conteneur>.
Récupération :
- Revenez à l'ancien tag d'image : mettez à jour votre orchestration ou la commande
docker runpour utiliser l'ancien tag, redémarrez. - Si les données ont été migrées, assurez-vous de la compatibilité.
- Testez la nouvelle image en staging avant la production.
- Utilisez des tags d'image immuables ou épinglés par digest pour éviter les mises à jour inattendues.
Bonnes pratiques de récupération
- Gardez toujours un plan de restauration : sachez quel tag d'image ou quelle configuration utiliser pour revenir en arrière.
- Sauvegardez régulièrement les volumes de données importants.
- Utilisez
docker eventset les journaux pour créer une chronologie des changements. - Documentez les incidents et leur résolution pour référence future.
Pièges courants et comment les éviter
Même les utilisateurs expérimentés rencontrent des pièges. Voici des erreurs fréquentes avec Docker Hub et comment les éviter.
1. Utiliser le tag latest en production
Pourquoi cela arrive : commodité ; de nombreux tutoriels utilisent latest. Conséquences : mises à jour inattendues, changements cassants, problèmes de reproductibilité. Évitement : spécifiez toujours un tag de version ou un digest spécifique. Par exemple, utilisez nginx:1.25-alpine au lieu de nginx:latest. Si vous avez besoin de stabilité, épinglez à un digest.
2. Ne pas gérer les identifiants de manière sécurisée
Pourquoi cela arrive : coder en dur les mots de passe dans les scripts ou partager config.json. Conséquences : fuites d'identifiants, accès non autorisé. Évitement : utilisez les secrets Docker, les variables d'environnement ou les gestionnaires d'identifiants. En CI, utilisez les fonctionnalités de gestion des secrets. Faites tourner les jetons régulièrement et utilisez des comptes à moindre privilège.
3. Ignorer les limites de débit
Pourquoi cela arrive : ne pas être conscient des limites ou supposer des pulls illimités. Conséquences : les builds échouent de manière inattendue, surtout en CI avec de nombreux pulls. Évitement : authentifiez-vous toujours, surveillez l'utilisation, utilisez un miroir de cache tel que le cache pull-through de Docker Hub ou un registre local.
4. Ne pas nettoyer les ressources Docker
Pourquoi cela arrive : le développement continu laisse des images, conteneurs et volumes inutilisés. Conséquences : l'espace disque se remplit, le démon ralentit, erreurs potentielles no space left. Évitement : planifiez régulièrement docker system prune ou utilisez des outils comme docker-gc. Configurez la rotation des journaux pour les conteneurs afin d'éviter des fichiers journaux énormes.
5. Mal configurer les proxys et miroirs
Pourquoi cela arrive : copier des extraits de configuration sans comprendre l'environnement. Conséquences : échecs de pull, performances lentes, incapacité à atteindre les registres internes. Évitement : testez les changements de configuration dans un environnement non productif d'abord. Documentez les paramètres de proxy et de miroir. Assurez-vous que NO_PROXY inclut les adresses internes.
6. Ne pas lire les journaux avant d'agir
Pourquoi cela arrive : la pression du temps conduit à des redémarrages ou des changements immédiats. Conséquences : destruction de preuves ; aggravation de la situation. Évitement : exécutez toujours docker logs, docker events et docker inspect avant d'apporter des modifications. Prenez des notes ou des captures d'écran (expurgées) de l'état.
7. Négliger la persistance des données
Pourquoi cela arrive : supposer que les données sont en sécurité dans un conteneur ; ne pas comprendre les volumes. Conséquences : perte de données lors de la recréation ou de la mise à jour du conteneur. Évitement : utilisez des volumes nommés ou des montages bind pour toute donnée devant persister. Sauvegardez régulièrement les volumes. Testez les procédures de restauration.
8. Ne pas surveiller le statut de Docker Hub
Pourquoi cela arrive : supposer que les échecs sont toujours locaux. Conséquences : perdre du temps à dépanner alors que Docker Hub lui-même est en panne. Évitement : vérifiez la page de statut de Docker Hub (https://status.docker.com) ou suivez leurs réseaux sociaux pour les annonces de panne. Utilisez curl pour tester les points de terminaison du registre.
Liste de contrôle opérationnelle
Cette liste de contrôle fournit une séquence reproductible pour dépanner les problèmes Docker Hub de manière quasi-production. Attribuez un responsable pour chaque élément et une fréquence de révision.
Préparation pré-incident (Responsable : Ingénieur DevOps, Fréquence : Mensuelle)
- [ ] Vérifier que la version de Docker et la configuration du démon sont documentées.
- [ ] S'assurer que tous les déploiements de production utilisent des tags d'image ou des digests spécifiques.
- [ ] Tester la procédure de sauvegarde et de restauration pour les volumes de données critiques.
- [ ] Confirmer que les alertes de surveillance sont définies pour l'utilisation des ressources du démon Docker et la santé des conteneurs.
- [ ] Revoir les limites de débit de pull et avoir un plan (miroir, cache) en place.
- [ ] Mettre à jour la documentation pour les étapes de récupération des pannes connues.
Pendant l'incident (Responsable : Opérateur de garde, Fréquence : Selon besoin)
- Observer : exécutez
docker ps,docker images,docker logspour recueillir l'état. Évitez d'apporter des modifications pour l'instant. - Isoler : déterminez si le problème est spécifique à Docker Hub ou à l'ensemble du système. Testez avec
docker pull hello-world. - Diagnostiquer : en fonction des symptômes, utilisez les commandes pertinentes de ce guide pour identifier la cause.
- Atténuer : appliquez la plus petite correction qui restaure le service (par exemple, revenir en arrière sur l'image, corriger le proxy, nettoyer le disque). Gardez une trace des modifications.
- Vérifier : confirmez la correction en réexécutant l'opération qui a échoué. Vérifiez les journaux pour les erreurs.
- Communiquer : informez les parties prenantes si un impact sur le service s'est produit.
Post-incident (Responsable : Chef d'équipe, Fréquence : Dans la semaine)
- [ ] Documenter la cause racine et la résolution dans un rapport d'incident.
- [ ] Mettre à jour les procédures ou les configurations pour prévenir la récurrence.
- [ ] Partager les enseignements avec l'équipe.
- [ ] Ajouter des vérifications automatisées si possible (par exemple, linter la configuration du démon, valider les identifiants).
Exemple de scénario de dépannage détaillé
Problème : un pipeline CI échoue soudainement à pousser des images vers Docker Hub.
Étape 1 : observez les journaux du pipeline. Erreur : denied: requested access to the resource is denied.
Étape 2 : vérifiez les identifiants dans l'environnement CI. Le secret DOCKER_PASSWORD est peut-être périmé. Vérifiez manuellement avec docker login en utilisant les identifiants CI - échec.
Étape 3 : faites tourner le jeton sur Docker Hub pour l'utilisateur CI. Mettez à jour le secret CI avec le nouveau jeton.
Étape 4 : relancez le pipeline. Le push réussit.
Étape 5 : documentez que les jetons expirent tous les 90 jours et définissez un rappel pour les faire tourner avant expiration. Ajoutez une vérification pré-push dans le pipeline pour valider la connexion.
Résumé de la liste de contrôle
- La préparation est essentielle : révisions et sauvegardes régulières.
- Pendant les incidents, suivez une approche structurée : observer, isoler, diagnostiquer, atténuer, vérifier.
- Après l'incident, apprenez et améliorez-vous.
Conclusion
Dépanner efficacement Docker Hub nécessite un mélange d'observation systématique, de compréhension approfondie des rouages de Docker et de gestion prudente des changements. En inventoriant votre environnement, en configurant de manière sûre, en vérifiant avec des commandes concrètes et en connaissant les modes de défaillance courants et leurs récupérations, vous pouvez résoudre les problèmes rapidement et en prévenir beaucoup.
Ce guide vous a fourni des exemples pratiques et des commandes pour traiter la connectivité Docker Hub, l'authentification, les limites de débit, l'utilisation du disque et les erreurs de configuration. Rappelez-vous de toujours observer avant de modifier, de limiter le rayon d'impact, de protéger les données sensibles et de documenter vos étapes.
Comme prochaine étape, choisissez une vérification à faible risque de cet article, comme extraire une image de test avec un tag spécifique ou vérifier vos en-têtes de limite de débit, et exécutez-la dans votre environnement. Comparez le résultat avec la sortie attendue donnée ici. Si quelque chose diffère, suivez les chemins de diagnostic que nous avons décrits. Avec la pratique, le dépannage de Docker Hub devient une compétence simple, presque mécanique, qui maintient vos flux de travail conteneurisés en bon état de fonctionnement.