2016-10-14 24 views
9

Mam problemy z uruchamianiem okna dokowanego z funkcją dokowania.

Kiedy biegnę docker-compose -f dev.yml build mam następujący błąd>

Building postgres 
ERROR: Couldn't connect to Docker daemon - you might need to run `docker-machine start default`. 

Jednak jeśli biegnę docker-machine ls maszyna jest wyraźnie w górę>

NAME  ACTIVE DRIVER  STATE  URL       SWARM DOCKER ERRORS 
default -  virtualbox Running tcp://192.168.99.100:2376   v1.12.1 

Naprawiłem błąd uruchamiając eval "$(docker-machine env default)" po którym docker-compose -f dev.yml build zakończy się pomyślnie.

Moje pytanie, dlaczego to się stało, co się właściwie dzieje i jak mogę je cofnąć?

Czy jest to również bezpieczny sposób na rozwiązanie tego problemu? W tej chwili to tylko mój laptop, ale te kontenery mają trafić na serwery firm w najbliższej przyszłości.

Nie jestem bardzo biegły w bash, ale ja byłem zawsze mówił, aby nie zabrakło eval a zwłaszcza nie uruchomić eval z "

Odpowiedz

16

Po uruchomieniu komend docker interfejs CLI łączy się z interfejsem API Docker, a to API faktycznie wykonuje tę pracę. Za pomocą lokalnego interfejsu CLI można zarządzać zdalnymi hostami Docker, zmieniając szczegóły połączenia API, które Docker przechowuje w zmiennych środowiskowych na kliencie, na którym działa interfejs CLI.

W przypadku Docker Machine silnik Dockera działa w maszynie wirtualnej, która jest faktycznie komputerem zdalnym, więc lokalny interfejs CLI musi być skonfigurowany, aby się z nim połączyć. Docker Machine zna szczegóły połączenia dla silników, którymi zarządza, dzięki czemu można wydrukować szczegóły dotyczące maszyny . Wyjście jest coś takiego:

$ docker-machine env default 
export DOCKER_TLS_VERIFY="1" 
export DOCKER_HOST="tcp://172.16.62.130:2376" 
export DOCKER_CERT_PATH="/Users/elton/.docker/machine/machines/default" 
export DOCKER_MACHINE_NAME="default" 

Korzystanie eval wykonuje każdy z tych export poleceń, zamiast po prostu zapisując je do konsoli, więc jest to szybki sposób konfigurowania zmiennych środowiskowych.

Można go cofnąć i zresetować środowisko lokalne za pomocą docker-machine env --unset, co daje dane wyjściowe do rozbrojenia środowiska (aby interfejs CLI próbował połączyć się z lokalnym silnikiem Docker).

+0

Ah, czy mam rację, bez tego moja komenda dokowa naprawdę by działała, gdybym miał sesję SSH otwartą dla VM? –

+0

Tak, jeśli wyślesz SSH do maszyny wirtualnej i uruchomisz komendy 'docker', wykonają one działanie w stosunku do lokalnego silnika Docker. Zmiennych środowiskowych można używać do pracy ze zdalnym silnikiem dokowania - Docker Machine po prostu ułatwia i dba również o zabezpieczenie połączenia. –

3

To rzeczywiście oczekiwany sposób na wykorzystanie Döcker na komputerze, który nie natywnie obsługuje Döcker np w systemie Windows lub Mac OS X.

dokumentacja Docker zawiera ten krok w jego opisie na korzystanie Docker automat tutaj: https://docs.docker.com/machine/get-started/

Co robi ten krok (proponuję także spróbować ten sam):

  • Uruchom docker-machine env default.
  • Pobierz dane wyjściowe tego polecenia i uruchom je w bieżącej sesji powłoki.

Jeśli prowadzisz docker-machine env default siebie, widać, że to po prostu sugeruje, aby ustawić kilka zmiennych środowiskowych, które pozwalają poleceń Docker znaleźć VM uruchamiając demona Docker. Bez tych zmiennych, Docker po prostu nie wie, jak komunikować się z demonem Docker.

W środowisku serwera (Linux) nie będzie potrzebna maszyna Docker, ponieważ jądro Linux obsługuje raczej uruchamianie kontenerów. Potrzebujesz tylko Docker Machine (małej maszyny wirtualnej z jądrem Linux) w systemach operacyjnych, które nie obsługują natywnie działających kontenerów.