Comment résoudre l'erreur 'pull access denied' Docker

DockerBeginner
Pratiquer maintenant

Introduction

Docker est une plateforme de conteneurisation puissante qui simplifie le déploiement et la gestion des applications. Cependant, les utilisateurs peuvent parfois rencontrer l'erreur "pull access denied" (accès refusé lors de l'extraction) lorsqu'ils tentent d'extraire des images Docker. Ce tutoriel complet vous guidera à travers la compréhension, le dépannage et la résolution de ce problème courant de Docker.

Tout au long de ce lab, vous apprendrez comment fonctionnent les registres d'images Docker, pourquoi les erreurs d'accès refusé se produisent et développerez des compétences pratiques pour résoudre les problèmes d'authentification. À la fin de ce tutoriel, vous serez en mesure de gérer en toute confiance les problèmes d'accès aux images Docker dans votre flux de travail de conteneurisation.

Comprendre les registres Docker et l'extraction d'images de base

Avant d'explorer l'erreur "pull access denied" (accès refusé lors de l'extraction), comprenons les registres Docker et le fonctionnement de l'extraction d'images.

Qu'est-ce qu'un registre Docker ?

Un registre Docker est un système de stockage pour les images Docker. Il vous permet de pousser (téléverser) et d'extraire (télécharger) des images de conteneurs. Docker Hub est le registre public par défaut, mais il en existe beaucoup d'autres, y compris des registres privés que les organisations utilisent pour stocker des images propriétaires.

Vérifions d'abord si Docker est correctement installé sur votre système. Ouvrez un terminal et exécutez :

docker --version

Vous devriez voir une sortie similaire à :

Docker version 20.10.21, build baeda1f

Extraction d'une image publique depuis Docker Hub

Maintenant, essayons d'extraire une image publique simple depuis Docker Hub. La syntaxe de base pour l'extraction d'images est :

docker pull [registry/][username/]repository[:tag]

Extrayons l'image officielle Alpine Linux, qui est petite et couramment utilisée :

docker pull alpine:latest

Vous devriez voir une sortie similaire à :

latest: Pulling from library/alpine
c158987b0551: Pull complete
Digest: sha256:bc41182d7ef5ffc53a40b044e725193bc10142a1243f395ee852a8d9730fc2ad
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

Cela confirme que vous pouvez extraire avec succès des images publiques. Vérifions que l'image a été téléchargée en listant toutes vos images Docker :

docker images

Vous devriez voir l'image alpine dans la liste :

REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
alpine       latest    9c6f07244728   2 weeks ago    5.54MB

Conventions de nommage des images Docker

Comprendre les conventions de nommage des images Docker est crucial pour résoudre les problèmes d'accès :

  • Registre (Registry) : Le nom d'hôte où se trouve le registre (par défaut, Docker Hub)
  • Nom d'utilisateur/Organisation (Username/Organization) : Le compte qui possède le dépôt (repository)
  • Dépôt (Repository) : Le nom de l'image
  • Tag (Étiquette) : Une version spécifique de l'image (par défaut, "latest")

Par exemple, dans docker.io/nginx:1.21, le registre est docker.io, le dépôt est nginx et l'étiquette est 1.21.

Lorsque vous ne spécifiez pas de registre, Docker suppose que vous utilisez Docker Hub. Lorsque vous ne spécifiez pas de nom d'utilisateur ou d'organisation, Docker recherche dans l'espace de noms "library", qui contient des images officielles.

Rencontre de l'erreur "Pull Access Denied" (accès refusé lors de l'extraction)

Maintenant que vous comprenez les bases de l'extraction d'images Docker, explorons l'erreur "pull access denied" (accès refusé lors de l'extraction). Cette erreur se produit généralement lorsque vous essayez d'extraire une image à laquelle vous n'êtes pas autorisé à accéder.

Création d'un scénario pour rencontrer l'erreur

Essayons d'extraire une image inexistante ou privée pour déclencher délibérément l'erreur "pull access denied". Nous tenterons d'extraire une image privée fictive :

docker pull labex/private-repo:latest

Vous devriez voir un message d'erreur similaire à :

Error response from daemon: pull access denied for labex/private-repo, repository does not exist or may require 'docker login': denied: requested access to the resource is denied

Cette erreur se produit parce que :

  1. Le dépôt n'existe pas
  2. Le dépôt existe mais est privé, et vous n'êtes pas authentifié
  3. Vous êtes authentifié mais n'avez pas la permission d'accéder à ce dépôt

Comprendre l'authentification pour les registres Docker

Docker utilise un système d'authentification simple pour les registres privés. Avant d'extraire des images privées, vous devez vous authentifier à l'aide de la commande docker login :

docker login [registry-url]

Si aucune URL de registre n'est fournie, Docker suppose que vous vous connectez à Docker Hub.

Essayons de nous connecter à Docker Hub (vous pouvez utiliser votre propre compte Docker Hub si vous en avez un, ou simplement voir l'invite et appuyer sur Ctrl+C pour annuler) :

docker login

Vous verrez une invite pour votre nom d'utilisateur et votre mot de passe :

Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username:

Comme nous n'avons pas besoin de nous connecter réellement pour cet exercice, vous pouvez appuyer sur Ctrl+C pour annuler le processus de connexion.

Causes courantes des erreurs "Pull Access Denied"

L'erreur "pull access denied" peut se produire pour plusieurs raisons :

  1. Nom de dépôt incorrect : Vous avez peut-être mal orthographié le nom du dépôt
  2. Le dépôt n'existe pas : Le dépôt auquel vous essayez d'accéder n'existe pas
  3. Authentification requise : Le dépôt est privé et nécessite une connexion
  4. Permissions insuffisantes : Vous êtes authentifié mais n'avez pas les droits d'accès
  5. Limitation du débit (Rate limiting) : Docker Hub limite les extractions pour les utilisateurs non authentifiés

Vérification des journaux du démon Docker

Lors du dépannage des problèmes d'accès, il est souvent utile de vérifier les journaux du démon Docker :

sudo journalctl -u docker | tail -n 20

Cela affiche les 20 dernières lignes des journaux système de Docker, qui peuvent contenir des informations supplémentaires sur l'erreur d'accès refusé.

Résoudre les erreurs "Pull Access Denied"

Maintenant que nous comprenons ce qui cause les erreurs "pull access denied" (accès refusé lors de l'extraction), apprenons à les résoudre. Nous allons passer en revue plusieurs solutions basées sur les causes les plus courantes.

Solution 1 : Vérifier le nom et l'étiquette du dépôt

L'une des causes les plus courantes des erreurs d'accès est simplement l'utilisation d'un nom de dépôt ou d'une étiquette incorrects. Vérifiez toujours l'orthographe du nom de votre image.

Essayons d'extraire une image valide avec une étiquette spécifique :

docker pull nginx:1.21.0

La sortie devrait montrer une extraction réussie :

1.21.0: Pulling from library/nginx
a330b6cecb98: Pull complete
b847ebd0aed4: Pull complete
543e2db69aaf: Pull complete
... (more lines)
Digest: sha256:2f1cd90e00fe2a0aa8969938c6a4135443ac6c7e50d255a54b57ba1a21086ce3
Status: Downloaded newer image for nginx:1.21.0
docker.io/library/nginx:1.21.0

Solution 2 : S'authentifier auprès du registre

Si vous essayez d'accéder à un dépôt privé, vous devez d'abord vous authentifier :

docker login [registry-url]

Après une authentification réussie, Docker stocke les informations d'identification dans le fichier de configuration à ~/.docker/config.json. Vérifions si ce fichier existe :

ls -la ~/.docker/

Si vous vous êtes connecté précédemment, vous devriez voir le fichier config.json répertorié.

Solution 3 : Vérifier les limites de débit du registre

Docker Hub impose des limites de débit sur les extractions :

  • Utilisateurs anonymes : 100 extractions toutes les 6 heures par adresse IP
  • Utilisateurs authentifiés : 200 extractions toutes les 6 heures par compte

Si vous atteignez les limites de débit, authentifiez-vous pour augmenter votre limite :

docker login

Solution 4 : Utiliser une URL de registre explicite

Parfois, spécifier l'URL complète du registre peut aider à résoudre les problèmes d'accès :

docker pull docker.io/library/ubuntu:20.04

Ce format explicite aide Docker à identifier correctement le registre auquel se connecter.

Tester votre accès en extrayant une autre image publique

Vérifions que vous pouvez toujours extraire des images publiques en extrayant une image différente :

docker pull hello-world

Vous devriez voir une sortie confirmant une extraction réussie :

Using default tag: latest
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:6e8b6f026e0b9c419ea0fd02d3905dd0952ad1feea67543f525c73a0a790fefb
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

Maintenant, exécutez le conteneur hello-world pour vérifier que tout fonctionne correctement :

docker run hello-world

Vous devriez voir un message de bienvenue de Docker :

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

Liste de contrôle de dépannage

Lorsque vous rencontrez des erreurs "pull access denied", suivez cette liste de contrôle :

  1. Vérifiez que le nom et l'étiquette de l'image sont corrects
  2. Vérifiez si le dépôt existe (recherchez sur Docker Hub)
  3. Authentifiez-vous si le dépôt est privé
  4. Vérifiez les problèmes de limitation de débit
  5. Inspectez les journaux du démon Docker pour des messages d'erreur détaillés
  6. Vérifiez la connectivité réseau au registre

Travailler avec des registres privés

Dans de nombreux scénarios réels, vous devrez travailler avec des registres Docker privés. Ces registres nécessitent une authentification et une gestion minutieuse des informations d'identification. Apprenons à travailler avec eux efficacement.

Types de registres privés

Plusieurs options de registres privés sont disponibles :

  1. Docker Hub Private Repositories (dépôts privés Docker Hub) : Dépôts privés sur Docker Hub
  2. Docker Registry (registre Docker) : Implémentation de registre open-source de Docker
  3. Docker Trusted Registry (DTR) : Fait partie de Docker Enterprise
  4. Registres tiers : Comme AWS ECR, Google Container Registry, GitHub Container Registry, etc.

Configuration d'un registre local simple pour les tests

À des fins d'apprentissage, configurons un registre Docker local. Cela vous aidera à comprendre comment fonctionnent les registres privés :

docker run -d -p 5000:5000 --name registry registry:2

Cette commande démarre un conteneur de registre privé sur le port 5000. Vous devriez voir un ID de conteneur en sortie en cas de succès.

Pousser une image vers votre registre local

Modifions une image existante et poussons-la vers notre registre local :

  1. Tout d'abord, étiquetez une image existante avec l'adresse de notre registre local :
docker tag nginx:1.21.0 localhost:5000/my-nginx:v1
  1. Poussez l'image vers le registre local :
docker push localhost:5000/my-nginx:v1

Vous devriez voir une sortie montrant la progression de la poussée :

The push refers to repository [localhost:5000/my-nginx]
72a69066d2fe: Pushed
1e7cb45d18ab: Pushed
c8db6be2bb1a: Pushed
... (more layers)
v1: digest: sha256:... size: 1570
  1. Maintenant, supprimons l'image locale et essayons de l'extraire de notre registre :
docker image rm localhost:5000/my-nginx:v1
docker pull localhost:5000/my-nginx:v1

Vous devriez voir l'image être extraite avec succès de votre registre local.

Travailler avec l'authentification du registre

Pour les registres privés de production, vous devrez gérer correctement l'authentification. Lors de la connexion à un registre privé, Docker stocke les informations d'identification dans votre fichier de configuration.

Pour vous authentifier auprès d'un registre privé :

docker login [registry-url]

Après l'authentification, vous pouvez extraire des images normalement :

docker pull [registry-url]/[repository]:[tag]

Pour des raisons de sécurité, vous devez vous déconnecter lorsque vous avez terminé :

docker logout [registry-url]

Stocker les informations d'identification du registre en toute sécurité

Pour les systèmes automatisés, il est important de stocker les informations d'identification en toute sécurité. Vous pouvez utiliser :

  1. Docker credential helpers (assistants d'identification Docker)
  2. Variables d'environnement avec docker login
  3. Docker secrets (en mode swarm)

Vérifions le magasin d'informations d'identification actuel :

cat ~/.docker/config.json | grep -v auth

Vous devriez voir les détails de configuration concernant votre configuration Docker.

Nettoyage

Arrêtons et supprimons notre registre de test :

docker stop registry
docker rm registry

Cela supprime le conteneur de registre local que nous avons créé pour les tests.

Meilleures pratiques pour prévenir les problèmes d'accès

Maintenant que vous avez appris à résoudre les erreurs "pull access denied", explorons les meilleures pratiques pour prévenir ces problèmes à l'avenir.

Utiliser des noms d'images entièrement qualifiés

Utilisez toujours des noms d'images entièrement qualifiés pour éviter toute ambiguïté :

docker pull docker.io/library/ubuntu:20.04

Cela indique clairement le registre, le dépôt et l'étiquette auxquels vous tentez d'accéder.

Configurer des assistants d'identification (Credential Helpers)

Les assistants d'identification Docker stockent vos identifiants de registre de manière sécurisée. Installez l'assistant approprié pour votre système d'exploitation :

Pour Ubuntu, vous pouvez utiliser l'assistant d'identification basé sur pass :

sudo apt-get update
sudo apt-get install -y pass

Générez ensuite une clé GPG (à des fins de démonstration, vous pouvez appuyer sur Entrée pour accepter les valeurs par défaut) :

gpg --generate-key

Initialisez pass avec votre ID de clé GPG (remplacez par votre ID de clé réel issu de la sortie précédente) :

pass init "Your GPG Key ID"

Installez l'assistant d'identification Docker :

sudo apt-get install -y docker-credential-pass

Configurer les paramètres par défaut du registre

Vous pouvez configurer les paramètres par défaut du registre dans votre fichier de configuration du démon Docker. Créons une configuration simple :

sudo mkdir -p /etc/docker
echo '{
  "registry-mirrors": ["https://registry-mirror.example.com"]
}' | sudo tee /etc/docker/daemon.json

Note : Ceci est juste un exemple. Vous remplaceriez l'URL du miroir par une URL réelle si nécessaire.

Utiliser Docker Compose pour des déploiements cohérents

Docker Compose permet d'assurer des références d'images cohérentes entre les environnements. Créons un fichier docker-compose.yml simple :

mkdir -p ~/project/compose-demo
cd ~/project/compose-demo

Créez maintenant un fichier docker-compose.yml :

cat > docker-compose.yml << 'EOF'
version: '3'
services:
  web:
    image: nginx:1.21.0
    ports:
      - "8080:80"
  redis:
    image: redis:6.2
EOF

Tout d'abord, assurons-nous que Docker Compose est installé sur votre système :

docker compose version

Si Docker Compose n'est pas installé, vous devrez peut-être l'installer. Sur Ubuntu, vous pouvez l'installer en utilisant :

sudo apt-get update
sudo apt-get install -y docker-compose-plugin

Avec ce fichier, vous pouvez démarrer les deux services avec une seule commande :

docker compose up -d

Vous devriez voir une sortie indiquant la création des conteneurs :

Creating network "compose-demo_default" with the default driver
Creating compose-demo_web_1   ... done
Creating compose-demo_redis_1 ... done

Vérifiez que les services sont en cours d'exécution :

docker compose ps

Vous devriez voir les deux services dans l'état "Up".

Nettoyer votre environnement Docker

Nettoyons notre environnement en arrêtant et en supprimant les conteneurs :

docker compose down
cd ~/project

Ceci arrête et supprime les conteneurs que nous avons créés avec Docker Compose.

Résumé des meilleures pratiques

  • Utilisez toujours des noms d'images entièrement qualifiés
  • Authentifiez-vous avant de tirer des images privées
  • Configurez un stockage sécurisé des identifiants
  • Utilisez Docker Compose pour des déploiements cohérents
  • Auditez régulièrement votre configuration Docker
  • Utilisez des digests d'images pour des références immuables
  • Implémentez des configurations réseau appropriées pour l'accès au registre

En suivant ces meilleures pratiques, vous minimiserez les erreurs "pull access denied" et créerez un environnement conteneurisé plus fiable.

Résumé

Dans ce lab, vous avez appris à comprendre, dépanner et résoudre l'erreur "pull access denied" dans Docker. Vous avez maintenant une expérience pratique avec :

  • La compréhension des registres Docker et des principes fondamentaux de l'extraction d'images
  • L'identification des causes courantes des erreurs "pull access denied"
  • La résolution des problèmes d'accès grâce à une authentification et un dépannage appropriés
  • Le travail avec des registres privés, y compris la configuration d'un registre de test local
  • La mise en œuvre des meilleures pratiques pour prévenir les problèmes d'accès à l'avenir

Ces compétences sont essentielles pour un déploiement et une gestion fluides des conteneurs dans votre environnement Docker. Au fur et à mesure que vous continuerez à travailler avec Docker, vous constaterez qu'une gestion appropriée de l'accès est un aspect fondamental des opérations de conteneurs, en particulier dans les environnements d'entreprise avec des registres privés.

Rappelez-vous les étapes clés pour résoudre les problèmes d'accès :

  1. Vérifiez le nom et l'étiquette de l'image
  2. Vérifiez les exigences d'authentification
  3. Examinez les journaux du démon Docker
  4. Assurez-vous d'une connectivité réseau appropriée
  5. Appliquez les meilleures pratiques pour la gestion des informations d'identification

Vous avez maintenant les connaissances nécessaires pour gérer en toute confiance les défis d'accès aux images Docker dans votre flux de travail de conteneurisation.