Jak rozwiązywać problemy z błędami „Nie można połączyć się z demonem Docker”

Opublikowany: 2022-08-14

Grafika przedstawiająca logo Docker

Docker to jedna z wiodących platform do budowania i uruchamiania kontenerów oprogramowania. Zawiera wszystko, czego potrzebujesz, aby używać kontenerów na jednym hoście lub wielu rozproszonych węzłach w trybie Swarm.

Docker ma architekturę opartą na demonach. Oprogramowanie odpowiedzialne za tworzenie i uruchamianie kontenerów jest niezależne od procesu CLI, który akceptuje Twoje polecenia. Oznacza to, że zobaczysz błędy w CLI, jeśli spróbujesz uruchomić polecenia bez aktywnego połączenia z demonem. W tym artykule przedstawimy kilka metod rozwiązywania tych frustrujących wiadomości.

Objawy problemu

Interfejs wiersza polecenia platformy Docker jest zależny od dostępności połączenia demona. Współdziała z demonem za pomocą wywołań API. Gdy skonfigurowany demon jest niedostępny, polecenia docker , takie jak docker ps , docker run i docker build , będą wyświetlać komunikat o błędzie podobny do tego:

 $ Docker run hello-world:ostatni
Nie można połączyć się z demonem Docker pod adresem unix:///var/run/docker.sock
Czy działa demon dockera?

To pokazuje, że CLI próbował komunikować się z demonem Docker za pomocą gniazda Unix /var/run/docker.sock . Gniazdo nie jest otwarte, więc połączenie nie powiodło się.

1. Sprawdź, czy usługa demona Docker działa

Demon platformy Docker jest zwykle zarządzany przez usługę systemd, która automatycznie uruchamia platformę Docker po ponownym uruchomieniu hosta. Możesz rozpocząć rozwiązywanie problemów, sprawdzając, czy ta usługa jest uruchomiona:

 $ okno dokowane stanu sudo systemctl
docker.service — silnik kontenera aplikacji platformy Docker
     Załadowane: załadowane (/lib/systemd/system/docker.service; włączone; ustawienie wstępne dostawcy: włączone)
     Aktywny: nieaktywny (martwy)

Usługa powinna zgłosić Active: active (running) , jeśli demon jest uruchomiony. Powyższy przykład pokazuje inactive (dead) , co oznacza, że ​​demon się zatrzymał.

Uruchom Docker za pomocą następującego polecenia:

 $ sudo systemctl start docker

Teraz powinieneś być w stanie pomyślnie uruchomić polecenia CLI docker .

Może się okazać, że Docker pozostaje w stanie zatrzymania po ponownym uruchomieniu komputera. Możesz rozwiązać ten problem, włączając usługę, pozwalając systemd na automatyczne jej uruchomienie:

 $ sudo systemctl włącz docker
$ sudo systemctl demon-reload

Polecenie daemon-reload nakazuje systemd ponowne załadowanie konfiguracji w celu zastosowania zmiany.

2. Uruchom demona ręcznie

Czasami możesz użyć systemu, w którym nie zainstalowano usługi Docker. Demona Dockera można uruchomić ręcznie za pomocą polecenia dockerd . To zwykle musi być uruchomione jako root .

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

Docker pozostanie dostępny przez cały czas działania polecenia. Użyj Ctrl+C, aby zatrzymać demona.

3. Sprawdzanie, czy CLI celuje we właściwego demona

Problemy mogą wystąpić, gdy interfejs wiersza polecenia próbuje połączyć się ze zdalną instancją demona platformy Docker. Jest to zwykle przyczyna, gdy komunikat o błędzie pokazuje adres TCP:

 $ Docker run hello-world:ostatni
Nie można połączyć się z demonem Docker pod adresem tcp:///0.0.0.0:2375

W tym przykładzie interfejs wiersza polecenia platformy Docker próbuje skontaktować się z demonem 0.0.0.0:2375 docker użyciu protokołu TCP zamiast lokalnego gniazda platformy Unix Docker. To się nie powiedzie, jeśli obsługa TCP demona platformy Docker jest wyłączona lub określony host jest niedostępny w sieci.

Zwykle można rozwiązać ten problem, przełączając się na poprawny kontekst interfejsu Docker CLI dla połączenia demona, którego chcesz użyć:

 $ Docker użyj domyślnego kontekstu

Możesz wyświetlić listę wszystkich dostępnych kontekstów i punktów końcowych demonów, z którymi się łączą, za pomocą context ls :

 $ kontekst docker ls
NAZWA OPIS PUNKT KOŃCOWY DOKERA             
default * Bieżąca konfiguracja oparta na DOCKER_HOST unix:///var/run/docker.sock

Aktualnie wybrany kontekst jest wyróżniony gwiazdką.

Nieoczekiwane wartości w kolumnie DOCKER ENDPOINT są zwykle spowodowane ustawieniem zmiennej środowiskowej DOCKER_HOST . W takim przypadku zobaczysz ostrzeżenie:

 Eksportuj DOCKER_HOST = 1.2.3.4
$ kontekst docker ls
NAZWA OPIS PUNKT KOŃCOWY DOKERA
domyślnie * Aktualna konfiguracja oparta na DOCKER_HOST tcp://1.2.3.4:2375
Ostrzeżenie: zmienna środowiskowa DOCKER_HOST zastępuje aktywny kontekst. Aby użyć kontekstu, ustaw globalną flagę --context lub usuń zmienną środowiskową DOCKER_HOST.

Obecność zmiennej środowiskowej DOCKER_HOST w powłoce zastępuje punkt końcowy zdefiniowany przez wybrany kontekst. W tym przykładzie polecenia docker zawsze będą skierowane do instancji demona pod adresem tcp://1.2.3.4:2375 .

Ten problem można rozwiązać, czyszcząc zmienną DOCKER_HOST :

 $ eksportuj DOCKER_HOST=

Docker będzie teraz używał punktu końcowego skonfigurowanego przez Twój aktywny kontekst. Będzie to domyślne lokalne gniazdo Unix w /var/run/docker.sock , chyba że ręcznie ustawiłeś niestandardowy kontekst.

 $ kontekst docker ls
NAZWA OPIS PUNKT KOŃCOWY DOKERA             
default * Bieżąca konfiguracja oparta na DOCKER_HOST unix:///var/run/docker.sock

4. Problemy z uprawnieniami

Inną częstą przyczyną problemów z połączeniem z demonem są nieprawidłowe uprawnienia użytkownika w gnieździe platformy Docker. Ten rodzaj problemu zwykle pokazuje nieco inny komunikat o błędzie:

 $ Docker run hello-world:ostatni
Odmówiono pozwolenia podczas próby połączenia z gniazdem demona Docker pod adresem unix:///var/run/docker.sock

Dzieje się tak, gdy konto użytkownika systemu Unix nie ma uprawnień do interakcji z gniazdem, które udostępnia interfejs API platformy Docker. Dodanie siebie do grupy docker jest najlepszym sposobem rozwiązania tego problemu:

 $ sudo usermod -aG okno dokowane $USER

Aby ta zmiana zaczęła obowiązywać, musisz otworzyć nowe okno powłoki lub wylogować się i ponownie zalogować. Powinieneś teraz móc uruchamiać polecenia docker bez problemów z uprawnieniami.

Streszczenie

Komunikat „Nie można połączyć się z demonem Docker” pojawia się, gdy interfejs wiersza polecenia platformy Docker nie może komunikować się z instancją demona platformy Docker przy użyciu bieżącej konfiguracji. Dzieje się tak często, ponieważ usługa demona Docker została zatrzymana lub wyłączona. Możesz również próbować połączyć się ze zdalnym hostem platformy Docker, który jest w trybie offline.

Powinieneś teraz zdawać sobie sprawę z możliwych przyczyn tego problemu i typowych sposobów jego rozwiązania. Rozwiąż problem, sprawdzając ustawienia demona platformy Docker, ponownie uruchamiając usługę Docker i upewniając się, że Twoje konto użytkownika ma uprawnienia do interakcji z gniazdem platformy Docker.