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:
- mogę zmodyfikować kod na OS X za pomocą narzędzi (edytor tekstu, IDE, git, itp.), które już zainstalowałem.
- 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: {]}
- i przełączyłem Boot2Docker na NFS , ale był równie wolny.
- próbowałem Vagrant + NFS, i to było równie powolne.
- próbowałem zamontować sambę , ale folder zawsze był pusty w kontenerze dokera.
- 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.
- włączyłem ankiety w Jekyll, ale to znacznie zwiększyło opóźnienie do momentu wybrania moich zmian w górę.
- 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.
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
- Install Boot2Docker:
brew install boot2docker
. - Uruchom Boot2Docker, ale z wyłączonymi folderami udostępnionymi VirtualBox:
boot2docker init && boot2docker start --vbox-share=disable
. - Uruchom
boot2docker shellinit
i skopiuj wypisane zmienne środowiskowe do pliku~/.bash_profile
. - zainstaluj rsync na maszynie wirtualnej Boot2Docker:
boot2docker ssh "tce-load -wi rsync"
. - 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"
. - 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. - użyj Kontrolera plików, aby synchronizować pliki. Na przykład możesz użyć fswatch (
brew install fswatch
) - 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
. - 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. - Jeśli chcesz przetestować bieganie strona internetowa, uruchom polecenie
boot2docker ip
, aby dowiedzieć się, na jakim IP jest.
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.
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ąć.
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!
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óbvagrant 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
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
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).
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ą!
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
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
Co znajduje się w przyborniku:
- Docker Client
- Docker Machine
- Docker Compose (tylko Mac)
- Docker Kitematic
- VirtualBox
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