So beheben Sie den 'pull access denied' Fehler

DockerBeginner
Jetzt üben

Einführung

Docker ist eine leistungsstarke Containerisierungsplattform, die die Anwendungsbereitstellung und -verwaltung vereinfacht. Benutzer können jedoch manchmal den Fehler 'pull access denied' (Zugriff verweigert beim Abruf) erhalten, wenn sie versuchen, Docker-Images abzurufen. Dieses umfassende Tutorial führt Sie durch das Verständnis, die Fehlerbehebung und die Lösung dieses häufigen Docker-Problems.

In diesem Lab erfahren Sie, wie Docker-Image-Registries funktionieren, warum Zugriffsverweigerungsfehler auftreten und entwickeln praktische Fähigkeiten zur Lösung von Authentifizierungsproblemen. Am Ende dieses Tutorials werden Sie in der Lage sein, Docker-Image-Zugriffsprobleme in Ihrem Containerisierungs-Workflow souverän zu handhaben.

Docker-Registries und grundlegendes Image-Abrufen verstehen

Bevor wir den Fehler "pull access denied" (Zugriff verweigert beim Abruf) untersuchen, wollen wir Docker-Registries und die Funktionsweise des Image-Abrufs verstehen.

Was ist eine Docker-Registry?

Eine Docker-Registry ist ein Speichersystem für Docker-Images. Sie ermöglicht das Pushen (Hochladen) und Pullen (Herunterladen) von Container-Images. Docker Hub ist die standardmäßige öffentliche Registry, aber es gibt viele andere, einschließlich privater Registries, die Unternehmen zur Speicherung proprietärer Images verwenden.

Überprüfen wir zunächst, ob Docker korrekt auf Ihrem System installiert ist. Öffnen Sie ein Terminal und führen Sie aus:

docker --version

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

Docker version 20.10.21, build baeda1f

Abrufen eines öffentlichen Images von Docker Hub

Versuchen wir nun, ein einfaches öffentliches Image von Docker Hub abzurufen. Die grundlegende Syntax zum Abrufen von Images lautet:

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

Laden wir das offizielle Alpine Linux-Image herunter, das klein und häufig verwendet wird:

docker pull alpine:latest

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

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

Dies bestätigt, dass Sie erfolgreich öffentliche Images abrufen können. Überprüfen wir, ob das Image heruntergeladen wurde, indem wir alle Ihre Docker-Images auflisten:

docker images

Sie sollten das Alpine-Image in der Liste sehen:

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

Docker-Image-Namenskonventionen

Das Verständnis der Docker-Image-Namenskonventionen ist entscheidend für die Lösung von Zugriffsproblemen:

  • Registry: Der Hostname, auf dem sich die Registry befindet (Standard ist Docker Hub)
  • Username/Organization: Das Konto, dem das Repository gehört
  • Repository: Der Name des Images
  • Tag: Eine spezifische Version des Images (Standard ist "latest")

Zum Beispiel ist in docker.io/nginx:1.21 die Registry docker.io, das Repository nginx und der Tag 1.21.

Wenn Sie keine Registry angeben, geht Docker davon aus, dass Sie Docker Hub verwenden. Wenn Sie keinen Benutzernamen oder keine Organisation angeben, sucht Docker im "library"-Namespace, der offizielle Images enthält.

Auftreten des Fehlers "Pull Access Denied" (Zugriff verweigert beim Abruf)

Nachdem Sie die Grundlagen des Docker-Image-Abrufs verstanden haben, wollen wir den Fehler "pull access denied" (Zugriff verweigert beim Abruf) untersuchen. Dieser Fehler tritt typischerweise auf, wenn Sie versuchen, ein Image abzurufen, auf das Sie keinen Zugriff haben.

Erstellen eines Szenarios, um den Fehler zu provozieren

Versuchen wir, ein nicht existierendes oder privates Image abzurufen, um den Fehler "pull access denied" (Zugriff verweigert beim Abruf) absichtlich auszulösen. Wir werden versuchen, ein fiktives privates Image abzurufen:

docker pull labex/private-repo:latest

Sie sollten eine Fehlermeldung ähnlich der folgenden sehen:

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

Dieser Fehler tritt auf, weil entweder:

  1. Das Repository nicht existiert
  2. Das Repository existiert, aber privat ist und Sie nicht authentifiziert sind
  3. Sie authentifiziert sind, aber keine Berechtigung zum Zugriff auf dieses Repository haben

Authentifizierung für Docker-Registries verstehen

Docker verwendet ein einfaches Authentifizierungssystem für private Registries. Bevor Sie private Images abrufen, müssen Sie sich mit dem Befehl docker login authentifizieren:

docker login [registry-url]

Wenn keine Registry-URL angegeben wird, geht Docker davon aus, dass Sie sich bei Docker Hub anmelden.

Versuchen wir, uns bei Docker Hub anzumelden (Sie können Ihr eigenes Docker Hub-Konto verwenden, falls Sie eines haben, oder einfach die Eingabeaufforderung sehen und dann Strg+C drücken, um abzubrechen):

docker login

Sie sehen eine Eingabeaufforderung für Ihren Benutzernamen und Ihr Passwort:

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:

Da wir uns für diese Übung nicht tatsächlich anmelden müssen, können Sie Strg+C drücken, um den Anmeldevorgang abzubrechen.

Häufige Ursachen für "Pull Access Denied"-Fehler

Der Fehler "pull access denied" (Zugriff verweigert beim Abruf) kann aus verschiedenen Gründen auftreten:

  1. Falscher Repository-Name: Möglicherweise haben Sie den Repository-Namen falsch geschrieben
  2. Repository existiert nicht: Das Repository, auf das Sie zugreifen möchten, existiert nicht
  3. Authentifizierung erforderlich: Das Repository ist privat und erfordert eine Anmeldung
  4. Unzureichende Berechtigungen: Sie sind authentifiziert, haben aber keine Zugriffsrechte
  5. Ratenbegrenzung (Rate limiting): Docker Hub begrenzt Abrufe für nicht authentifizierte Benutzer

Überprüfen der Docker-Daemon-Protokolle

Bei der Fehlerbehebung von Zugriffsproblemen ist es oft hilfreich, die Docker-Daemon-Protokolle zu überprüfen:

sudo journalctl -u docker | tail -n 20

Dies zeigt die letzten 20 Zeilen der Systemprotokolle von Docker, die möglicherweise zusätzliche Informationen über den Fehler "Zugriff verweigert" enthalten.

Beheben von "Pull Access Denied"-Fehlern

Nachdem wir verstanden haben, was "pull access denied"-Fehler verursacht, wollen wir lernen, wie man sie behebt. Wir werden verschiedene Lösungen basierend auf den häufigsten Ursachen durchgehen.

Lösung 1: Repository-Namen und Tag überprüfen

Eine der häufigsten Ursachen für Zugriffsfehler ist einfach die Verwendung eines falschen Repository-Namens oder Tags. Überprüfen Sie immer Ihren Image-Namen auf Tippfehler.

Versuchen wir, ein gültiges Image mit einem bestimmten Tag abzurufen:

docker pull nginx:1.21.0

Die Ausgabe sollte einen erfolgreichen Abruf zeigen:

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

Lösung 2: Bei der Registry authentifizieren

Wenn Sie versuchen, auf ein privates Repository zuzugreifen, müssen Sie sich zuerst authentifizieren:

docker login [registry-url]

Nach erfolgreicher Authentifizierung speichert Docker die Anmeldeinformationen in der Konfigurationsdatei unter ~/.docker/config.json. Überprüfen wir, ob diese Datei existiert:

ls -la ~/.docker/

Wenn Sie sich zuvor angemeldet haben, sollten Sie die Datei config.json aufgelistet sehen.

Lösung 3: Auf Registry-Ratenbegrenzungen prüfen

Docker Hub legt Ratenbegrenzungen für Abrufe fest:

  • Anonyme Benutzer: 100 Abrufe pro 6 Stunden pro IP-Adresse
  • Authentifizierte Benutzer: 200 Abrufe pro 6 Stunden pro Konto

Wenn Sie an Ratenbegrenzungen stoßen, authentifizieren Sie sich, um Ihr Limit zu erhöhen:

docker login

Lösung 4: Eine explizite Registry-URL verwenden

Manchmal kann die Angabe der vollständigen Registry-URL helfen, Zugriffsprobleme zu lösen:

docker pull docker.io/library/ubuntu:20.04

Dieses explizite Format hilft Docker, korrekt zu identifizieren, mit welcher Registry eine Verbindung hergestellt werden soll.

Testen Ihres Zugriffs durch Abrufen eines anderen öffentlichen Images

Überprüfen wir, ob Sie weiterhin öffentliche Images abrufen können, indem Sie ein anderes Image abrufen:

docker pull hello-world

Sie sollten eine Ausgabe sehen, die einen erfolgreichen Abruf bestätigt:

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

Führen Sie nun den hello-world-Container aus, um zu überprüfen, ob alles korrekt funktioniert:

docker run hello-world

Sie sollten eine Willkommensnachricht von Docker sehen:

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

Checkliste zur Fehlerbehebung

Wenn Sie auf "pull access denied"-Fehler stoßen, befolgen Sie diese Checkliste:

  1. Überprüfen Sie, ob der Image-Name und das Tag korrekt sind
  2. Überprüfen Sie, ob das Repository existiert (Suche auf Docker Hub)
  3. Authentifizieren Sie sich, wenn das Repository privat ist
  4. Überprüfen Sie auf Ratenbegrenzungsprobleme
  5. Untersuchen Sie die Docker-Daemon-Protokolle auf detaillierte Fehlermeldungen
  6. Überprüfen Sie die Netzwerkverbindung zur Registry

Arbeiten mit privaten Registries

In vielen realen Szenarien müssen Sie mit privaten Docker-Registries arbeiten. Diese Registries erfordern Authentifizierung und sorgfältiges Management von Anmeldeinformationen. Lassen Sie uns lernen, wie man effektiv mit ihnen arbeitet.

Arten von privaten Registries

Es gibt verschiedene Optionen für private Registries:

  1. Docker Hub Private Repositories: Private Repositories auf Docker Hub
  2. Docker Registry: Docker's Open-Source-Registry-Implementierung
  3. Docker Trusted Registry (DTR): Teil von Docker Enterprise
  4. Drittanbieter-Registries: Wie AWS ECR, Google Container Registry, GitHub Container Registry usw.

Einrichten einer einfachen lokalen Registry zum Testen

Zu Lernzwecken richten wir eine lokale Docker-Registry ein. Dies hilft Ihnen zu verstehen, wie private Registries funktionieren:

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

Dieser Befehl startet einen privaten Registry-Container auf Port 5000. Sie sollten eine Container-ID-Ausgabe sehen, wenn dies erfolgreich war.

Pushen eines Images in Ihre lokale Registry

Ändern wir ein bestehendes Image und pushen es in unsere lokale Registry:

  1. Zuerst taggen Sie ein bestehendes Image mit unserer lokalen Registry-Adresse:
docker tag nginx:1.21.0 localhost:5000/my-nginx:v1
  1. Pushen Sie das Image in die lokale Registry:
docker push localhost:5000/my-nginx:v1

Sie sollten eine Ausgabe sehen, die den Push-Fortschritt anzeigt:

The push refers to repository [localhost:5000/my-nginx]
72a69066d2fe: Pushed
1e7cb45d18ab: Pushed
c8db6be2bb1a: Pushed
... (more layers)
v1: digest: sha256:... size: 1570
  1. Jetzt entfernen wir das lokale Image und versuchen, es von unserer Registry abzurufen:
docker image rm localhost:5000/my-nginx:v1
docker pull localhost:5000/my-nginx:v1

Sie sollten sehen, dass das Image erfolgreich von Ihrer lokalen Registry abgerufen wird.

Arbeiten mit Registry-Authentifizierung

Für private Produktions-Registries müssen Sie die Authentifizierung ordnungsgemäß handhaben. Wenn Sie sich bei einer privaten Registry anmelden, speichert Docker die Anmeldeinformationen in Ihrer Konfigurationsdatei.

So authentifizieren Sie sich bei einer privaten Registry:

docker login [registry-url]

Nach der Authentifizierung können Sie Images normal abrufen:

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

Aus Sicherheitsgründen sollten Sie sich abmelden, wenn Sie fertig sind:

docker logout [registry-url]

Sicheres Speichern von Registry-Anmeldeinformationen

Für automatisierte Systeme ist die sichere Speicherung von Anmeldeinformationen wichtig. Sie können Folgendes verwenden:

  1. Docker Credential Helpers (Anmeldeinformationshelfer)
  2. Umgebungsvariablen mit docker login
  3. Docker Secrets (im Swarm-Modus)

Überprüfen wir den aktuellen Anmeldeinformationsspeicher:

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

Sie sollten Konfigurationsdetails zu Ihrem Docker-Setup sehen.

Bereinigung

Lassen Sie uns unsere Test-Registry stoppen und entfernen:

docker stop registry
docker rm registry

Dies entfernt den lokalen Registry-Container, den wir zum Testen erstellt haben.

Best Practices zur Vermeidung von Zugriffsproblemen

Nachdem Sie gelernt haben, wie Sie "pull access denied"-Fehler beheben, wollen wir nun Best Practices zur zukünftigen Vermeidung dieser Probleme untersuchen.

Vollqualifizierte Image-Namen verwenden

Verwenden Sie immer vollqualifizierte Image-Namen, um Mehrdeutigkeiten zu vermeiden:

docker pull docker.io/library/ubuntu:20.04

Dies macht deutlich, auf welche Registry, welches Repository und welchen Tag Sie zugreifen möchten.

Credential Helper einrichten

Docker Credential Helper speichern Ihre Registry-Anmeldeinformationen sicher. Installieren Sie den entsprechenden Helper für Ihr Betriebssystem:

Für Ubuntu können Sie den pass-basierten Credential Helper verwenden:

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

Generieren Sie dann einen GPG-Schlüssel (zu Demonstrationszwecken können Sie Enter drücken, um die Standardeinstellungen zu akzeptieren):

gpg --generate-key

Initialisieren Sie pass mit Ihrer GPG-Schlüssel-ID (ersetzen Sie diese durch Ihre tatsächliche Schlüssel-ID aus der vorherigen Ausgabe):

pass init "Your GPG Key ID"

Installieren Sie den Docker Credential Helper:

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

Standard-Registry-Einstellungen konfigurieren

Sie können Standard-Registry-Einstellungen in Ihrer Docker-Daemon-Konfigurationsdatei konfigurieren. Erstellen wir eine einfache Konfiguration:

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

Hinweis: Dies ist nur ein Beispiel. Sie würden die Mirror-URL bei Bedarf durch eine echte ersetzen.

Docker Compose für konsistente Deployments verwenden

Docker Compose hilft, konsistente Image-Referenzen über verschiedene Umgebungen hinweg sicherzustellen. Erstellen wir eine einfache docker-compose.yml-Datei:

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

Erstellen Sie nun eine docker-compose.yml-Datei:

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

Stellen Sie zunächst sicher, dass Docker Compose auf Ihrem System installiert ist:

docker compose version

Wenn Docker Compose nicht installiert ist, müssen Sie es möglicherweise installieren. Unter Ubuntu können Sie es mit folgendem Befehl installieren:

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

Mit dieser Datei können Sie beide Dienste mit einem einzigen Befehl starten:

docker compose up -d

Sie sollten eine Ausgabe sehen, die die Erstellung der Container zeigt:

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

Überprüfen Sie, ob die Dienste ausgeführt werden:

docker compose ps

Sie sollten beide Dienste im Status "Up" sehen.

Ihre Docker-Umgebung bereinigen

Lassen Sie uns unsere Umgebung bereinigen, indem wir die Container stoppen und entfernen:

docker compose down
cd ~/project

Dies stoppt und entfernt die Container, die wir mit Docker Compose erstellt haben.

Zusammenfassung der Best Practices

  • Verwenden Sie immer vollqualifizierte Image-Namen
  • Authentifizieren Sie sich vor dem Pull von privaten Images
  • Richten Sie eine sichere Speicherung von Anmeldeinformationen ein
  • Verwenden Sie Docker Compose für konsistente Deployments
  • Überprüfen Sie regelmäßig Ihre Docker-Konfiguration
  • Verwenden Sie Image-Digests für unveränderliche Referenzen
  • Implementieren Sie geeignete Netzwerkkonfigurationen für den Registry-Zugriff

Durch die Befolgung dieser Best Practices minimieren Sie "pull access denied"-Fehler und schaffen eine zuverlässigere containerisierte Umgebung.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie man den Fehler "pull access denied" in Docker versteht, behebt und löst. Sie haben jetzt praktische Erfahrung mit:

  • dem Verständnis von Docker-Registries und den Grundlagen des Image-Abrufs
  • der Identifizierung der häufigsten Ursachen für "pull access denied"-Fehler
  • der Behebung von Zugriffsproblemen durch ordnungsgemäße Authentifizierung und Fehlerbehebung
  • der Arbeit mit privaten Registries, einschließlich der Einrichtung einer lokalen Test-Registry
  • der Implementierung von Best Practices zur Vermeidung von Zugriffsproblemen in der Zukunft

Diese Fähigkeiten sind für eine reibungslose Container-Bereitstellung und -Verwaltung in Ihrer Docker-Umgebung unerlässlich. Wenn Sie weiterhin mit Docker arbeiten, werden Sie feststellen, dass das richtige Zugriffsmanagement ein grundlegender Aspekt des Containerbetriebs ist, insbesondere in Unternehmensumgebungen mit privaten Registries.

Denken Sie an die wichtigsten Schritte zur Lösung von Zugriffsproblemen:

  1. Überprüfen Sie den Image-Namen und das Tag
  2. Überprüfen Sie die Authentifizierungsanforderungen
  3. Überprüfen Sie die Docker-Daemon-Protokolle
  4. Stellen Sie eine ordnungsgemäße Netzwerkverbindung sicher
  5. Wenden Sie Best Practices für das Anmeldeinformationsmanagement an

Sie verfügen jetzt über das Wissen, um Docker-Image-Zugriffsprobleme in Ihrem Containerisierungs-Workflow souverän zu bewältigen.