Nie można połączyć się z platformą docker z poziomu docker-compose

163

Zainstalowałem docker-machine 0.1.0 i docker-compose 1.1.0 w systemie Mac OS 10.8.5.
Docker-machine działa normalnie i może łączyć się przez docker-machine ssh.

$ docker-machine ls
NAME   ACTIVE   DRIVER       STATE     URL                         SWARM
dev    *        virtualbox   Running   tcp://192.168.99.100:2376   

Jednak nie można połączyć się z docker-compose.

$ docker-compose up

Nie można połączyć się z demonem Dockera pod adresem http + unix: //var/run/docker.sock - czy to działa?

Jeśli znajduje się w niestandardowej lokalizacji, podaj adres URL za pomocą zmiennej środowiskowej DOCKER_HOST.

Mój plik Dockerfile i docker-compose.yml są tutaj.

Dockerfile

FROM centos:centos7
DOCKER_HOST tcp://192.168.99.100:2376

docker-compose.yml

web:
  build: .

Dlaczego nie można się połączyć? Jakieś pomysły?

DIGITALSQUAD
źródło
49
Działa docker-machinejako root? Właśnie przyszedłem tutaj z tym samym problemem na Ubuntu i to były uprawnienia w gnieździe - załatwiły sprawę sudo.
SLD
7
W przypadku systemu Linux może być konieczne dodanie do grupy docker .
Batandwa
5
po prostu uruchom: sudo docker-compose up
Girish Gupta
Miałem ten sam problem. Musisz ponownie uruchomić docker. sudo service docker restartalbo sudo service docker startrozwiązałem to tym.
OM Bharatiya
Dla tych, którzy używają Ubuntu, powinieneś użyć sudo i nie powinieneś dodawać użytkowników do grupy docker . Zobacz komentarze w zaakceptowanej odpowiedzi: askubuntu.com/questions/477551/…
kas

Odpowiedzi:

89

Maszyna Docker jest uruchomiona. Ale musisz wyeksportować trochę środowiska, aby połączyć się z komputerem Docker. Domyślnie dockerklient CLI próbuje komunikować się z demonem przy użyciu http+unix://var/run/docker.sock(jak pokazano w komunikacie o błędzie).

Wyeksportuj poprawne zmienne środowiskowe za pomocą eval $(docker-machine env dev)i spróbuj ponownie. Możesz także uruchomić, docker-machine env devaby zobaczyć zmienne środowiskowe, które wyeksportuje. Zauważ, że jednym z nich jest DOCKER_HOST, tak jak sugeruje komunikat o błędzie, może być konieczne ustawienie.

Andy Shinn
źródło
2
Możesz umieścić to polecenie ( eval "$(docker-machine env default)") w swoim bin / postactivate, aby mieć pewność, że jest zawsze aktualne.
Dannid
1
Gdzie znajdę plik bin / postactivate?
Lukas Schulze
Albo zapomniałeś zainstalować dockera: $ eval $(docker-machine env dev) Command 'docker-machine' not found, but can be installed with: sudo snap install docker
R OMS
226

Proste rozwiązanie dla mnie: sudo docker-compose up


UPDATE 2016-3-14: W pewnym momencie procesu instalacji dockera (lub docker-compose?) Pojawia się sugestia i przykład dodania nazwy użytkownika do grupy „docker”. Pozwala to uniknąć konieczności używania „sudo” przed wszystkimi poleceniami dockera, na przykład:

~ > docker run -it ubuntu /bin/bash
root@665d1ea76b8d:/# date
Mon Mar 14 23:43:36 UTC 2016
root@665d1ea76b8d:/# exit
exit
~ > 

Przyjrzyj się uważnie wynikom poleceń instalacji (zarówno docker, jak i 2nd install dla docker-compose), a znajdziesz niezbędny krok. Jest to również udokumentowane tutaj: https://subosito.com/posts/docker-tips/

Sudo? Nie!

Masz dość wpisywania sudo docker za każdym razem, gdy wydajesz polecenie? Tak, jest sposób, aby sobie z tym poradzić. Chociaż w naturalny sposób docker wymaga użytkownika root, możemy podać równoważną mu grupę dla operacji docker.

Możesz utworzyć grupę o nazwie docker, a następnie dodać żądanego użytkownika do tej grupy. Po ponownym uruchomieniu usługi docker użytkownik nie będzie musiał wpisywać sudo za każdym razem, gdy wykonuje operacje docker. Jak to wygląda na poleceniach powłoki? jako root, proszę bardzo:

> sudo groupadd docker
> sudo gpasswd -a username docker
> sudo service docker restart 

Gotowe!

UPDATE 2017-3-9

Instrukcje instalacji Dockera zostały tutaj zaktualizowane.

Kroki poinstalacyjne dla systemu Linux

Ta sekcja zawiera opcjonalne procedury konfigurowania hostów systemu Linux do lepszej współpracy z platformą Docker.

Zarządzaj Dockerem jako użytkownik inny niż root

Demon Dockera wiąże się z gniazdem Unix zamiast z portem TCP. Domyślnie właścicielem gniazda Unix jest użytkownik root, a inni użytkownicy mogą uzyskać do niego dostęp tylko za pomocą sudo. Demon Dockera zawsze działa jako użytkownik root.

Jeśli nie chcesz używać sudo podczas korzystania z polecenia docker, utwórz grupę uniksową o nazwie docker i dodaj do niej użytkowników. Kiedy demon Dockera uruchamia się, umożliwia grupie docker prawo własności gniazda Unix do odczytu / zapisu.

Aby utworzyć grupę Dockera i dodać użytkownika:

# 1. Create the docker group.
$ sudo groupadd docker

# 2. Add your user to the docker group.
$ sudo usermod -aG docker $USER

# 3. Log out and log back in so that your group membership is re-evaluated.

# 4. Verify that you can run docker commands without sudo.
$ docker run hello-world

To polecenie pobiera obraz testowy i uruchamia go w kontenerze. Gdy kontener jest uruchomiony, wyświetla komunikat informacyjny i kończy pracę.

Alan Thompson
źródło
1
Podobnie z jakiegoś powodu sudo jest jedynym sposobem, aby dostać pracę: O: O: O
Jamie Hutber
12
Zamiast się wylogowywać ... możesz użyć polecenia:newgrp docker
Thiago Falcao
Ahh szczegółowa odpowiedź z pytaniem dodatkowym :-)
Sukumaar
1
Re: „Proste rozwiązanie dla mnie: sudo docker-compose up”. Kiedy próbuję, otrzymuję:sudo: docker-compose: command not found
mblakesley
38

Jeśli zacząłeś używać dockera sudo, powinieneś uruchomić docker-compose up z sudo Like:sudo docker-compose up

Rohan Seth
źródło
U mnie zadziałało, kiedy sudo docker-compose buildzamiast biegałem docker-compose build.
anms_pro
26

Domyślnie demon Dockera zawsze działa jako użytkownik root, dlatego musisz dołączyć sudodo swoich poleceń Dockera .

Jeśli nie chcesz używać sudo podczas korzystania z polecenia docker, utwórz grupę uniksową o nazwie docker i dodaj do niej użytkowników. Kiedy demon Dockera uruchamia się, umożliwia grupie docker prawo własności gniazda Unix do odczytu / zapisu.

Aby utworzyć grupę Dockera i dodać użytkownika:

  1. Utwórz grupę docker.

    $ sudo groupadd docker

  2. Dodaj użytkownika do grupy Docker.

    $ sudo usermod -aG docker $USER

  3. Wyloguj się i zaloguj ponownie, aby ponownie ocenić członkostwo w grupie.

  4. Sprawdź, czy możesz dokować polecenia bez sudo.

    $ docker run hello-world

To polecenie pobiera obraz testowy i uruchamia go w kontenerze. Gdy kontener jest uruchomiony, wyświetla komunikat informacyjny i kończy pracę.

Kroki opisane powyżej pochodzą z oficjalnej dokumentacji Dockera .

ndequeker
źródło
Jak możemy to zrobić na zainstalowanym w systemie Windows Dockerze?
Jeff Cook
Poza tym, co zrobiłem, aby naprawić Döcker-Compose zachodziło użytkownikowi wykonującemu docker-composejako właściciel /usr/local/bin/docker-compose, a następnie ponownie uruchom de service
Sam
groupczłonkostwo można odświeżyć, su - $USERaby nie wylogowywać się i
logować
19

Kiedy pojawi się błąd :

BŁĄD: Nie można połączyć się z demonem Dockera pod adresem http + docker: // localhost - czy to działa?

Rozwiązanie byłoby:

  1. Najpierw spróbuj sprawdzić, czy usługa Docker jest uruchomiona i działa zgodnie z oczekiwaniami na komputerze zdalnym / lokalnym:sudo service docker status

    jeśli nie - uruchom sudo service docker start lub sudo systemctl start docker(zależy od niektórych wersji Linuksa, zobacz instrukcje Dockera ).

  2. Po drugie, uruchom docker jako sudo sudo docker-compose up

avivamg
źródło
16

sudo systemctl start docker - aby uruchomić usługę Docker.

sudo docker-compose up po tym.

Mam Fedorę 26 i próbując rozwiązać ten sam problem, w końcu wszedłem do Docker Compose na stronie programistów Fedory, a następnie do Dockera na stronie deweloperów Fedory , co mi pomogło.

Prawdopodobnie usługa dockera uważana przez społeczność za uruchamianie systemu i ciągłe działanie w tle, ale dla mnie nie było to takie oczywiste i dlatego mogę pomyśleć o tym, dlaczego nie ma popularnej odpowiedzi, takiej jak ta.

Na stronie deweloperów Fedory znajduje się instrukcja, jak włączyć Docker do uruchamiania systemu:

sudo systemctl enable docker

Aleksei Alefirov
źródło
Wymień systemctlsię launchctljeśli działa na Mac.
Rohit Swami
6

Jeśli korzystasz z systemu Linux, być może nie docker-machinezainstalowałeś go, ponieważ jest on instalowany domyślnie tylko na komputerach z systemem Windows i Mac.

Jeśli tak, musisz przejść na stronę: https://docs.docker.com/machine/install-machine/, aby znaleźć instrukcje, jak zainstalować go w swojej wersji systemu Linux.

Po zainstalowaniu uruchom ponownie, docker-compose upzanim spróbujesz cokolwiek wymienionego powyżej.

Mam nadzieję, że to komuś pomoże. To zadziałało w przypadku mojej instalacji devilbox w Fedorze 25.

specialk1st
źródło
5

Oprócz dodawania użytkowników do grupy docker, aby uniknąć sudowielokrotnego wpisywania , możesz także utworzyć alias dla dockerpoleceń takich jak:

alias docker-compose="sudo docker-compose"
alias docker="sudo docker"
Shanu Gupta
źródło
4

jeśli używasz docker-machine, musisz aktywować środowisko za pomocą zmiennej env . w przypadku, gdy nie używasz docker-machine, a następnie uruchom polecenia za pomocą sudo

Md Ch
źródło
3

Czy ktoś sprawdził log?

W moim przypadku komunikat o błędzie w /var/log/upstart/docker.log:

Listening for HTTP on unix (/var/run/docker.sock) 
[graphdriver] using prior storage driver "aufs" 
Running modprobe bridge nf_nat failed with message: , error: exit status 1 
Error starting daemon: Error initializing network controller: Error creating default "bridge" network: can't find an address range for interface "docker0" 

Warto wspomnieć, że miałem włączony VPN, więc: $ sudo service openvpn stop $ sudo service docker restart $ docker-compose up|start $ sudo service openvpn start było rozwiązaniem.

Sławomir Lenart
źródło
3

Odpowiedź od @srfrnk działa dla mnie.

W mojej sytuacji miałem następny plik docker-compose.yml:

  nginx:
    build:
      context: ./
      dockerfile: "./docker/nginx.staging/Dockerfile"
    depends_on:
      - scripts
    environment:
      NGINX_SERVER_NAME: "some.host"
      NGINX_STATIC_CONTENT_OPEN_FILE_CACHE: "off"
      NGINX_ERROR_LOG_LEVEL: debug
      NGINX_BACKEND_HOST: scripts
      NGINX_SERVER_ROOT: /var/www/html
    volumes:
      - ./docker-runtime/drupal/files:/var/www/html/sites/default/files:rw
    ports:
      - 80:80

./docker-runtimewłaściciel i grupa - rootgdy inny właściciel plików - mój użytkownik. Kiedy próbowałem budowaćnginx

Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?

Dodałem ./docker-runtimedo .dockerignorei to jest mój problem rozwiązany.

Dima Storozhuk
źródło
3

podczas pracy docker-compose pull- wyświetlałem się poniżej błędu

BŁĄD: nie można połączyć się z demonem Dockera pod adresem http + docker: // localhost

czy to działa?

rozwiązanie -

sudo service docker start 

problem rozwiązany

kumar
źródło
2

Miałem te same objawy.

Tyle tylko, że zdarzyło się to tylko podczas docker-compose build docker pspracy. Stało się z wersją 2.x, jak również 3.x. dockerUsługa została ponownie uruchomiona, a następnie maszyna ... Nawet ponownie zainstalowana docker+ docker-compose.

Próbowałem wszystkiego, ale nic nie pomogło.

Wreszcie spróbowałem zbudować plik Dockerfile „ręcznie” przy użyciu docker build.

Najwyraźniej miałem problem z uprawnieniami do pliku / folderu w Dockerkontekście. Próbował odczytać kontekst podczas uruchamiania kompilacji i nie powiodło się z wyświetleniem odpowiedniego komunikatu o błędzie. Jednak ten komunikat o błędzie nie rozprzestrzenił się, do docker-composektórego wyświetla się tylkoCouldn't connect to Docker daemon at http+unix://var/run/docker.sock - is it running?

Stwierdziwszy, że rozwiązaniem było po prostu dodanie pliku / folderu do .dockerignorepliku, ponieważ nie był on potrzebny do kompilacji. Innym rozwiązaniem mogłoby być do chownlub chmodto.

W każdym razie może to pomóc komuś napotkać ten sam problem, z którym naprawdę nie ma nic wspólnego, dockeri wyświetlenie wprowadzającego w błąd komunikatu o błędzie.

srfrnk
źródło
Miałem ten sam problem: uprawnienia do plików w zamontowanym woluminie. W moim przypadku miałem certyfikat SSL, którego właścicielem był root, który został umieszczony w woluminie Docker. chown/ chmodnaprawiłem to. Okropny komunikat o błędzie, ale pracują nad tym. Zobacz github.com/docker/compose/issues/5318
bcattle
2

$ sudo docker-compose up

Wykonałem kroki, jak w powyższej odpowiedzi, aby dodać $ USER do grupy docker. nie chciałem dodawać nowej grupy dokowanej, ponieważ w mojej instalacji Dockera grupa o nazwie docker została utworzona automatycznie.

Docker CE jest zainstalowany i działa. Grupa Dockera została utworzona, ale nie są do niej dodani żadni użytkownicy. Aby uruchamiać polecenia Dockera, musisz użyć sudo. Przejdź do postinstalacji systemu Linux, aby umożliwić użytkownikom nieuprzywilejowanym uruchamianie poleceń platformy Docker i wykonywanie innych opcjonalnych czynności konfiguracyjnych.

ale użycie docker-compose up też nie działało. Dał ten sam poprzedni błąd. Tak więc w moim przypadku (Ubuntu 18.10) sudo docker-compose up naprawiło problem.

ps: @Tiw dzięki za radę.

Nayananga Muhandiram
źródło
1
Może lepiej postawić najpierw rozwiązanie, a wyjaśnienia poniżej. Możesz także użyć tych przycisków w edytorze, aby lepiej sformatować swoją odpowiedź.
Tiw
2

Wiem, że to głupie, ale w moim przypadku po prostu próbowałem sudo i zadziałało jak urok.

w twoim przypadku po prostu spróbuj: $ sudo docker-compose up

Demobilizer
źródło
1

Spróbuj tego:

sudo ln -s / usr / local / bin / docker-compose / usr / bin / docker-compose

TBhavnani
źródło
1

Rozwiązałem problem, wykonując następujące czynności

$ sudo service docker status
$ sudo service docker start
$ sudo docker-compose up

teraz docker-compose up działa

KARTHIKEYAN.A
źródło
0

Dla mnie zacząłem aktualizować Dockera i anulowałem w połowie. Nie zauważyłem, że Docker nie działa (jeśli tak, na górnym pasku nawigacyjnym mojego Macbooka jest ikona obok pozostałej baterii, czasu itp.). Po uruchomieniu i zakończeniu aktualizacji docker-compose updziałało ponownie!

Rock Lee
źródło
0

Moja konfiguracja ma dwa przypadki tego błędu:

  • __pycache__ pliki utworzone przez użytkownika root po przeprowadzeniu testów integracyjnych wewnątrz kontenera są niedostępne dla dockera (informuje o oryginalnym problemie) i docker-compose (mówi niejednoznacznie o hoście dockerowym);
  • microk8s zablokował mój port, dopóki go nie zatrzymałem.
simno
źródło
0

Spróbuj uruchomić dockerdlub, sudo dockerdjeśli to konieczne, najpierw uruchomić demona. Jeśli zaczniesz dockerdz sudowas może chcesz uruchomić docker-compose upzsudo również. inaczej jest dobrze.

Działające rozwiązanie z https://github.com/docker/compose/issues/4181

Gathua Kiragu
źródło
0

wylogowanie się, a następnie ponowne zalogowanie mi pomogło. W moim przypadku była to nowa instalacja, utworzyłem nowego użytkownika, nową grupę, a następnie dodałem użytkownika do grupy docker.

wyjście wyjście

następnie ssh ponownie do serwera

Swelan Auguste
źródło
0

Poniższe zadziałało dla mnie, nie jestem pewien, która część załatwiła sprawę:

julian:project$ sudo service docker status
julian:varys$ sudo service docker status                                                                                                                                                                                
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2020-07-15 01:21:16 UTC; 24min ago
     Docs: https://docs.docker.com
 Main PID: 6762 (dockerd)
    Tasks: 25
   CGroup: /system.slice/docker.service
           └─6762 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

julian:project$ export DOCKER_HOST=unix:///run/containerd/containerd.sock

julian:project$ sudo groupadd docker
groupadd: group 'docker' already exists
julian:project$ sudo gpasswd -a $USER docker
Adding user ubuntu to group docker
julian:project$ newgrp docker

julian:project$ ls -ln /var/run/ | grep docker
drwx------  5   0   0  120 Jul 15 01:10 docker
-rw-r--r--  1   0   0    4 Jul 15 01:10 docker.pid
srw-rw----  1   0 999    0 Jul 15 01:10 docker.sock

julian:project$ sudo rm /var/run/docker.sock                                                                                                                                                                                            
julian:project$ sudo rm /var/run/docker.pid

julian:project$ sudo service docker restart  
juliangonzalez
źródło