Warum erhalte ich die Meldung, dass keine Verbindung zum Docker-Dämon hergestellt werden kann, während der Dämon ausgeführt wird?

29

Der Docker-Dienst wird offensichtlich ausgeführt:

$ systemctl status docker.service 
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2015-12-28 19:20:50 GMT; 3 days ago
     Docs: https://docs.docker.com
 Main PID: 1015 (docker)
   CGroup: /system.slice/docker.service
           └─1015 /usr/bin/docker daemon -H fd:// --exec-opt native.cgroupdriver=cgroupfs
$ ps wuf -u root | grep $(which docker)
root      1015  0.0  0.3 477048 12432 ?        Ssl   2015   2:26 /usr/bin/docker daemon -H fd:// --exec-opt native.cgroupdriver=cgroupfs

Docker selbst weigert sich jedoch, mit ihm zu sprechen:

$ docker info
Cannot connect to the Docker daemon. Is the docker daemon running on this host?

Ich verwende die Standard-Docker-Konfiguration , das heißt, ich habe keine /etcDateien in Bezug auf diesen Dienst geändert .

Woran könnte das liegen?

l0b0
quelle

Antworten:

36

Sie müssen sich selbst zur dockerGruppe hinzufügen und die Gruppe aktivieren (durch Abmelden und erneutes Anmelden oder Ausführen newgrp docker), um dockerBefehle auszuführen. Die Fehlermeldung ist einfach irreführend.

l0b0
quelle
1
Nicht wirklich irreführend. Es konnte keine Verbindung zum Docker-Daemon hergestellt werden. "Läuft der Dämon?" war nur eine Vermutung.
Bratchley
2
sudo gpasswd -a
Alex
1
sudo gpasswd -a $ USER docker # Funktioniert für jeden Benutzernamen
priomsrb
Ich habe das gemacht und es hat immer noch nicht funktioniert. Laufen sudo systemctl start docker
repariert
32

Diese Frage wurde bereits beantwortet, aber hier ist eine zusätzliche Information.

Egal, ob Sie sich in Arch oder einer anderen Distribution wie Fedora oder Ubuntu befinden, Docker verwendet zur Kommunikation eine Socket-Datei. Wenn Sie dockerBefehle ausführen, wird dieser Socket verwendet, um mit dem Docker-Daemon zu kommunizieren. Natürlich muss der Dämon ausgeführt werden (und er ist häufig standardmäßig deaktiviert), aber wenn Ihr Benutzer nicht auf den Socket zugreifen kann, kann er auch nicht mit dem Dämon kommunizieren.

Sie würden Docker zuerst aus dem Repository der Distribution installieren. Einige Benutzer laden ein Installationsskript herunter und leiten es an eine Shell ( curl ... | sh) weiter. Es wird jedoch empfohlen, es aus dem Repository zu installieren, damit es problemlos aktualisiert werden kann.

Bogen:

# pacman -S docker

Fedora:

# dnf install docker

Wie oben erwähnt, ist der Dämon möglicherweise standardmäßig deaktiviert. Wenn Sie Docker verwenden möchten, muss der Dämon ausgeführt werden.

Aktivieren Sie es (damit es beim Booten gestartet wird):

# systemctl enable docker

Starte es jetzt (oder starte neu):

# systemctl start docker

Standardmäßig (wenn die Docker-Gruppe fehlt) gehört der Docker-Socket root:

# ls -la /var/run/docker.sock
srw-rw---- 1 root root 0 Apr 28 17:22 /var/run/docker.sock

Aus diesem Grund kann ein normaler Benutzer nicht mit dem Docker-Daemon kommunizieren. Ein normaler Benutzer verfügt nicht über ausreichende Berechtigungen, um auf den Socket zuzugreifen. Es ist nicht in der Lage, den Dämon zu erreichen, daher wird davon ausgegangen, dass er nicht ausgeführt wird, und der folgende Fehler wird angezeigt:Cannot connect to the Docker daemon. Is the docker daemon running on this host?

Aus diesem Grund starten viele Benutzer einfach alle Docker-Befehle als root mit sudo. Wie in der anderen Antwort beschrieben, verfügt Docker jedoch über einen eigenen Mechanismus, sodass die Verwendung von sudo nicht erforderlich ist.

Idealerweise dockerwird bei der Installation von Docker eine aufgerufene Gruppe erstellt. Wenn diese Gruppe jedoch beim Starten des Dämons nicht vorhanden ist, befindet sich die Socket-Datei im Besitz von root.

In einigen Fällen hatte diese Gruppe einen anderen Namen, wie dockerrootbei Fedora . Überprüfen Sie grep docker /etc/group, ob auf Ihrem System eine solche Gruppe vorhanden ist. Wenn Sie diese Gruppe bereits verwenden (Ihr Benutzer ist in der Gruppe), müssen Sie Docker für die Verwendung konfigurieren:

/etc/sysconfig/dockerFügen -G dockerrootSie Folgendes hinzu (Hinweis: Dies ist eine Problemumgehung und nicht die beste Lösung):

OPTIONS='--selinux-enabled -G dockerroot'

Nach dem Neustart des Daemons kann Ihr Benutzer auf den Socket zugreifen:

# systemctl restart docker
# ls -la /var/run/docker.sock
srw-rw---- 1 root dockerroot 0 Apr 28 17:32 /var/run/docker.sock

Andernfalls wäre der offizielle Weg, die angerufene Gruppe zu verwenden docker. Wenn es existiert, wird es von Docker automatisch verwendet, dh die Gruppe des Sockets wird auf diese Gruppe gesetzt. Wenn es nicht existiert, müssen Sie es nur erstellen und den Daemon neu starten:

# groupadd docker
# systemctl restart docker

Die Socket-Datei gehört dieser Gruppe:

# srw-rw---- 1 root docker 0 Apr 28 17:42 /var/run/docker.sock

Ihr Benutzer muss Mitglied der dockerGruppe sein, um auf den Socket zugreifen zu können:

# usermod -aG docker (user)

Möglicherweise müssen Sie sich abmelden und erneut anmelden (oder su - (user)), um festzustellen id, ob Sie Mitglied der Gruppe sind.

Sie können Docker dann ohne sudo / root verwenden:

$ docker version --format '{{.Server.Version}}'
1.9.1

Zum Schluss noch eine Warnung. Nur vertrauenswürdige Benutzer sollten berechtigt sein, Ihren Docker-Daemon zu steuern . Siehe https://docs.docker.com/engine/security/security/ .
(Dies gilt natürlich auch für sudo - nur vertrauenswürdige Benutzer sollten in der wheelGruppe sein.)

basic6
quelle
1
Dies scheint die ursprüngliche Frage nicht zu beantworten.
l0b0
4
@ l0b0: Nun, ich wollte erklären, warum dies geschieht, in der Hoffnung, dass es jemandem nützlich sein würde. Der Befehl usermod, mit dem der Benutzer der Gruppe hinzugefügt wird, wird im mittleren Teil der Antwort ausgeblendet. Wenn Sie diese Antwort nicht hilfreich finden, lassen Sie es mich wissen, damit ich sie löschen kann.
Basic6
4
Ja, es antwortet und erklärt die Lösung für Arch.
Kodeart
Ich habe all dies getan und stoße immer noch auf das von OP erwähnte Problem. Keiner der berechtigungsbezogenen Schritte hat das Problem gelöst.
Mopsyd
3

sudo usermod -aG docker [Benutzername]

dann abmelden und wieder anmelden

user2167582
quelle
1

Nachdem ich einige Nachforschungen angestellt hatte, um dieses Problem auf meinem Linux-System zu lösen, dachte ich, ich würde diese Antwort schreiben. Hier ist, was ich getan habe, um das Problem zu beheben.

Auf Fedora 22

Docker installieren:

$> curl -fsSL https://get.docker.com/ | sh

Nach der Installation von Docker:

Ein Benutzer muss zur Docker-Gruppe hinzugefügt werden.

$> sudo usermod -aG docker

Der Docker-Daemon muss gestartet werden

$> sudo service docker start

Sie können den Dämon so einstellen, dass er beim Booten startet

$> sudo chkconfig docker on

Sie können überprüfen, ob der Docker-Dienst ausgeführt wird

$> service docker status

Und noch eine letzte Endkontrolle

$> docker run hello-world
Ronald Weidner
quelle
+1 für ein vollständiges Beispiel, obwohl viele dieser Befehle für meine Situation nicht zutreffen (Installieren mit pacman, Verwenden systemctlanstelle von service+ chkconfig).
l0b0
1

Wenn Sie die Fedora 23- oder Redhat-Variante verwenden, bearbeiten /etc/sysconfig/dockerund ändern Sie Folgendes

OPTIONS='--selinux-enabled --log-driver=journald -G yourdockergroup'

Docker neu starten.

Stellen Sie sicher, dass Sie diese Gruppe zum System hinzufügen und sich selbst der Gruppe hinzufügen.

Stuart James
quelle
1

Wenn Sie Ihre Docker-Engine mit folgendem Befehl gestartet haben: sudo service docker start

Sie können keine Verbindung mit einem normalen Benutzer herstellen, auch wenn Sie sich selbst zur Gruppe "Docker" hinzugefügt haben.

Sie können es einfach stoppen mit: sudo service docker stop

und starte es als normaler Benutzer: service docker start

Raymond
quelle
Ich musste docker groupbis jetzt keinen Benutzer hinzufügen . sudo service startarbeitete für mich. Ich werde jedoch beobachten, ob es etwas Neues gibt.
stupidnetizen
0

Ich hatte auch das gleiche Problem. Das Problem lag in Sockets, die Docker-Daemon und Docker-Client zugewiesen waren.

  1. Erstens wurde die Berechtigung für den Docker-Client auf docker.sock nicht festgelegt. Sie können sie mit festlegen sudo usermod -aG docker $USER

  2. Überprüfen Sie dann Ihre Bash-Datei, in der der Docker-Client ausgeführt wird. Für mich war es auf 0.0.0.0:2375 gesetzt, während der Docker-Daemon auf einem Unix-Socket lief. (Es wurde in der Konfigurationsdatei von dockerd eingestellt).

  3. Kommentieren Sie einfach die beleidigende Zeile aus und es wird gut funktionieren.

  4. Aber wenn Sie möchten, dass es auf dem TCP-Port statt auf dem Unix-Socket funktioniert, ändern Sie die Konfigurationsdatei von dockerd, setzen Sie sie auf 0.0.0.0.2375 und belassen Sie die Zeile in bash, so wie sie ist, oder setzen Sie sie auf 0.0. 0,0: 2375.

Nilesh Kande
quelle
0

Dies sind die Schritte, die ich befolgt habe, um Folgendes zu beheben

$ docker info
Cannot connect to the Docker daemon at 
tcp://localhost:2375/usr/lib/systemd/system/docker.socket. Is the docker daemon running?
  1. Fügen Sie sich der Docker-Gruppe hinzu

    usermod -aG docker $USER

  2. Korrigieren Sie die Berechtigungen für Docker Socker und Command.

    sudo chgrp docker /usr/bin/docker
    sudo chgrp docker /var/run/docker.sock

    $ ll $(which docker) -rwxr-xr-x 1 root docker 18991768 08.07.2017 22:57 /usr/bin/docker*

    $ ll /var/run/docker.sock srw-rw---- 1 root docker 0 23.07.2017 10:21 /var/run/docker.sock

  3. Fügen Sie der Konfigurationsumgebung Variablen für den Docker-Befehl hinzu

    export DOCKER_HOST=unix:///var/run/docker.sock

  4. Rest Docker

    sudo systemctl restart docker

Nelaaro
quelle