So beheben Sie Fehler „Verbindung zum Docker-Daemon kann nicht hergestellt werden“.

Veröffentlicht: 2022-08-14

Grafik mit dem Docker-Logo

Docker ist eine der führenden Plattformen zum Erstellen und Ausführen von Software-Containern. Es enthält alles, was Sie benötigen, um Container entweder auf einem einzelnen Host oder auf mehreren verteilten Knoten im Swarm-Modus zu verwenden.

Docker hat eine Daemon-basierte Architektur. Die Software, die für das Erstellen und Starten von Containern verantwortlich ist, ist unabhängig vom CLI-Prozess, der Ihre Befehle akzeptiert. Das bedeutet, dass Sie Fehler in der CLI sehen, wenn Sie versuchen, Befehle ohne aktive Daemon-Verbindung auszuführen. In diesem Artikel stellen wir einige Methoden zur Fehlerbehebung dieser frustrierenden Meldungen vor.

Problemsymptome

Die Docker-CLI ist darauf angewiesen, dass eine Daemon-Verbindung verfügbar ist. Es interagiert mit dem Daemon über API-Aufrufe. Wenn auf den konfigurierten Daemon nicht zugegriffen werden kann, zeigen docker -Befehle wie docker ps , docker run und docker build eine ähnliche Fehlermeldung wie diese an:

 $ docker run hello-world:latest
Es kann keine Verbindung zum Docker-Daemon unter unix:///var/run/docker.sock hergestellt werden
Läuft der Docker-Daemon?

Dies zeigt, dass die CLI versucht hat, mit dem Docker-Daemon über den Unix-Socket /var/run/docker.sock zu kommunizieren. Der Socket ist nicht geöffnet, also ist die Verbindung fehlgeschlagen.

1. Überprüfen Sie, ob der Docker-Daemon-Dienst ausgeführt wird

Der Docker-Daemon wird normalerweise von einem systemd-Dienst verwaltet, der Docker automatisch startet, nachdem Ihr Host neu gestartet wurde. Sie können mit der Fehlerbehebung beginnen, indem Sie überprüfen, ob dieser Dienst ausgeführt wird:

 $ sudo systemctl Status-Docker
docker.service – Docker-Anwendungs-Container-Engine
     Geladen: geladen (/lib/systemd/system/docker.service; aktiviert; Herstellervoreinstellung: aktiviert)
     Aktiv: inaktiv (tot)

Der Dienst sollte Active: active (running) melden, wenn der Daemon läuft. Das obige Beispiel zeigt inactive (dead) , was bedeutet, dass der Daemon angehalten wurde.

Starten Sie Docker mit dem folgenden Befehl:

 $ sudo systemctl docker starten

Jetzt sollten Sie docker CLI-Befehle erfolgreich ausführen können.

Möglicherweise stellen Sie fest, dass Docker nach dem Neustart Ihres Computers im gestoppten Zustand verbleibt. Sie können dies lösen, indem Sie den Dienst aktivieren und systemd erlauben, ihn automatisch zu starten:

 $ sudo systemctl docker aktivieren
$ sudo systemctl daemon-reload

Der Befehl daemon-reload weist systemd an, seine Konfiguration neu zu laden, um die Änderung zu übernehmen.

2. Starten Sie den Daemon manuell

Möglicherweise verwenden Sie manchmal ein System, auf dem der Docker-Dienst nicht installiert ist. Sie können den Docker-Daemon manuell mit dem Befehl dockerd . Dies muss normalerweise als root ausgeführt werden.

 $ sudo-dockerd
INFO[2022-06-29T15:12:49.303428726+01:00] Starten

Docker bleibt zugänglich, solange der Befehl ausgeführt wird. Verwenden Sie Strg+C, um den Daemon zu stoppen.

3. Prüfen, ob die CLI auf den richtigen Daemon abzielt

Es können Probleme auftreten, wenn die CLI versucht, eine Verbindung zu einer Remote-Docker-Daemon-Instanz herzustellen. Dies ist normalerweise die Ursache, wenn die Fehlermeldung eine TCP-Adresse anzeigt:

 $ docker run hello-world:latest
Es kann keine Verbindung zum Docker-Daemon unter tcp:///0.0.0.0:2375 hergestellt werden

In diesem Beispiel versucht die docker -CLI, den Docker-Daemon unter 0.0.0.0:2375 über TCP statt über den lokalen Unix-Docker-Socket zu kontaktieren. Dies schlägt fehl, wenn die TCP-Unterstützung des Docker-Daemons deaktiviert ist oder auf den angegebenen Host im Netzwerk nicht zugegriffen werden kann.

Sie können dies normalerweise beheben, indem Sie zum richtigen Docker-CLI-Kontext für die Daemon-Verbindung wechseln, die Sie verwenden möchten:

 $ verwendet standardmäßig den Docker-Kontext

Mit dem Befehl context ls können Sie alle verfügbaren Kontexte und die Daemon-Endpunkte auflisten, zu denen sie eine Verbindung herstellen:

 $ Docker-Kontext ls
NAME BESCHREIBUNG DOCKER-ENDPUNKT             
default * Aktuelle DOCKER_HOST-basierte Konfiguration unix:///var/run/docker.sock

Der aktuell ausgewählte Kontext wird mit einem Sternchen hervorgehoben.

Unerwartete Werte in der Spalte DOCKER ENDPOINT werden normalerweise durch das Setzen der Umgebungsvariable DOCKER_HOST verursacht. In diesem Fall wird eine Warnung angezeigt:

 $ export DOCKER_HOST=1.2.3.4
$ Docker-Kontext ls
NAME BESCHREIBUNG DOCKER-ENDPUNKT
default * Aktuelle DOCKER_HOST-basierte Konfiguration tcp://1.2.3.4:2375
Warnung: Die Umgebungsvariable DOCKER_HOST überschreibt den aktiven Kontext. Um einen Kontext zu verwenden, setzen Sie entweder das globale Flag --context oder deaktivieren Sie die Umgebungsvariable DOCKER_HOST.

Das Vorhandensein der Umgebungsvariable DOCKER_HOST in Ihrer Shell überschreibt den durch Ihren ausgewählten Kontext definierten Endpunkt. In diesem Beispiel zielen docker -Befehle immer auf die Daemon-Instanz unter tcp://1.2.3.4:2375 .

Dieses Problem kann durch Löschen der Variable DOCKER_HOST werden:

 $ export DOCKER_HOST=

Docker verwendet jetzt den von Ihrem aktiven Kontext konfigurierten Endpunkt. Dies ist der standardmäßige lokale Unix-Socket unter /var/run/docker.sock , es sei denn, Sie haben manuell einen benutzerdefinierten Kontext eingerichtet.

 $ Docker-Kontext ls
NAME BESCHREIBUNG DOCKER-ENDPUNKT             
default * Aktuelle DOCKER_HOST-basierte Konfiguration unix:///var/run/docker.sock

4. Berechtigungsprobleme

Falsche Benutzerberechtigungen für den Docker-Socket sind eine weitere häufige Ursache für Daemon-Verbindungsprobleme. Diese Art von Problem zeigt normalerweise eine etwas andere Fehlermeldung:

 $ docker run hello-world:latest
Beim Versuch, eine Verbindung zum Docker-Daemon-Socket unter unix:///var/run/docker.sock herzustellen, wurde die Berechtigung verweigert

Dies geschieht, wenn Ihr Unix-Benutzerkonto nicht berechtigt ist, mit dem Socket zu interagieren, der die Docker-API verfügbar macht. Sich selbst der docker -Gruppe hinzuzufügen, ist die bewährte Methode, um dieses Problem zu lösen:

 $ sudo usermod -aG docker $USER

Sie müssen ein neues Shell-Fenster öffnen oder sich abmelden und wieder anmelden, damit diese Änderung wirksam wird. Sie sollten jetzt docker -Befehle ausführen können, ohne auf Berechtigungsprobleme zu stoßen.

Zusammenfassung

„Kann keine Verbindung zum Docker-Daemon herstellen“ wird angezeigt, wenn die Docker-CLI mit Ihrer aktuellen Konfiguration nicht mit einer Docker-Daemon-Instanz kommunizieren kann. Dies liegt häufig daran, dass der Docker-Daemon-Dienst gestoppt oder deaktiviert wurde. Sie könnten auch versuchen, eine Verbindung zu einem Remote-Docker-Host herzustellen, der offline gegangen ist.

Sie sollten sich jetzt der möglichen Ursachen dieses Problems und der üblichen Lösungswege bewusst sein. Beheben Sie den Fehler, indem Sie Ihre Docker-Daemon-Einstellungen überprüfen, den Docker-Dienst neu starten und sicherstellen, dass Ihr Benutzerkonto die Berechtigung hat, mit dem Docker-Socket zu interagieren.