web-dev-qa-db-fra.com

Quelle est la bonne façon de configurer un environnement de développement sur OS X avec Docker?

Intro

Je ne peux pas trouver un bon moyen de configurer un environnement de développement sur OS X en utilisant Docker et Boot2Docker. Le problème que je me pose est comment gérer le code source pour que:

  1. Je peux modifier le code sous OS X à l'aide des outils (éditeur de texte, IDE, git, etc.) déjà installés.
  2. Ces modifications sont reflétées dans le conteneur Docker. Ainsi, si je relance les tests ou actualise une page Web, je peux voir mes modifications immédiatement.

En théorie, cela devrait être facile à faire en montant mon code source en tant que volume:

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

Malheureusement, cela pose deux problèmes majeurs qui le rendent complètement inutilisable sous OS X:

Problème n ° 1: les volumes montés sur VirtualBox (qui utilisent vboxsf) sont extrêmement lents

Par exemple, voici combien de temps il faut à Jekyll pour compiler ma page d'accueil si le code source fait partie de l'image Docker:

> 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

Voici exactement la même image Docker, sauf que cette fois-ci, je monte le code source sous 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

Problème n ° 2: la surveillance des fichiers est interrompue

Les mécanismes de surveillance par défaut de SBT, Jekyll et Grunt utilisent des technologies telles que inotify, qui ne fonctionnent pas si elles sont exécutées dans un conteneur Docker et si les modifications sont apportées à OS X dans un dossier monté.

Solutions que j'ai essayées

J'ai cherché des solutions (y compris toutes celles sur SO) et en ai essayé quelques unes, mais je n'ai pas trouvé de solution satisfaisante:

  1. I changé Boot2Docker pour utiliser NFS , mais c'était tout aussi lent.
  2. J'ai essayé Vagrant + NFS , et c'était aussi lent.
  3. J'ai essayé Samba mount , mais le dossier était toujours vide dans le conteneur Docker.
  4. J'ai essayé d'utiliser le système de fichiers nison , qui a fonctionné brièvement pour synchroniser les fichiers, mais qui a ensuite été conservé montrant les erreurs de connexion .
  5. J'ai activé polling in Jekyll , mais cela a considérablement augmenté le délai jusqu'à ce que mes modifications soient prises en compte.
  6. J'ai essayé Dinghy , un "Docker plus rapide et plus convivial sur OS X avec Vagrant" et j'ai quelques améliorations . Au lieu que la compilation Jekyll soit 10-15x plus lente, elle était 2-3x plus lente. C'est mieux, mais pas encore tout à fait utilisable.

Quelqu'un a-t-il trouvé une solution qui fonctionne réellement et qui vous permet de développer du code de manière productive avec Docker et OS X?

Mise à jour: une solution enfin!

J'ai finalement trouvé une solution qui semble productive avec Boot2Docker + rsync. J'ai capturé les détails sur la manière de configurer ceci dans ma propre réponse ainsi qu'un projet open-source appelé docker-osx-dev .

93

J'ai décidé d'ajouter ma propre réponse avec la meilleure solution que j'ai trouvée jusqu'à présent. Je le mettrai à jour si je trouve de meilleures options.

Meilleure solution jusqu'à présent

La meilleure solution que j'ai trouvée pour configurer un environnement de développement productif avec Docker sous OS X est la suivante: Boot2Docker + Rsync . Avec rsync, les temps de génération dans un conteneur Docker sont équivalents à l'exécution de la génération directement sur OSX! De plus, le code de l'observateur de fichiers ne pas nécessite une interrogation (inotify fonctionne, car rsync utilise des dossiers normaux). Le rechargement à chaud est donc presque aussi vite.

Il existe deux manières de le configurer: une installation automatisée et une installation manuelle.

Installation automatisée

J'ai regroupé toutes les étapes de la configuration de Boot2Docker avec Rsync dans un projet open source appelé docker-osx-dev . Le code est un peu approximatif, mais je l'utilise avec succès depuis plusieurs semaines pour basculer facilement entre 3 projets avec 3 piles technologiques différentes. Essayez-le, signalez les bugs et soumettez des PR! Voir également mon article de blog, n environnement de développement productif avec Docker sous OS X pour plus d'informations.

Configuration manuelle

  1. Installer Boot2Docker : brew install boot2docker.
  2. Exécutez Boot2Docker, mais avec les dossiers partagés de VirtualBox désactivés: boot2docker init && boot2docker start --vbox-share=disable.
  3. Courir boot2docker shellinit et copiez les variables d’environnement qu’il imprime dans votre ~/.bash_profile fichier.
  4. Installez rsync sur la machine virtuelle Boot2Docker: boot2docker ssh "tce-load -wi rsync".
  5. Créez les dossiers de base dont vous avez besoin sur le Boot2Docker VM et définissez les autorisations correspondantes. Par exemple, si vous synchronisez le /foo/bar dossier d’OS X, vous devez créer /foo/bar sur la machine virtuelle Boot2Docker: boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar".
  6. Exécutez rsync pour synchroniser les fichiers sur la machine virtuelle Boot2Docker: rsync --archive --rsh="ssh -i $HOME/.ssh/id_boot2docker -o StrictHostKeyChecking=no" /foo/bar docker@dockerhost:/foo. Recherchez dans la documentation de rsync les divers paramètres que vous pouvez activer, tels que l’utilisation de --exclude .git pour exclure le .git dossier lors de la synchronisation.
  7. Utilisez un observateur de fichiers pour garder les fichiers synchronisés. Par exemple, vous pouvez utiliser fswatch (brew install fswatch) transféré dans rsync.
  8. À ce stade, vous devriez pouvoir utiliser docker run pour allumer votre conteneur Docker et utiliser le -v drapeau pour monter le dossier que vous synchronisez: docker run -v /foo/bar:/src some-docker-image.
  9. Mettez à jour le code sous OS X comme d'habitude. Les modifications devraient se propager très rapidement avec rsync, le code d’observateur de fichiers normal devrait les récupérer comme d’habitude (c.-à-d. En utilisant inotify), et la construction devrait s’exécuter rapidement car tous les fichiers sont "locaux" dans le conteneur.
  10. Si vous devez tester un site Web en cours d'exécution, exécutez la boot2docker ip commande pour savoir sur quelle adresse IP se trouve.
46

Mise à jour : Maintenant que menu fixe pour mac est en version bêta avec une fonctionnalité autre que le piratage, cette route pourrait être beaucoup plus raisonnable pour le développement local sans un essai de hacks et de solutions de contournement.

Ne pas . Je sais que ce n'est pas la solution que vous espérez probablement, mais évaluez honnêtement le rapport coût/bénéfice de la tentative d'obtenir un code source local + une exécution dockerisée par rapport au développement local sous OSX.

À un moment donné, tous les problèmes, les efforts de configuration et les problèmes opérationnels PEUVENT ÊTRE suffisamment bien résolus, mais pour l’instant, j’en déduis que c’est une perte nette.

Problème n ° 1: les volumes montés sur Virtual Box (qui utilisent vboxfs) sont extrêmement lents

Attendez un peu et cela va certainement s'améliorer.

Problème n ° 2: la surveillance des fichiers est interrompue

Je ne suis pas sûr que la solution à ce problème se présente dans un proche avenir. Si ce type de fonctionnalité est la clé de votre flux de travail de développement, je considérerais cela comme un dealbreaker. Cela ne vaut pas la peine de faire un gros effort de R & D par rapport à l’utilisation de rbenv/bundler pour gérer vos installations jekyll/Ruby et à leur exécution locale sur OSX, comme le font les gens depuis une décennie.

Tout comme "le cloud" n'a aucune implication dans la configuration de mon développement local, pour le moment, docker est une solution gagnante pour les tests/le stockage intermédiaire/le déploiement et pour l'exécution de bases de données et d'autres composants tiers, mais les applications que je suis en train de coder s'exécutent directement. sur OSX.

18
Peter Lyons

Docker pour Mac et Windows sera la méthode définitive de développement avec Docker sous OS X (et Windows). Produit Docker, le logiciel est un "environnement intégré, facile à déployer pour la création, l’assemblage et la livraison d’applications depuis Mac ou Windows". Il est censé pouvoir résoudre les problèmes présentés par le PO. Depuis son annonce du 24 mars 2016 :

  • Plus rapide et plus fiable: plus de VirtualBox! Le moteur Docker s’exécute dans une distribution Alpine Linux sur une machine virtuelle xhyve sous Mac OS X ou sur un Hyper-V VM sous Windows, et que VM est géré par le Application Docker. Vous n’avez pas besoin de Docker-Machine pour exécuter Docker pour Mac et Windows.
  • Intégration des outils: Docker pour Mac est une application Mac et Docker pour Windows est une application Windows, comprenant une interface utilisateur native et une fonctionnalité de mise à jour automatique. Le jeu d’outils Docker est fourni avec la ligne de commande Docker, Docker Compose et la ligne de commande Docker Notary.
  • Montage en volume pour votre code et vos données: l'accès aux données en volume fonctionne correctement, y compris les notifications de modification de fichier (sur Mac, inotify fonctionne désormais de manière transparente à l'intérieur des conteneurs pour les répertoires montés en volume). Cela active les cycles d’édition/test pour le développement "dans le conteneur".
  • Accès facile aux conteneurs en cours d’exécution sur le réseau hôte local: Docker pour Mac et Windows incluent un serveur DNS pour les conteneurs et sont intégrés au système de mise en réseau Mac OS X et Windows. Sur un Mac, Docker peut être utilisé même lorsqu'il est connecté à un VPN d'entreprise très restrictif.
  • Docker pour Mac a été entièrement conçu pour s'adapter au modèle de sécurité du bac à sable OS X. Nous travaillons en étroite collaboration avec Apple pour atteindre cet objectif.
12
Quinn Comendant

Disclaimer: Je suis peut-être partial, car je suis l'auteur de docker-sync.

J'ai probablement essayé toutes les solutions citées ici, y compris quelques autres (voir la compersion https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync ), mais elles fondamentalement, soit ils ont échoué du côté des performances (la plupart d’entre eux), soit du poste de travail fixe (ou aucun) utilisé/appliqué.

http://docker-sync.io a été construit pour fusionner toutes les solutions et fournir les meilleures stratégies (en en choisissant plusieurs, vous pouvez choisir).

Il peut être utilisé avec rsync (synchronisation à 1 voie), y compris les correctifs d’autorisations pour les utilisateurs, et à l’unisson (synchronisation à 2 voies). Il ne vous force pas à entrer dans Docker-Machine ou dans un hyperviseur spécifique, ni vous oblige à avoir Docker pour Mac. Cela fonctionne avec tous.

La performance EugenMayer/docker-sync/wiki/4.-Performance n'est pas influencée, c'est comme si vous n'aviez aucune action.

docker-sync et ses observateurs de changement sont optimisés et travaillent avec des projets de 12k fichiers sans problème.

Essayez, si vous le souhaitez, j'aimerais connaître vos commentaires!

3
Eugen Mayer

J'utilise également Vagrant avec parallels et boot2docker ( https://github.com/Parallels/boot2docker-vagrant-box ). Le développement n'a jamais été aussi facile pour moi. Fonctionne très bien avec docker-compose et grandes configurations. Je ne ressens pas vraiment de retard ou de consommation massive de ressources.

Voici à quoi ressemble mon 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
David Heidrich

Je vous comprends! Je pense avoir essayé à peu près tout ce que vous avez essayé et malheureusement, c'était encore lent. Puis je suis tombé sur ce commentaire https://github.com/boot2docker/boot2docker/issues/64#issuecomment-70689254 qui suggère d'utiliser Vagrant et Parallels au lieu de Virtualbox. Cela m’a permis d’utiliser nfs et j’ai en effet constaté une forte amélioration des performances de mon projet (Drupal).

Voici le fichier Vagrant. Tout ce que vous avez à faire est d'installer vagrant, de le copier dans un fichier nommé Vagrantfile et de le placer dans un dossier. Allez dans ce dossier et faites juste un vagrant up au lieu de votre boot2docker normal.

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

Je développe depuis quelques semaines dans un environnement OS X (Macbook Air mi-2011) + Boot2Docker + Docker. Je n’ai pas rencontré de problèmes majeurs de performances, mais j’évite d’exécuter toute sorte de construction lors du développement (pourquoi ne pas utiliser quelque chose comme jekyll serve --skip-initial-build?). Voici un exemple de fichier docker-compose.yml Que j'utilise:

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

J'utilise parfois NFS ( http://syskall.com/using-boot2docker-using-nfs-instead-of-vboxsf/ ), mais je n'ai pas remarqué de grande différence de performances entre les deux projets.

Pour moi, la commodité d'un simple docker-compose up test Pour faire fonctionner mon environnement en a valu la peine en termes de performances (je travaille régulièrement sur plusieurs projets avec différentes piles).

PS: nodemon est l’un des rares observateurs de fichiers fonctionnant avec vboxsf (voir https://github.com/remy/nodemon/issues/419 ).

1
Olivier Lalonde

Docker Unison fonctionne à merveille! https://github.com/leighmcculloch/docker-unison

Synchronisation bidirectionnelle avec une très bonne performance!

0
smith64fx