Dlaczego pojawia się komunikat „Nie można połączyć się z demonem Docker”, gdy demon jest uruchomiony?


29

Usługa Docker działa wyraźnie:

$ 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

Jednak Docker nie chce z nim rozmawiać:

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

Korzystam z domyślnej konfiguracji Dockera , tzn. Nie zmieniłem żadnych /etcplików związanych z tą usługą.

W czym może być problem?

Odpowiedzi:


36

Musisz dodać się do dockergrupy i aktywować grupę (wylogowując się i logując ponownie lub uruchamiając newgrp docker), aby uruchomić dockerpolecenia. Komunikat o błędzie jest po prostu mylący.


1
Nie bardzo wprowadzające w błąd. Nie można połączyć się z demonem dokera. „czy demon działa?” było tylko przypuszczeniem.
— Bratchley,

2
sudo gpasswd -a alex docker
— Alex Punnen

1
sudo gpasswd -a $ Doker USER # Działa dla dowolnej nazwy użytkownika
— priomsrb

Zrobiłem to i nadal nie działało. Uruchomiony sudo systemctl start dockernaprawił to, demon naprawdę nie działał ...
— nakamin

32

Na to pytanie już udzielono odpowiedzi, ale oto dodatkowa informacja.

Bez względu na to, czy korzystasz z Arch lub innej dystrybucji, takiej jak Fedora lub Ubuntu, Docker używa pliku gniazda do komunikacji. Po uruchomieniu dockerpoleceń używa tego gniazda do rozmowy z demonem Docker. Oczywiście demon musi być uruchomiony (i często jest domyślnie wyłączony), ale jeśli użytkownik nie może uzyskać dostępu do gniazda, nie będzie mógł również komunikować się z demonem.

Najpierw należy zainstalować Docker z repozytorium dystrybucji. Niektóre osoby pobierają skrypt instalacyjny i przenoszą go do powłoki ( curl ... | sh), ale zaleca się instalację go z repozytorium, aby można go było łatwo zaktualizować.

Łuk:

# pacman -S docker

Fedora:

# dnf install docker

Jak wspomniano powyżej, demon może być domyślnie wyłączony. Jeśli chcesz korzystać z Dockera, demon musi być uruchomiony.

Włącz go (aby był uruchamiany podczas rozruchu):

# systemctl enable docker

Uruchom teraz (lub uruchom ponownie):

# systemctl start docker

Teraz domyślnie (jeśli brakuje grupy dokerów) gniazdo Docker jest własnością root:

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

Dlatego zwykły użytkownik nie może rozmawiać z demonem dokera. Zwykły użytkownik nie ma wystarczających uprawnień, aby uzyskać dostęp do gniazda. Nie jest w stanie dotrzeć do demona, więc zakłada, że ​​nie działa i wyświetla ten błąd:Cannot connect to the Docker daemon. Is the docker daemon running on this host?

Dlatego wiele osób po prostu uruchamia wszystkie polecenia Dockera jako root, używając sudo. Ale jak opisano w drugiej odpowiedzi, Docker ma do tego swój własny mechanizm, więc używanie sudo nie jest konieczne.

Idealnie, grupa o nazwie dockerjest tworzona podczas instalacji Dockera. Jeśli jednak ta grupa nie istnieje podczas uruchamiania demona, plik gniazda jest własnością root.

W niektórych przypadkach ta grupa miała inną nazwę, dockerrootna przykład w Fedorze . Sprawdź, grep docker /etc/groupczy w systemie jest taka grupa. Jeśli już korzystasz z tej grupy (masz w niej użytkownika), musisz skonfigurować Docker, aby z niej korzystać:

W /etc/sysconfig/dockerdodaj -G dockerroot(uwaga: to obejście, a nie najlepsze rozwiązanie):

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

Po zrestartowaniu demona użytkownik będzie mógł uzyskać dostęp do gniazda:

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

W przeciwnym razie oficjalnym sposobem byłoby użycie grupy o nazwie docker. Jeśli istnieje, Docker automatycznie go użyje, tj. Ustawi grupę gniazd na tę grupę. Jeśli nie istnieje, wystarczy go utworzyć i zrestartować demona:

# groupadd docker
# systemctl restart docker

Plik gniazda będzie własnością tej grupy:

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

Twój użytkownik musi być w dockergrupie, aby mieć dostęp do gniazda:

# usermod -aG docker (user)

Być może będziesz musiał się wylogować i zalogować ponownie (lub su - (user)), biegnij, idaby sprawdzić, czy jesteś w grupie.

Następnie możesz użyć Dockera bez sudo / root:

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

Wreszcie słowo ostrzeżenia. Tylko zaufani użytkownicy powinni mieć możliwość kontrolowania demona Docker . Zobacz https://docs.docker.com/engine/security/security/ .
(Ale oczywiście to samo dotyczy sudo - tylko zaufani użytkownicy powinni być w wheelgrupie).


1
To nie wydaje się odpowiadać na pierwotne pytanie.
— l0b0

4
@ l0b0: Cóż, chciałem wyjaśnić, dlaczego tak się dzieje, mając nadzieję, że komuś się przyda. Polecenie usermod, które dodaje użytkownika do grupy, jest ukryte w środkowej części odpowiedzi. Jeśli nie uznasz tej odpowiedzi za przydatną, daj mi znać, żebym mogła ją usunąć.
— basic6

4
Tak, odpowiada i wyjaśnia rozwiązanie dla Arch.
— kodeart

Zrobiłem to wszystko i nadal mam problem wymieniony przez OP. Żaden z kroków związanych z uprawnieniami nie rozwiązał problemu.
— mopsyd


1

Po przeprowadzeniu badań nad rozwiązaniem tego problemu na moim systemie Linux pomyślałem, że napiszę tę odpowiedź. Oto, co zrobiłem, aby rozwiązać problem.

Na Fedorze 22

Instalowanie Dockera:

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

Po zainstalowaniu Dockera:

Użytkownik musi zostać dodany do grupy dokerów.

$> sudo usermod -aG docker

Demon dokera musi zostać uruchomiony

$> sudo service docker start

Możesz ustawić demona, aby uruchamiał się przy starcie systemu

$> sudo chkconfig docker on

Możesz sprawdzić, czy usługa dokowania jest uruchomiona

$> service docker status

I ostatnia kontrola końcowa

$> docker run hello-world

+1 za pełny przykład, chociaż wiele z tych poleceń nie ma zastosowania w mojej sytuacji (instalowanie za pomocą pacman, używanie systemctlzamiast service+ chkconfig).
— l0b0

1

Jeśli używasz Fedory 23 lub wariantu Redhat, edytuj /etc/sysconfig/dockeri zmodyfikuj następujące elementy

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

Uruchom ponownie okno dokowane.

Pamiętaj, aby dodać tę grupę do systemu i dodać siebie do grupy.



1

Jeśli uruchomiłeś silnik dokera za pomocą: sudo service docker start

nie możesz połączyć się z normalnym użytkownikiem, nawet jeśli dodałeś się do grupy „dokerów”.

Możesz to po prostu zatrzymać za pomocą: sudo service docker stop

i uruchom go jak zwykły użytkownik: uruchom doker usługi


Do docker grouptej pory nie musiałem dodawać użytkownika . sudo service startpracował dla mnie. Jednak obserwuje, czy jest coś nowego.
— stupidnetizen

0

Też miałem ten sam problem. Problem polegał na gniazdach przydzielonych do demona-dokera i klienta-dokera.

  1. Po pierwsze, nie ustawiono uprawnień dla klienta-dokera na docker.sock. Można to ustawić za pomocą sudo usermod -aG docker $USER

  2. Następnie sprawdź plik bash, w którym działa klient dokera. Dla mnie ustawiono go na 0.0.0.0:2375, podczas gdy demon dokera działał na gnieździe unix. (Zostało ustawione w pliku konfiguracyjnym dockerd).

  3. Po prostu skomentuj obraźliwą linię, a będzie dobrze.

  4. Ale jeśli chcesz, aby działał na porcie TCP zamiast na gnieździe unixowym, zmień plik konfiguracyjny dockerd, ustaw go na 0.0.0.0.2375 i trzymaj linię w bash tak, jak jest, lub ustaw na 0.0. 0,0: 2375.


0

Są to kroki, które wykonałem, aby naprawić następujące

$ docker info
Cannot connect to the Docker daemon at 
tcp://localhost:2375/usr/lib/systemd/system/docker.socket. Is the docker daemon running?
  1. Dodaj siebie do grupy dokerów

    usermod -aG docker $USER

  2. Napraw uprawnienia w oknie dokowanym i poleceniu.

    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. Dodaj zmienne do środowiska konfiguracji dla polecenia dokera

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

  4. Reszta dokera

    sudo systemctl restart docker

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.