Behebung von Docker 'Got permission denied while trying to connect to the Docker daemon socket'
Problem:
Du führst einen Befehl wie docker ps aus, erhältst aber diese Fehlermeldung:
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 deniedLö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:
sudo usermod -a -G docker $USERNach 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:
$ 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 /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
$ 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.