Behebung von Docker 'Got permission denied while trying to connect to the Docker daemon socket'

English Deutsch

Problem:

Du führst einen Befehl wie docker ps aus, erhältst aber diese Fehlermeldung:

docker_permission_error.txt
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/json: dial unix /var/run/docker.sock: connect: permission denied

Lösung

Als schnelle Lösung wird die Ausführung des Befehls als root mit sudo (z.B. sudo docker ps) das Problem vorübergehend beheben.

Das Problem hier ist, dass der Benutzer, als den du den Befehl ausführst, kein Mitglied der docker-Gruppe ist. Um ihn zur docker-Gruppe hinzuzufügen, führe aus:

add_user_to_docker.sh
sudo usermod -a -G docker $USER

Nach der Ausführung dieses Befehls musst du dich ab- und wieder anmelden (oder deine SSH-Sitzung beenden und neu verbinden, falls du per SSH eingeloggt bist) — sonst wird die Gruppenänderung nicht wirksam.

groups sollte dir zeigen, dass du nun zur docker-Gruppe gehörst:

check_groups.sh
$ groups
uli sudo www-data lxd docker # Prüfe, ob docker hier erscheint!

Versuche danach erneut, den Befehl (z.B. docker ps) auszuführen — der Fehler sollte nun verschwunden sein.

Siehe Was bewirkt sudo usermod -a -G group $USER unter Linux? für Details dazu, was dieser Befehl auf deinem System ändert und was die Parameter bedeuten.

Hintergrundinformationen

Wenn du einen beliebigen docker-Befehl unter Linux ausführst, versucht das docker-Binary, sich mit /var/run/docker.sock zu verbinden. Dies ermöglicht dir, docker-Befehle als Nicht-Root-Benutzer auszuführen, ohne ständig sudo verwenden zu müssen.

Wenn du den Docker-Daemon startest, erstellt er /var/run/docker.sock als Unix-Socket für Client-Anwendungen, um sich zu verbinden.

Du kannst dir den Eigentümer, die Gruppe und die Berechtigungen des Docker-Sockets mit stat /var/run/docker.sock auf der Kommandozeile ansehen:

stat_docker_sock.sh
$ stat /var/run/docker.sock
  File: /var/run/docker.sock
  Size: 0               Blocks: 0          IO Block: 4096   socket
Device: 16h/22d Inode: 677         Links: 1
Access: (0660/srw-rw----)  Uid: (    0/    root)   Gid: (  999/  docker)
Access: 2019-04-30 01:32:21.718150679 +0200
Modify: 2019-04-24 18:37:39.236357175 +0200
Change: 2019-04-24 18:37:39.240357175 +0200
 Birth: -

Für unsere Zwecke ist die interessante Information Uid: ( 0/ root) Gid: ( 999/ docker), die dir sagt, dass der Docker-Socket dem Benutzer root und der Gruppe docker gehört. Die Gruppen-ID kann auf deinem Computer anders sein, aber nur der Name der Gruppe ist relevant.

Angesichts der Berechtigungen Access: (0660/srw-rw----) können sowohl der Eigentümer (root) als auch die Gruppe (docker) den Docker-Socket lesen & schreiben (rw). Das bedeutet, dass du dich mit diesem Socket verbinden und mit dem Docker-Daemon kommunizieren kannst, wenn du entweder der Benutzer root bist (was du vorübergehend mit sudo werden kannst) oder ein Mitglied der docker-Gruppe bist.

Beachte, dass der Docker-Daemon selbst (dockerd) als root läuft, was du überprüfen kannst mit

check_dockerd_process.sh
$ ps aux | grep dockerd
root      2680  0.1  0.3 1247872 19828 ?       Ssl  Apr24   7:44 /usr/bin/dockerd -H fd://

Für weitere Informationen zum Docker-Daemon siehe den offiziellen Docker-Daemon-Leitfaden.


Check out similar posts by category: Container, Docker, Linux