So beheben Sie Docker: Problem mit Berechtigung verweigert

302

Ich habe Docker auf meinem Computer installiert, auf dem ich Ubuntu OS habe. Danach habe ich Docker installiert, wenn ich laufe

sudo docker run hello-world

Alles ist in Ordnung, aber ich möchte das Wort ausblenden sudo, um den Befehl zu verkürzen.

Wenn ich den Befehl ohne das Wort schreibe sudo

docker run hello-world

Das zeigt Folgendes an:

docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.35/containers/create: dial unix /var/run/docker.sock: connect: permission denied.See 'docker run --help'.

Es ist genauso passiert, wenn ich versuche zu machen

docker-compose up

Wie kann ich das beheben?

Carlos Andres
quelle

Antworten:

438

Wenn Sie Docker als Nicht-Root-Benutzer ausführen möchten, müssen Sie es der Docker-Gruppe hinzufügen.

  1. Erstellen Sie die Docker-Gruppe, falls sie nicht vorhanden ist
$ sudo groupadd docker
  1. Fügen Sie Ihren Benutzer der Docker-Gruppe hinzu.
$ sudo usermod -aG docker $USER
  1. Führen Sie den folgenden Befehl oder Logout aus und melden Sie sich erneut an und führen Sie ihn aus (dies funktioniert nicht. Möglicherweise müssen Sie Ihren Computer zuerst neu starten).
$ newgrp docker
  1. Überprüfen Sie, ob Docker ohne Root ausgeführt werden kann
$ docker run hello-world

Entnommen aus der offiziellen Docker-Dokumentation: Docker als Nicht-Root-Benutzer verwalten

mkb
quelle
70
Ich habe immer noch dieses Problem, nachdem ich alle drei Schritte ausgeführt habe "(
Anand
78
Ich musste unter Ubuntu 18 neu starten, damit es funktionierte - das einfache Abmelden und erneute Anmelden funktionierte nicht.
Heez
26
@heez ein Neustart war möglicherweise nicht erforderlich, ein Neustart von Docker war genug für mich. sudo systemctl restart docker
Rassel
5
Bitte beachten Sie, dass die Mitgliedschaft in der dockerGruppe im Wesentlichen Root-Zugriff gewährt , ohne regelmäßige Sudo-Richtlinien und -Prüfungen durchzusetzen. Weitere Informationen und Erläuterungen finden Sie in der GitHub- Ausgabe Nr. 9976 .
Raehik
13
Docker neu zu starten hat bei mir nicht funktioniert, nur Neustart hat funktioniert (Ubuntu 18.04)
Joakim Tall
360

Nach einem Upgrade wurde mir die Erlaubnis verweigert. Durch Ausführen der Schritte "mkb" nach der Installation hat sich nichts geändert, da mein Benutzer bereits in der Gruppe "Docker" war. Ich versuche es auf jeden Fall zweimal ohne Erfolg.

Nach einer Suchstunde funktionierte diese folgende Lösung endgültig:

sudo chmod 666 /var/run/docker.sock

Die Lösung kam aus Olshansk .

Es sieht so aus, als hätte das Upgrade den Socket ohne ausreichende Berechtigung für die Docker-Gruppe neu erstellt.

Probleme

Diese harte chmod offene Sicherheitslücke und nach jedem Neustart tritt dieser Fehler immer wieder auf und Sie müssen den obigen Befehl jedes Mal erneut ausführen. Ich möchte ein für alle Mal eine Lösung. Dafür haben Sie zwei Probleme:

  • 1) Problem mitSystemD : Der Socket wird nur mit dem Eigentümer 'root' und der Gruppe 'root' erstellt.

    Sie können dieses erste Problem mit diesem Befehl überprüfen:

    ls -l /lib/systemd/system/docker.socket
    

    Wenn dies alles gut ist, sollten Sie root/docker"nicht root/root" sehen.

  • 2) Problem mit der grafischen Anmeldung : /superuser/1348196/why-my-linux-account-only-belongs-to-one-group

    Sie können dieses zweite Problem mit diesem Befehl überprüfen:

    groups
    

    Wenn alles korrekt ist, sollte die Docker- Gruppe in der Liste angezeigt werden . Wenn nicht, versuchen Sie den Befehl

    sudo su $USER  -c groups
    

    Wenn Sie dann die Docker- Gruppe sehen, liegt dies an dem Fehler.

Lösungen

Wenn Sie eine Problemumgehung für die grafische Anmeldung erhalten, sollte dies folgende Aufgabe erfüllen:

sudo chgrp docker /lib/systemd/system/docker.socket
sudo chmod g+w /lib/systemd/system/docker.socket

Aber wenn Sie diesen Fehler nicht bewältigen können, könnte eine nicht so schlechte Lösung folgende sein:

sudo chgrp $USER /lib/systemd/system/docker.socket
sudo chmod g+w /lib/systemd/system/docker.socket

Dies funktioniert, weil Sie sich in einer grafischen Umgebung befinden und wahrscheinlich der einzige Benutzer auf Ihrem Computer sind. In beiden Fällen benötigen Sie einen Neustart (oder einen sudo chmod 666 /var/run/docker.sock)

Galigator
quelle
2
Wenn Docker gemäß dem Dokument auf docs.docker.com/install installiert wurde, müssen Sie sich nie mit solchen Befehlen befassen
Scott Stensland
4
@Scott Stensland Ich habe Docker viele Male 'gemäß Dokument' installiert. Ich denke, das Problem ist auf eine schlechte Interaktion mit einem anderen nicht identifizierten Paket zurückzuführen.
Galigator
1
In Docker-in-Docker habe ich /var/run/docker.sock fälschlicherweise vom Host ohne das :roam Ende gemountet ... sobald ich hinzufügte, dass ich gut zu gehen war
jakebrinkmann
2
Ich benutze Ubuntu 18 auf EC2 - AWS und habe perfekt funktioniert. Alle anderen (sudo usermod -aG docker $ USER und andere Sachen) funktionierten nicht
cherah30
1
Danke, es wurde in Ubuntu 18.04 LTS behoben. Wiederholen und Hinzufügen zu groud nicht
Deepansh Parmani
32
  1. Docker-Gruppe hinzufügen
$ sudo groupadd docker
  1. Fügen Sie Ihren aktuellen Benutzer zur Docker-Gruppe hinzu
$ sudo usermod -aG docker $USER
  1. Sitzung zur Docker-Gruppe wechseln
$ newgrp - docker
  1. Führen Sie ein zu testendes Beispiel aus
$ docker run hello-world
wei.liang
quelle
Der newgrpBefehl forderte zur Eingabe eines Kennworts auf und akzeptierte mein Benutzerkennwort nicht. Stattdessen wurde su - $USERgearbeitet, um das Abmelden / Anmelden zu vermeiden.
bluenote10
18
  1. Aktuellen Benutzer zur dockerGruppe hinzufügen
sudo usermod -aG docker $USER
  1. Ändern Sie die Berechtigungen des Docker-Sockets, um eine Verbindung zum Docker-Daemon herstellen zu können /var/run/docker.sock
sudo chmod 666 /var/run/docker.sock
0x3bfc
quelle
15

Ich löse diesen Fehler mit dem Befehl:

$ sudo chmod 666 /var/run/docker.sock
Kumar
quelle
9

Sie können jederzeit einen Manage Docker as a non-root userAbsatz in den Dokumenten https://docs.docker.com/install/linux/linux-postinstall/ ausprobieren .

Wenn das Problem weiterhin besteht, können Sie den folgenden Befehl ausführen, um das Problem zu beheben:

sudo chmod 666 /var/run/docker.sock
Pranav Bhendawade
quelle
2
Es chmod 666ist eine Sicherheitskatastrophe, den Docker-Socket für alle (mit ) lesbar oder beschreibbar zu machen ... Dies sollte niemals empfohlen werden.
Aayla Secura
6

Beim Versuch, eine Verbindung zum Docker-Daemon-Socket unter Unix herzustellen, wurde die Berechtigung verweigert: ///var/run/docker.sock: http: //%2Fvar%2Frun%2Fdocker.sock/v1.40/images/json : Unix wählen /var/run/docker.sock: connect: Berechtigung verweigert

sudo chmod 666 /var/run/docker.sock

Dies behebt mein Problem.

Qinsheng Zhang
quelle
2

Um dieses Problem zu beheben, habe ich gesucht, wo mein Docker und Docker-Compose installiert sind. In meinem Fall dockerwurde in installiert /usr/bin/dockerund docker-composewurde in installiert/usr/local/bin/docker-compose Pfad . Dann schreibe ich das in mein Terminal:

Zum Docker:

sudo chmod +x /usr/bin/docker

An docker-compose:

sudo chmod +x /usr/local/bin/docker-compose

Jetzt muss ich das Wort nicht mehr in meine Befehle schreiben sudo

/ **************************************************** ********************** /

ERRATA:

Die beste Lösung für dieses Problem wurde von @mkasberg kommentiert. Ich zitiere Kommentar:

That might work, you might run into issues down the road. Also, it's a security vulnerability. You'd be better off just adding yourself to the docker group, as the docs say. sudo groupadd docker, sudo usermod -aG docker $USER. Docs: https://docs.docker.com/install/linux/linux-postinstall/

Vielen Dank!

Carlos Andres
quelle
2
Das könnte funktionieren, Sie könnten später auf Probleme stoßen. Es ist auch eine Sicherheitslücke. Sie sollten sich besser der dockerGruppe hinzufügen , wie in den Dokumenten angegeben. sudo groupadd docker, sudo usermod -aG docker $USER.
Mkasberg
Hey @mkasberg! Vielen Dank für Ihren Kommentar! Ich habe eine Errata gemacht, um Ihre Lösung zu zitieren. Vielen Dank!
Carlos Andres
1

lightdm und kwallet werden mit einem Fehler ausgeliefert, der die zusätzlichen Gruppen beim Anmelden nicht zu bestehen scheint. Um dies zu lösen, musste ich mich außerdem sudo usermod -aG docker $USERdazu äußern

auth optional pam_kwallet.so
auth optional pam_kwallet5.so

zu

#auth optional pam_kwallet.so
#auth optional pam_kwallet5.so

in /etc/pam.d/lightdm vor dem Neustart , damit die Docker-Gruppe tatsächlich Wirkung zeigt.

Fehler: https://bugs.launchpad.net/lightdm/+bug/1781418 und hier: https://bugzilla.redhat.com/show_bug.cgi?id=1581495

Herbert
quelle
1

Verwenden Sie diesen Befehl

sudo usermod -aG docker $USER

Starten Sie dann Ihren Computer neu. Dies hat bei mir funktioniert.

Sheetala Prasad Tiwari
quelle
1

Ernsthaft Leute. Fügen Sie Docker nicht zu Ihren Gruppen hinzu oder ändern Sie die Socket-Position (ohne ein härtendes SELinux). Dies ist eine einfache Möglichkeit, ein Root-Privesc zu erstellen. Fügen Sie einfach einen Alias ​​in Ihre .bashrc ein. Dies ist einfacher und sicherer als: alias dc = 'sudo docker'.

Kaktus Mamelut
quelle
1

Sie können diese Schritte ausführen und dies wird für Sie funktionieren:

  1. Erstellen Sie eine Docker-Gruppe sudo groupadd docker
  2. Fügen Sie Ihren Benutzer dieser Gruppe hinzu sudo usermod -aG docker $USER
  3. Listen Sie die Gruppen auf, um sicherzustellen, dass die Docker-Gruppe erfolgreich erstellt wurde, indem Sie diesen Befehl ausführen groups
  4. Führen Sie den folgenden Befehl aus, um auch die Sitzung für die Docker-Gruppe zu ändern newgrp docker
  5. Ändern Sie den Gruppenbesitz für die Datei docker.socksudo chown root:docker /var/run/docker.sock
  6. Ändern Sie den Besitz für das .docker-Verzeichnis sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
  7. endlich sudo chmod g+rwx "$HOME/.docker" -R

Nach diesem Test können Sie ausführen docker ps -a

Ahmed Mahmoud
quelle
Ich wollte eine Antwort, die keinen Neustart erfordert. Dies war die einzige Antwort, die dies vorsah. Der "Trick" chownbetrifft die Datei docker.sock.
Potherca
1

Nachdem Sie Docker installiert, die Docker-Gruppe erstellt und einen Benutzer hinzugefügt haben, bearbeiten Sie die Docker-Service-Unit-Datei:

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

Fügen Sie dem Abschnitt [Service] zwei Zeilen hinzu:

SupplementaryGroups=docker    
ExecStartPost=/bin/chmod 666 /var/run/docker.sock

Speichern Sie die Datei (Strg-X, y, Eingabe)

Führen Sie den Docker-Dienst aus und aktivieren Sie ihn:

sudo systemctl daemon-reload
sudo systemctl start docker
sudo systemctl enable docker
Leopold Cat
quelle
0

Nach der Docker-Installation unter Centos. Während ich unter dem Befehl lief, bekam ich den folgenden Fehler.

[centos@aiops-dev-cassandra3 ~]$ docker run hello-world
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.soc k/v1.40/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.

Ändern Sie die Gruppe und die Berechtigung für docker.socket

[centos@aiops-dev-cassandra3 ~]$ ls -l /lib/systemd/system/docker.socket
-rw-r--r--. 1 root root 197 Nov 13 07:25 /lib/systemd/system/docker.socket
[centos@aiops-dev-cassandra3 ~]$ sudo chgrp docker /lib/systemd/system/docker.socket
[centos@aiops-dev-cassandra3 ~]$ sudo chmod 666 /var/run/docker.sock
[centos@aiops-dev-cassandra3 ~]$ ls -lrth /var/run/docker.sock
srw-rw-rw-. 1 root docker 0 Nov 20 11:59 /var/run/docker.sock
[centos@aiops-dev-cassandra3 ~]$

Überprüfen Sie dies mit dem folgenden Docker-Befehl

[centos@aiops-dev-cassandra3 ~]$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
Status: Downloaded newer image for hello-world:latest

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

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

[centos@aiops-dev-cassandra3 ~]$
Srikant Patra
quelle
-4

sudo chmod 666 /var/run/docker.sock

Dies hat mir geholfen, während ich Fehler bekam, mich beim Docker anzumelden. Aber jetzt funktioniert das in meinem System völlig einwandfrei.

Jyoti Prakash Sahoo
quelle
1
Es ist sehr unsicher, diese Methode zu verwenden. Lesen Sie die Anweisungen nach der Installation, die in den Kommentaren in der Hauptfrage enthalten waren.
Alejandro Visiedo García