Jaki jest właściwy sposób skonfigurowania środowiska programistycznego na OS X za pomocą Dockera?

Intro

Nie mogę znaleźć dobrego sposobu na skonfigurowanie środowiska programistycznego na OS X za pomocą Dockera i Boot2dockera. Problem, na który wpadam, to jak zarządzać kodem źródłowym tak, aby:

  1. mogę zmodyfikować kod na OS X za pomocą narzędzi (edytor tekstu, IDE, git, itp.), które już zainstalowałem.
  2. Te modyfikacje znajdują odzwierciedlenie w kontenerze Dockera, więc jeśli ponownie uruchamiam testy lub odświeżam stronę internetową, mogę natychmiast zobaczyć moje zmiany.

W teoria, to powinno być łatwe do zrobienia, montując mój kod źródłowy jako wolumin:

docker run -it -v /path/to/my/source/code:/src some-docker-image

Niestety, ma to dwa główne problemy, które sprawiają, że jest całkowicie bezużyteczny na OS X:

Problem # 1: montowane woluminy na Virtualboxie (które używają vboxsf) są bardzo wolne.]}

Na przykład, oto jak długo zajmuje Jekyll skompilowanie mojej strony głównej , jeśli kod źródłowy jest częścią obrazu dokera:

> docker run -it brikis98/yevgeniy-brikman-homepage:v1 bash

root@7aaea30d98a1:/src# time bundle exec jekyll build

[...]

real    0m7.879s
user    0m7.360s
sys     0m0.600s

Tutaj jest dokładnie ten sam obraz dokera, tyle że tym razem montuję źródło kod z OS X:

> docker run -it -v $(pwd):/src brikis98/yevgeniy-brikman-homepage:v1 bash

root@1521b0b4ce6a:/src# time bundle exec jekyll build

[...]

real    1m14.701s
user    0m9.450s
sys     0m3.410s

Problem # 2: File watching is broken

Domyślne mechanizmy zegarka w SBT, Jekyll i grunt używają technologii takich jak inotify, które nie działają, jeśli są uruchomione w kontenerze dokera, a zmiany są wprowadzane w OS X do zamontowanego folderu.

Obejścia, które wypróbowałem

Szukałem rozwiązań (w tym wszystkich NA SO) i wypróbowałem kilka z nich, ale nie znalazłem udanego: {]}

  1. i przełączyłem Boot2Docker na NFS , ale był równie wolny.
  2. próbowałem Vagrant + NFS, i to było równie powolne.
  3. próbowałem zamontować sambę , ale folder zawsze był pusty w kontenerze dokera.
  4. próbowałem użyć systemu plików Unison , który działał krótko do synchronizacji plików, ale potem pokazywał błędy połączenia.
  5. włączyłem ankiety w Jekyll, ale to znacznie zwiększyło opóźnienie do momentu wybrania moich zmian w górę.
  6. próbowałemDinghy , "szybszego, przyjazniejszego dokera na OS X z Vagrantem" i dostałemjakąś poprawę. Zamiast kompilacji Jekylla, która była 10-15x wolniejsza, była 2-3x wolniejsza. To jest lepsze, ale wciąż nie do końca użyteczne.

Czy ktoś znalazł rozwiązanie, które faktycznie działa i pozwala na produktywne tworzenie kodu za pomocą Dockera i OS X?

Aktualizacja: nareszcie rozwiązanie!

W końcu znalazłem rozwiązanie, które wydaje się produktywne przy użyciu Boot2Docker + rsync. Szczegóły jak to ustawić w moja własna odpowiedź, a także projekt open-source o nazwie Docker-osx-dev.

Author: Boann, 2015-05-07

10 answers

postanowiłem dodać własną odpowiedź z najlepszym rozwiązaniem, jakie do tej pory znalazłem. Zaktualizuję to, jeśli znajdę lepsze opcje.

Najlepsze rozwiązanie do tej pory

Najlepsze rozwiązanie, jakie znalazłem, aby skonfigurować produktywne środowisko programistyczne z Dockerem na OS X to: Boot2Docker + Rsync. Dzięki rsync czasy kompilacji w kontenerze Docker są na równi z uruchomieniem kompilacji bezpośrednio na OSX! Co więcej, Kod kontrolera pliku nie wymaga (inotify działa, ponieważ rsync używa zwykłych folderów), więc hot reload jest prawie tak szybkie.

Istnieją dwa sposoby jej skonfigurowania: automatyczna instalacja i Ręczna instalacja.

Automatyczna instalacja

Spakowałem wszystkie kroki konfiguracji Boot2Docker z Rsync do projektu open source o nazwie Docker-osx-dev. Kod jest nieco szorstki, ale z powodzeniem używam go od kilku tygodni, aby łatwo przełączać się między projektami 3 z 3 różnymi stosami technologicznymi. Spróbuj to się, zgłaszać błędy, i zgłosić kilka PRs! Zobacz też mój post na blogu, produktywne środowisko programistyczne z Dockerem na OS X , aby uzyskać więcej informacji.

Konfiguracja Manualna

  1. Install Boot2Docker: brew install boot2docker.
  2. Uruchom Boot2Docker, ale z wyłączonymi folderami udostępnionymi VirtualBox: boot2docker init && boot2docker start --vbox-share=disable.
  3. Uruchom boot2docker shellinit i skopiuj wypisane zmienne środowiskowe do pliku ~/.bash_profile.
  4. zainstaluj rsync na maszynie wirtualnej Boot2Docker: boot2docker ssh "tce-load -wi rsync".
  5. Utwórz bazę foldery, których potrzebujesz na maszynie wirtualnej Boot2Docker i ustaw dla nich poprawnie uprawnienia. Na przykład, jeśli chcesz synchronizować folder /foo/bar z systemu OS X, musisz utworzyć /foo/bar na maszynie wirtualnej Boot2Docker: boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar".
  6. Uruchom rsync, aby zsynchronizować pliki z maszyną wirtualną Boot2Docker: rsync --archive --rsh="ssh -i $HOME/.ssh/id_boot2docker -o StrictHostKeyChecking=no" /foo/bar docker@dockerhost:/foo. Sprawdź w dokumentach rsync różne ustawienia, które możesz włączyć, na przykład używając --exclude .git, aby wykluczyć folder .git podczas synchronizacji.
  7. użyj Kontrolera plików, aby synchronizować pliki. Na przykład możesz użyć fswatch (brew install fswatch)
  8. w tym momencie powinieneś móc użyć docker run do uruchomienia kontenera dokera i użyć flagi -v do zamontowania folderu, który synchronizujesz: docker run -v /foo/bar:/src some-docker-image.
  9. zaktualizuj kod na OS X jak zwykle. Zmiany powinny rozprzestrzeniać się bardzo szybko przy użyciu rsync, normalny kod kontroli plików powinien odbierać zmiany jak zwykle( tj. używając inotify), a kompilacja powinna działać szybko, ponieważ wszystkie pliki są "lokalne" dla kontenera.
  10. Jeśli chcesz przetestować bieganie strona internetowa, uruchom polecenie boot2docker ip, aby dowiedzieć się, na jakim IP jest.
 46
Author: Yevgeniy Brikman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-25 19:32:44

Update: Teraz, gdy docker for mac jest w wersji beta z funkcją non-hack, Przejście tej trasy może być o wiele bardziej rozsądne dla lokalnego rozwoju bez eseju wartości hacków i obejść.

Nie. Wiem, że nie jest to odpowiedź, na którą prawdopodobnie liczysz, ale weź szczerą ocenę kosztów / korzyści z próby uzyskania lokalnego kodu źródłowego + dokowanego wykonania vs po prostu robi lokalny rozwój na OSX.

W pewnym momencie wszystkie problemy, konfiguracja wysiłek, i operacyjne punkty bólu mogą być rozwiązane wystarczająco dobrze, ale na razie moim zdaniem jest to strata netto.

Problem # 1: montowane woluminy na wirtualnej skrzynce (które używają vboxfs) są bardzo wolne

Poczekaj chwilę, a to prawie na pewno się poprawi.

Problem # 2: File watching is broken

Nie jestem pewien, czy naprawa tego nastąpi w najbliższej przyszłości. Jeśli tego typu funkcjonalność jest kluczem do rozwoju przepływu pracy, chciałbym rozważyć to zerwanie umowy. Nie jest to warte większego wysiłku Badawczo-Rozwojowego w porównaniu z używaniem rbenv/bundler do zarządzania instalacjami jekyll / ruby i uruchamiania ich lokalnie na OSX, tak jak ludzie robili to z powodzeniem przez ostatnią dekadę+.

Tak jak "chmura" nie ma żadnego zaangażowania w moją lokalną konfigurację programistyczną, w tej chwili docker to wygrana dla testowania/stagingu/wdrażania oraz dla uruchamiania baz danych i innych komponentów stron trzecich, ale aplikacje, które aktualnie koduję, są uruchamiane od razu OSX.

 18
Author: Peter Lyons,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-27 05:08:25

Docker dla Mac i Windows będzie definitywnym sposobem rozwoju z Dockerem na OS X (i Windows). Oprogramowanie Docker to " zintegrowane, łatwe do wdrożenia środowisko do budowania, montażu i wysyłki aplikacji z komputerów Mac lub Windows."Ma być w stanie rozwiązać problemy przedstawione przez OP. z jego 24 marca 2016 ogłoszenie :

  • szybszy i bardziej niezawodny: koniec z Virtualboxem! Silnik Docker pracuje w Alpine Dystrybucja Linuksa na maszynie wirtualnej xhyve w systemie Mac OS X lub na maszynie wirtualnej Hyper-V w systemie Windows, a ta maszyna wirtualna jest zarządzana przez aplikację Docker. Nie potrzebujesz docker-machine, aby uruchomić Docker dla Mac i Windows.
  • integracja narzędzi: Docker for Mac to aplikacja dla komputerów Mac, a Docker for Windows To aplikacja dla systemu Windows, zawierająca natywny interfejs użytkownika i funkcję automatycznej aktualizacji. Zestaw narzędzi Docker zawiera: wiersz poleceń Docker, Docker Compose i Docker Notary command Kolejka
  • montowanie woluminów dla kodu i danych: dostęp do danych woluminów działa poprawnie, w tym powiadomienia o zmianie plików (na komputerze Mac inotify działa teraz bezproblemowo wewnątrz kontenerów dla katalogów montowanych woluminów). Umożliwia to edycję / testowanie cykli dla tworzenia "w kontenerze".
  • łatwy dostęp do uruchomionych kontenerów w lokalnej sieci hosta: Docker dla komputerów Mac i Windows zawiera serwer DNS dla kontenerów i jest zintegrowany z systemem sieciowym Mac OS X i Windows. Na Macu, Docker może być używany nawet po podłączeniu do bardzo restrykcyjnej korporacyjnej sieci VPN.
  • Docker dla komputerów Mac został zaprojektowany od podstaw, aby pasował do modelu bezpieczeństwa OS X sandbox i ściśle współpracujemy z Apple, aby to osiągnąć.
 12
Author: Quinn Comendant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-25 17:34:59

Zastrzeżenie: mogę być stronniczy, ponieważ jestem autorem docker-sync.

Prawdopodobnie wypróbowałem wszystkie wymienione tutaj rozwiązania, w tym kilka innych (patrz compersion https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync ), ale w zasadzie albo zawiodły po stronie wydajności (większość z nich), albo na maszynie dokującej (lub żadnej) używanej / egzekwowanej.

Http://docker-sync.io został zbudowany, aby połączyć wszystkie rozwiązania i zapewnić najlepsze strategie (realizacja kilku, można wybrać).

Może być używany z rsync (1 way sync), w tym poprawki uprawnień dla użytkowników, oraz z unison (2 way sync). Nie zmusza cię do docker-machine lub określonego hipernadzorcy, ani nie wymaga posiadania docker for Mac. To działa z nimi wszystkimi.

The performance / Docker-sync/wiki / 4.- Wydajność nie ma wpływu, to tak, jakbyś nie miał żadnych udziałów.

Docker-sync i jego obserwatorzy zmian są zoptymalizowani i pracować z projektami z plikami 12k bez problemów.

Spróbuj, jeśli chcesz, chciałbym usłyszeć opinie!

 3
Author: Eugen Mayer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-15 19:16:23

Czuję Cię! Myślę, że próbowałem prawie wszystkiego, co Ty próbowałeś i niestety nadal było powolne. Wtedy natknąłem się na ten komentarz https://github.com/boot2docker/boot2docker/issues/64#issuecomment-70689254 to sugeruje użycie Vagrant i Parallels zamiast Virtualbox. To pozwoliło mi używać nfs i rzeczywiście widziałem duży wzrost wydajności dla mojego projektu (Drupal).

Oto akta włóczęgi. Wszystko co musisz zrobić to zainstalować vagrant, skopiuj to do pliku o nazwie Vagrantfile i umieść go w jakimś folderze. Przejdź do tego folderu i po prostu zrób vagrant up zamiast normalnego boot2dockera.
Vagrant.configure(2) do |config|
  config.vm.box = "parallels/boot2docker"

  config.vm.network "forwarded_port", guest: 80, host: 80

  config.vm.synced_folder(
    "/Users/dicix/work/www", "/vagrant",
    type: 'nfs',
    nfs_udp: true,
    mount_options: %w[actimeo=2],
    bsd__nfs_options: %w[alldirs maproot=root:wheel]
  )
end
 2
Author: Alex Dicianu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-07 06:32:41

Używam również Vagrant z parallels i boot2docker (https://github.com/Parallels/boot2docker-vagrant-box ). rozwój nigdy nie był dla mnie łatwiejszy. Działa naprawdę dobrze z docker-compose i dużymi ustawieniami. Nie czuję opóźnienia ani ogromnego zużycia zasobów.

Tak wygląda moja Vagrantfile:

Vagrant.configure(2) do |config|

  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.box = "parallels/boot2docker"

  config.vm.synced_folder "/Users", "/Users", type: "nfs", mount_options: ["nolock", "vers=3", "udp"], id: "nfs-sync"

end
 2
Author: David Heidrich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-02 20:13:21

Od kilku tygodni rozwijam się w środowisku OS X (MacBook Air w połowie 2011 roku) + Boot2Docker + docker-compose. Nie miałem większych problemów z wydajnością, ale unikam uruchamiania jakichkolwiek kompilacji podczas tworzenia (dlaczego nie użyć czegoś takiego jak jekyll serve --skip-initial-build?). Oto przykład docker-compose.yml pliku, którego używam:

Docker-compose.yml:

test:
  build: .
  volumes:
    - ./client:/src/client
    - ./server:/src/server
    - ./test:/src/test
  command: nodemon --exec jasmine-node -- test/ --verbose --autotest --captureExceptions --color
  environment:
    - DEBUG=*

Dockerfile:

FROM node:0.12

RUN mkdir -p /src
WORKDIR /src

ENV PATH=/src/node_modules/.bin:$PATH

# We add package.json first so that we the
# image build can use the cache as long as the
# contents of package.json hasn't changed.

COPY package.json /src/
RUN npm install --unsafe-perm

COPY . /src

CMD [ "npm", "start" ]
EXPOSE 3000

Czasami używam NFS ( http://syskall.com/using-boot2docker-using-nfs-instead-of-vboxsf / ) ale nie zauważyłem duża różnica w wydajności przy tym.

Dla mnie wygoda prostego docker-compose up test uruchomienia mojego środowiska była warta kosztów wydajności (rutynowo pracuję nad wieloma projektami z różnymi stosami).

PS: nodemon jest jednym z niewielu obserwatorów plików, które współpracują z vboxsf (zobacz https://github.com/remy/nodemon/issues/419).

 1
Author: Olivier Lalonde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-07 06:21:36

Docker Unison działa jak czar! https://github.com/leighmcculloch/docker-unison

Dwukierunkowa synchronizacja z bardzo dobrą wydajnością!

 0
Author: smith64fx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-28 04:59:36

Uruchomienie Dockera jako narzędzia programistycznego jest możliwe. Ale będzie bolało. Udokumentowałem ten proces tutaj:

Http://harmingcola.blogspot.com/2015/05/how-to-setup-docker-as-development-tool.html

 -1
Author: harmingcola,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-07 10:32:29

Ta metoda jest najnowszym (Wrzesień 2015) i najłatwiejszym sposobem na skonfigurowanie Dockera na komputerze Mac: link tutaj:

Instalujesz Dockera używając Docker Toolbox link do instrukcji tutaj:

Jest to kompletny pakiet konfiguracji Dockera, zawiera następujące narzędzia Docker:

Docker Maszyna do uruchamiania Docker-maszyna binarna

Silnik Dockera do uruchamiania pliku binarnego Dockera

Docker Compose do uruchamiania docker-compose binary

Kitematic, Docker GUI powłoka wstępnie skonfigurowana dla środowiska wiersza poleceń Dockera

Oracle VM VirtualBox

Tutaj wpisz opis obrazka

Co znajduje się w przyborniku:

  • Docker Client
  • Docker Machine
  • Docker Compose (tylko Mac)
  • Docker Kitematic
  • VirtualBox
 -4
Author: rootscript,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-22 22:53:51