it-swarm.com.de

Was ist der richtige Weg, um eine Entwicklungsumgebung unter OS X mit Docker einzurichten?

Intro

Ich kann keine gute Möglichkeit finden, eine Entwicklungsumgebung unter OS X mit Docker und Boot2Docker einzurichten. Das Problem ist, wie man den Quellcode so verwaltet, dass:

  1. Ich kann den Code unter OS X mit den bereits installierten Tools (Texteditor, IDE, Git usw.) ändern.
  2. Diese Änderungen werden im Docker-Container angezeigt. Wenn ich also Tests erneut durchführe oder eine Webseite aktualisiere, kann ich meine Änderungen sofort sehen.

Theoretisch sollte dies einfach zu bewerkstelligen sein, indem ich meinen Quellcode als Volume mounte:

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

Leider hat dies zwei Hauptprobleme, die es unter OS X völlig unbrauchbar machen:

Problem 1: Bereitgestellte Volumes auf VirtualBox (die vboxsf verwenden) sind extrem langsam

Hier ist zum Beispiel, wie lange Jekyll benötigt, um meine Homepage zu kompilieren, wenn der Quellcode Teil des Docker-Image ist:

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

[email protected]:/src# time bundle exec jekyll build

[...]

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

Hier ist genau das gleiche Docker-Image, außer dass ich diesmal den Quellcode von OS X mounte:

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

[email protected]:/src# time bundle exec jekyll build

[...]

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

Problem Nr. 2: Die Dateiüberwachung ist fehlerhaft

Die Standardüberwachungsmechanismen in SBT, Jekyll und Grunt verwenden Technologien wie inotify, die nicht funktionieren, wenn sie in einem Docker-Container ausgeführt werden und die Änderungen in OS X an einem bereitgestellten Ordner vorgenommen werden.

Problemumgehungen, die ich versucht habe

Ich habe nach Lösungen gesucht (einschließlich aller auf SO) und ein paar ausprobiert, aber keine erfolgreiche gefunden:

  1. Ich habe Boot2Docker auf NFS umgestellt , aber es war genauso langsam.
  2. Ich habe versucht Vagrant + NFS , und das war auch genauso langsam.
  3. Ich habe versucht, Samba-Mount zu verwenden, aber der Ordner war im Docker-Container immer leer.
  4. Ich habe versucht, das nison-Dateisystem zu verwenden, das beim Synchronisieren von Dateien kurz funktioniert hat, dann aber Verbindungsfehler beibehalten hat.
  5. Ich habe Polling in Jekyll aktiviert, aber das hat die Verzögerung bis zur Übernahme meiner Änderungen deutlich erhöht.
  6. Ich habe Dinghy , einen "schnelleren, freundlicheren Docker unter OS X mit Vagrant", ausprobiert und einige Verbesserungen erhalten. Anstatt dass die Jekyll-Kompilierung 10-15x langsamer war, war sie 2-3x langsamer. Das ist besser, aber noch nicht ganz brauchbar.

Hat jemand eine Lösung gefunden, die tatsächlich funktioniert und es Ihnen ermöglicht, Code mit Docker und OS X produktiv zu entwickeln?

Update: endlich eine Lösung!

Ich habe endlich eine Lösung gefunden, die mit Boot2Docker + rsync produktiv zu sein scheint. Ich habe die Details zur Einrichtung in meine eigene Antwort sowie in einem Open-Source-Projekt namens docker-osx-dev festgehalten.

93

Ich habe beschlossen, meine eigene Antwort mit der besten Lösung hinzuzufügen, die ich bisher gefunden habe. Ich werde dies aktualisieren, wenn ich bessere Optionen finde.

Beste Lösung bisher

Die beste Lösung, die ich zum Einrichten einer produktiven Entwicklungsumgebung mit Docker unter OS X gefunden habe, ist: Boot2Docker + Rsync . Mit rsync sind die Build-Zeiten in einem Docker-Container mit der Ausführung des Builds direkt unter OSX vergleichbar! Außerdem muss der File-Watcher-Code nicht abgefragt werden (inotify funktioniert, da rsync normale Ordner verwendet), sodass das Neuladen bei laufendem Betrieb fast genauso schnell ist .

Es gibt zwei Möglichkeiten, es einzurichten: eine automatische Installation und eine manuelle Installation.

Automatisierte Installation

Ich habe alle Schritte zum Einrichten von Boot2Docker mit Rsync in einem Open Source-Projekt namens docker-osx-dev zusammengefasst. Der Code ist etwas rau, aber ich habe ihn mehrere Wochen erfolgreich verwendet, um problemlos zwischen 3 Projekten mit 3 verschiedenen technischen Stacks zu wechseln. Probieren Sie es aus, melden Sie Fehler und reichen Sie PRs ein! Weitere Informationen finden Sie in meinem Blog-Beitrag Eine produktive Entwicklungsumgebung mit Docker unter OS X .

Manuelle Einrichtung

  1. Installieren Sie Boot2Docker : brew install boot2docker.
  2. Führen Sie Boot2Docker aus, aber mit deaktivierten freigegebenen VirtualBox-Ordnern: boot2docker init && boot2docker start --vbox-share=disable.
  3. Führen Sie boot2docker shellinit Aus und kopieren Sie die ausgedruckten Umgebungsvariablen in Ihre ~/.bash_profile - Datei.
  4. Installieren Sie rsync auf der Boot2Docker-VM: boot2docker ssh "tce-load -wi rsync".
  5. Erstellen Sie die Basisordner, die Sie auf dem Boot2Docker benötigen VM) und legen Sie die Berechtigungen für diese ordnungsgemäß fest. Wenn Sie beispielsweise den Ordner /foo/bar Unter OS X synchronisieren, müssen Sie dies tun Erstellen Sie /foo/bar auf der Boot2Docker-VM: boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar".
  6. Führen Sie rsync aus, um die Dateien mit der Boot2Docker-VM zu synchronisieren: rsync --archive --rsh="ssh -i $HOME/.ssh/id_boot2docker -o StrictHostKeyChecking=no" /foo/bar [email protected]:/foo. Überprüfen Sie die rsync-Dokumente auf verschiedene Einstellungen, die Sie möglicherweise aktivieren möchten, z. B. die Verwendung von --exclude .git, Um den Ordner .git Beim Synchronisieren auszuschließen.
  7. Verwenden Sie eine Dateiüberwachung, um Dateien synchron zu halten. Beispielsweise könnten Sie fswatch (brew install fswatch) Verwenden, das in rsync weitergeleitet wird.
  8. Zu diesem Zeitpunkt sollten Sie in der Lage sein, Ihren Docker-Container mit docker run Zu starten und den Ordner, den Sie synchronisieren, mit dem -v - Flag einzuhängen: docker run -v /foo/bar:/src some-docker-image.
  9. Aktualisieren Sie den Code unter OS X wie gewohnt. Änderungen sollten sich mit rsync sehr schnell verbreiten, der normale Dateiüberwachungscode sollte die Änderungen wie gewohnt übernehmen (dh mit inotify), und der Build sollte schnell ausgeführt werden, da alle Dateien für den Container "lokal" sind.
  10. Wenn Sie eine laufende Website testen müssen, führen Sie den Befehl boot2docker ip Aus, um herauszufinden, auf welcher IP sie sich befindet.
46

Update : Nun, da Docker für Mac in der Beta-Version mit Nicht-Hack-Funktionalität ist, ist es möglicherweise viel sinnvoller, diese Route zu wählen für die lokale Entwicklung ohne den Wert eines Aufsatzes von Hacks und Workarounds.

Nicht . Ich weiß, dass dies nicht die Antwort ist, auf die Sie wahrscheinlich hoffen, aber nehmen Sie eine ehrliche Einschätzung der Kosten und des Nutzens des Versuchs, lokalen Quellcode und eine dockerisierte Ausführung zu erhalten, im Vergleich zu einer einfachen lokalen Entwicklung unter OSX.

Irgendwann können alle Probleme, der Einrichtungsaufwand und die operativen Probleme gut genug gelöst werden, aber im Moment ist dies ein Nettoverlust.

Problem 1: Bereitgestellte Volumes auf Virtual Box (die vboxfs verwenden) sind extrem langsam

Warten Sie eine Weile und dies wird sich mit ziemlicher Sicherheit verbessern.

Problem Nr. 2: Die Dateiüberwachung ist fehlerhaft

Ich bin mir nicht sicher, ob dies in naher Zukunft behoben werden kann. Wenn diese Art von Funktionalität der Schlüssel zu Ihrem Entwicklungsworkflow ist, würde ich dies als Dealbreaker betrachten. Es ist keine große F & E-Anstrengung wert, wenn man es mit rbenv/bundler vergleicht, um Ihre Jekyll/Ruby-Installationen zu verwalten und sie lokal unter OSX auszuführen, wie es Leute in den letzten zehn Jahren erfolgreich gemacht haben.

Genau wie "die Cloud" keine Beteiligung an meinem lokalen Entwicklungs-Setup hat, ist Docker im Moment ein Gewinn für das Testen/Staging/Deployment und für das Ausführen von Datenbanken und anderen Komponenten von Drittanbietern, aber die Anwendungen, die ich gerade codiere, werden sofort ausgeführt unter OSX.

18
Peter Lyons

Docker für Mac und Windows soll die endgültige Art der Entwicklung mit Docker unter OS X (und Windows) sein. Als Docker-Produkt ist die Software eine „integrierte, einfach zu implementierende Umgebung zum Erstellen, Zusammenbauen und Versenden von Anwendungen von Mac oder Windows“. Sie soll in der Lage sein, die vom OP gestellten Probleme zu lösen. Aus seiner Ankündigung vom 24. März 2016 :

  • Schneller und zuverlässiger: Keine VirtualBox mehr! Die Docker-Engine wird in einer Alpine Linux-Distribution auf einer xhyve Virtual Machine unter Mac OS X oder auf einem Hyper-V VM unter Windows ausgeführt, und dieses VM wird von der verwaltet Docker-Anwendung. Sie benötigen keine Docker-Maschine, um Docker für Mac und Windows auszuführen.
  • Integration der Tools: Docker für Mac ist eine Mac-Anwendung und Docker für Windows ist eine Windows-Anwendung, die eine native Benutzeroberfläche und automatische Aktualisierungsfunktionen umfasst. Das Docker-Tool-Set wird mitgeliefert: Docker-Befehlszeile, Docker Compose und Docker Notary-Befehlszeile.
  • Bereitstellen von Volumes für Code und Daten: Der Datenzugriff auf Volumes funktioniert ordnungsgemäß, einschließlich Benachrichtigungen über Dateiänderungen (auf Mac funktioniert inotify jetzt nahtlos in Containern für auf Volumes bereitgestellte Verzeichnisse). Dies ermöglicht Bearbeitungs-/Testzyklen für die Entwicklung im Container.
  • Einfacher Zugriff auf ausgeführte Container im lokalen Host-Netzwerk: Docker für Mac und Windows enthält einen DNS-Server für Container und ist in das Mac OS X- und Windows-Netzwerksystem integriert. Auf einem Mac kann Docker auch dann verwendet werden, wenn eine Verbindung zu einem sehr restriktiven Unternehmens-VPN besteht.
  • Docker für Mac wurde von Grund auf neu entwickelt, um das OS X-Sandbox-Sicherheitsmodell zu unterstützen, und wir arbeiten eng mit Apple zusammen, um dies zu erreichen.
12
Quinn Comendant

Haftungsausschluss: Ich bin möglicherweise voreingenommen, da ich der Autor von Docker-Sync bin.

Ich habe wahrscheinlich alle hier genannten Lösungen ausprobiert, einschließlich einiger weiterer (siehe compersion https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync ), aber sie Grundsätzlich ist entweder auf der Seite der Leistung (die meisten von ihnen) oder auf der Docker-Maschine (oder keiner), die verwendet/erzwungen wurde, ein Fehler aufgetreten.

http://docker-sync.io wurde erstellt, um alle Lösungen zusammenzuführen und die besten Strategien bereitzustellen (Sie können mehrere implementieren).

Es kann mit rsync (1-Wege-Synchronisierung) einschließlich Berechtigungskorrekturen für Benutzer und mit unisono (2-Wege-Synchronisierung) verwendet werden. Sie werden weder zu Docker-Maschinen oder einem bestimmten Hypervisor gezwungen, noch benötigen Sie Docker für Mac. Es funktioniert mit allen.

Die Performance von EugenMayer/docker-sync/wiki/4.-Performance wird nicht beeinflusst, es ist so, als hätten Sie überhaupt keine Shares.

docker-Sync und seine Change-Watcher sind optimiert und funktionieren problemlos mit Projekten mit 12.000 Dateien.

Probieren Sie es aus, wenn Sie möchten, würde ich gerne Feedback hören!

3
Eugen Mayer

Ich verwende Vagrant auch mit parallels und boot2docker ( https://github.com/Parallels/boot2docker-vagrant-box ). Die Entwicklung war für mich nie einfacher. Funktioniert sehr gut mit docker-compose und große Setups. Ich spüre keine Verzögerung oder keinen massiven Ressourcenverbrauch.

So sieht mein Vagrantfile aus:

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
David Heidrich

Ich kann das gut nachfühlen! Ich denke, ich habe so ziemlich alles ausprobiert, was du ausprobiert hast, und leider war es immer noch langsam. Dann bin ich auf diesen Kommentar gestoßen https://github.com/boot2docker/boot2docker/issues/64#issuecomment-70689254 der die Verwendung von Vagrant und Parallels anstelle von Virtualbox vorschlägt. Dies ermöglichte mir die Verwendung von nfs und ich sah tatsächlich einen großen Leistungsschub für mein Projekt (Drupal).

Hier ist die Vagrant-Datei. Alles, was Sie tun müssen, ist, Vagrant zu installieren, in eine Datei namens Vagrantfile zu kopieren und in einen Ordner zu kopieren. Gehe in diesen Ordner und mache einfach ein vagrant up statt deines normalen boot2docker up.

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
Alex Dicianu

Ich arbeite seit einigen Wochen in einer OS X (Mitte 2011 Macbook Air) + Boot2Docker + Docker-Compose-Umgebung. Keine größeren Leistungsprobleme, aber ich vermeide es, während der Entwicklung Builds auszuführen (warum nicht so etwas wie jekyll serve --skip-initial-build?). Hier ist ein Beispiel docker-compose.yml Datei, die ich benutze:

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

Ich verwende manchmal NFS ( http://syskall.com/using-boot2docker-using-nfs-instead-of-vboxsf/ ), habe dabei jedoch keinen großen Leistungsunterschied festgestellt.

Für mich ist die Bequemlichkeit eines einfachen docker-compose up test um meine Umgebung zum Laufen zu bringen, hat sich der Preis für die Leistung gelohnt (ich arbeite routinemäßig an mehreren Projekten mit unterschiedlichen Stacks).

PS: nodemon ist einer der wenigen Datei-Watcher, die mit vboxsf arbeiten (siehe https://github.com/remy/nodemon/issues/419 ).

1
Olivier Lalonde

Docker Unison wirkt wie ein Zauber! https://github.com/leighmcculloch/docker-unison

Bidirektionale Synchronisation mit sehr guter Leistung!

0
smith64fx