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.