Fehlerbehebung bei Docker-Berechtigungsproblemen

Die Ausführung von Anwendungen mit Docker als tägliche Routine kann zu einem Albtraum werden, wenn Sie auf einen Fehler wie Docker-Berechtigung verweigert stoßen, während Sie versuchen, eine Verbindung herzustellen. Aber keine Sorge, dieser Artikel wird Ihnen helfen, schnell wieder einsatzbereit zu sein.

In diesem Tutorial erfahren Sie viele Möglichkeiten, um die gefürchtete Docker-Berechtigungsverweigerungsfehlermeldung zu beheben.

Voraussetzungen

Dieses Tutorial umfasst praktische Demonstrationen. Um mitzumachen, stellen Sie sicher, dass Sie folgendes haben:

  • Die Demos in diesem Tutorial laufen unter Ubuntu 20.04, aber auch andere Linux-Distributionen funktionieren.
  • Der Docker-Engine, mit der im Tutorial Version 20.10.8, Build 3967b7d läuft.

Ausführen von erhöhten Docker-Befehlen

Viele Faktoren könnten zu einem Berechtigungsfehler verweigert führen, während Sie eine Verbindung zu Docker herstellen. Einer dieser Faktoren ist, dass Sie möglicherweise Docker-Befehle ausführen, ohne den sudo-Befehl voranzustellen. Der sudo-Befehl ist das, was Ihnen erhöhte administrative Rechte zusammen mit Sicherheitsprivilegien beim Ausführen von Befehlen gibt.

Unten sehen Sie den gefürchteten Berechtigungsfehler verweigert, während Sie versuchen, einen docker-Befehl auszuführen.

Running into a permission denied error

Starten Sie Ihr Terminal und fügen Sie dem unten stehenden docker-Befehl sudo hinzu, um das hello-world-Docker-Image auszuführen. Da Sie einen erhöhten Befehl ausführen, müssen Sie Ihr Passwort eingeben, um fortzufahren.

sudo docker run hello-world

Sie sehen eine Ausgabe ähnlich der unten gezeigten, die anzeigt, dass Docker korrekt installiert ist.

Running Elevated (sudo) Docker Commands

Neustart des Docker-Engines

Wenn das Ausführen erhöhter Docker-Befehle den Berechtigungsfehler nicht behebt, überprüfen Sie, ob Ihr Docker Engine ausgeführt wird. Ähnlich wie beim Ausführen eines docker-Befehls ohne den sudo-Befehl löst ein gestoppter Docker Engine den Berechtigungsfehler aus. Wie beheben Sie den Fehler? Durch Neustart Ihres Docker-Engines.

Führen Sie den unten stehenden systemctl-Befehl aus, um den Status des Docker-Engines (status docker) zu bestätigen und ob er läuft.

sudo systemctl status docker

Unten sehen Sie, dass der Docker-Engine anhand des zurückgegebenen Status aktiv ist (active (running)).

Displaying Docker Engine status

Wenn der Docker-Engine nicht aktiv ist, führen Sie den systemctl-Befehl unten aus, um den Docker-Engine zu starten (start docker).

sudo systemctl start docker

Jetzt führen Sie den Hello-World-Docker-Befehl aus, wie Sie es im Abschnitt „Ausführen von erhöhten Docker-Befehlen“ getan haben, um zu überprüfen, ob der Fehler behoben ist.

sudo docker run hello-world

Hinzufügen eines Benutzerkontos zu einer Gruppe mit Nicht-Root-Benutzerzugriff

Sie haben bestätigt, dass Ihr Docker-Motor funktioniert, erhalten jedoch immer noch einen Docker-Permission Denied-Fehler? Wenn ja, müssen Sie Ihr Benutzerkonto zu einer Gruppe mit Nicht-Root-Benutzerzugriff hinzufügen. Warum? Weil jeder Docker-Befehl, den Sie auf einer Linux-Maschine außerhalb der Benutzergruppe ausführen, einen Permission Denied-Fehler auslöst.

  1. Führen Sie den folgenden groupadd-Befehl aus, um eine neue Gruppe namens docker zu erstellen. Geben Sie Ihr Passwort ein, um den Befehl fortzusetzen.
sudo groupadd docker

Wenn die Docker-Gruppe in der Benutzergruppe existiert, sehen Sie eine Ausgabe wie unten.

Creating a New Group Named ‘docker’

2. Führen Sie anschließend den usermod-Befehl aus, bei dem die -aG-Optionen dem Befehl mitteilen, Ihr Benutzerkonto (programmer) zur (docker)-Gruppe hinzuzufügen. Dieser Befehl bewirkt, dass Ihr Benutzerkonto keinen Rootzugriff hat.

sudo usermod -aG docker programmer

3. Führen Sie den folgenden newgrp-Befehl aus, um die aktuelle reale Gruppen-ID auf die docker-Gruppe zu ändern.

Führen Sie diesen Befehl jedes Mal aus, wenn Sie Docker als Nicht-Root-Benutzer ausführen möchten.

sudo newgrp docker 

4. Führen Sie abschließend das Hello-World-Docker-Image erneut aus, um zu bestätigen, dass Sie den Fehler nicht mehr sehen. Wenn Sie zu diesem Zeitpunkt immer noch einen Fehler erhalten, erwägen Sie, dem docker.sock-Datei mehr Zugriff zu geben. Die docker.sock-Datei ist der UNIX-Socket, ein Weg, um Prozessinformationen zwischen dem Benutzer und dem System zu kommunizieren, auf den der Docker-Daemon als Einstiegspunkt der Docker-API hört.

Führen Sie den chmod -Befehl unten aus, um allen Benutzern Lese-/Schreibzugriff (666) auf die /var/run/docker.sock-Datei zu gewähren. Führen Sie nun das Hello-World-Docker-Image erneut aus, um zu sehen, ob der Fehler behoben ist.

sudo chmod 666 /var/run/docker.sock

Bearbeiten der Docker-Service-Unit-Datei

Wenn das Ausführen von Docker als Nicht-Root-Benutzer nicht ausreicht, um den Fehler zu beheben, versuchen Sie, die Docker-SystemD-, ein Dienstkontrollsystem, Dienst-Unit-Datei zu bearbeiten. Die Docker-Service-Datei enthält sensible Parameter, die das Verhalten des Docker-Daemons ändern können. Sie können das Standardverhalten der Docker-Unit-Datei durch Hinzufügen eines zusätzlichen Befehls zur Änderung des Dienststandardverhaltens ändern.

1. Führen Sie den folgenden Befehl aus, um die Docker-Service-Unit-Datei in Ihrem bevorzugten Texteditor zu öffnen. In diesem Beispiel wird die Docker-Service-Datei im Nano-Texteditor geöffnet.

sudo nano /usr/lib/systemd/system/docker.service

2. Lokalisieren Sie den Bereich mit dem [Service]-Header in der Docker-Dienst-Unit-Datei, wie unten gezeigt. Kopieren/Einfügen Sie die Befehle unten in die Docker-Dienst-Unit-Datei und speichern Sie die Änderungen.

Unten setzt der Befehl SupplementaryGroups die zusätzlichen Unix-Gruppen, in denen die Prozesse ausgeführt werden. Gleichzeitig bereinigt der Befehl ExecStartPost Operationen, die auch ausgeführt werden, wenn der Dienst nicht korrekt gestartet wird.

SupplementaryGroups=docker    
ExecStartPost=/bin/chmod 666 /var/run/docker.sock
Editing the Docker Service Unit File

3. Führen Sie nun die unten stehenden Befehle aus, um den Docker-Dienst neu zu starten und zu aktivieren. Dadurch können Sie den Docker-Dienst erneut starten, um Fehler zu vermeiden, wenn Sie Docker-Befehle ausführen.

# Lädt alle Docker-Unit-Dateien neu und erstellt den gesamten Abhängigkeitsbaum neu.
sudo systemctl daemon-reload
# Startet den Docker-Dienst neu
sudo systemctl start docker
# Aktiviert den Docker auf Ihrem Computer.
sudo systemctl enable docker

4. Führen Sie schließlich das hello-world-Docker-Image erneut aus und überprüfen Sie, ob Sie immer noch den Berechtigungsfehler erhalten.

Ausführen von Docker im Privilegienmodus

Zu guter Letzt steht auf der Liste zur Behebung des Docker-Berechtigungsfehlers das Ausführen von Docker im Privilegienmodus. Dadurch erhält ein Docker-Container Root-Zugriff auf das System.

Das Ausführen von Docker im privilegierten Modus birgt Risiken und ist anfällig für Angriffe von Hackern. Seien Sie also vorsichtig und führen Sie Docker nur im privilegierten Modus aus, wenn Sie genau wissen, was Sie tun.

1. Führen Sie den folgenden Befehl aus, um alle Docker-Container in Ihrem System aufzulisten, und erhalten Sie die ID des Containers, den Sie ausführen möchten.

sudo docker ls -a
Listing all Docker Containers in the System

2. Führen Sie als nächstes den Befehl docker inspect aus, um zu überprüfen, ob der Container, den Sie ausführen möchten, bereits im privilegierten Modus ist (--format='{{.HostConfig.Privileged}}'). Ersetzen Sie unten CONTAINER_ID durch die tatsächliche Container-ID, die Sie in Schritt eins notiert haben.

docker inspect --format='{{.HostConfig.Privileged}}' CONTAINER_ID

Wenn sich der Container im privilegierten Modus befindet, gibt der Befehl einen true-Wert in die Konsole zurück. Wenn der Befehl jedoch einen falschen Wert zurückgibt, wie unten gezeigt, fahren Sie mit dem nächsten Schritt fort.

Checking if a Container is in Privileged Mode

3. Führen Sie abschließend den Befehl docker unten aus, um den Docker-Container im privilegierten Modus auszuführen (--privileged hello-world).

sudo docker run --privileged hello-world

Schlussfolgerung

In diesem Tutorial haben Sie viele Möglichkeiten gelernt, den Docker Berechtigungsverweigerungsfehler zu lösen, vom Ausführen erhöhter Befehle bis hin zum Ausführen von Docker im privilegierten Modus.

Jetzt wissen Sie, wie Sie einen Fehler beim Erstellen von Docker-basierten Anwendungen beseitigen können; vielleicht möchten Sie auch Ihre Docker-Images jederzeit sauber halten?

Source:
https://adamtheautomator.com/docker-permission-denied/