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 pour configurer un environnement de développement sur OS X à l'aide de Docker et Boot2Docker. Le problème, je vais frapper est de savoir comment gérer le code source, de sorte que:
- Je peux modifier le code sur OS X en utilisant les outils (éditeur de texte, IDE, git, etc) j'ai déjà installé.
- Ces modifications sont reflétées dans le conteneur Docker donc, si je ré-exécution de tests ou d'actualiser une page web, je peux voir mes modifications immédiatement.
En théorie, ce devrait être facile à faire par le montage de mon code source en un volume:
docker run -it -v /path/to/my/source/code:/src some-docker-image
Malheureusement, cela a deux problèmes majeurs qui le rendre totalement inutilisable sur OS X:
Question n ° 1: les volumes Montés sur Virtual Box (qui utilisent vboxsf) sont extrêmement lents
Par exemple, ici, c'est combien de temps cela prend Jekyll pour compiler mon page d'accueil si le code source est la 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
Ici est exactement le même menu fixe de l'image, sauf que cette fois, je monte le code source à partir d'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
Question n ° 2: le Fichier de regarder est cassé
La montre par défaut des mécanismes de SBT, Jekyll, et grunt utiliser des technologies telles que inotify, qui ne fonctionnent pas si elles sont en cours d'exécution dans un conteneur Docker et les modifications sont apportées dans OS X à un dossier monté.
Solutions de contournement, j'ai essayé de
J'ai cherché des solutions (y compris tous les sur DONC) et essayé un peu, mais n'ont pas trouvé un succès:
- Je commutation de Boot2Docker pour utiliser NFS, mais il était tout aussi lent.
- J'ai essayé Vagrant + NFS, et qui est tout aussi lent.
- J'ai essayé un Samba de montage, mais le dossier est toujours montré vide dans le conteneur Docker.
- J'ai essayé d'utiliser le l'unisson de système de fichiers, qui a travaillé brièvement pour synchroniser les fichiers, mais ensuite maintenu montrant les erreurs de connexion.
- J'ai activé les sondages dans Jekyll, mais ce qui accroît sensiblement le délai jusqu'à ce que mes modifications ont été ramassés.
- J'ai essayé dériveur, un "plus rapide, plus convivial Docker sur OS X avec Vagrant" et a obtenu certains amélioration. Au lieu de jekyll compilation de 10-15x plus lent, il était de 2-3x plus lent. C'est mieux, mais pas encore tout à fait utilisable.
Quelqu'un a trouvé une solution qui fonctionne réellement et permet de développer de manière productive code avec Docker et OS X?
Mise à jour: une solution à la dernière!
J'ai enfin trouvé une solution qui semble être productif à l'aide de Boot2Docker + rsync. J'ai capturé les détails sur comment configurer cela dans ma propre réponse ainsi qu'un projet open source appelé docker-osx-dev.
- Vous avez essayé de le officiel Docker programme d'installation pour OS X à droite le long avec NFS? Autant que je sache, ce n'est pas un problème limité à Docker sur OS X, mais aussi Erratique en fonction du développement sur OS X avec la plus grande base de code(s) (nous avons un problème similaire mais avec Vagrant). J'ai trouvé NFS être la seule solution viable et acceptable de la solution.
- J'ai suivi les instructions officielles pour installer Docker et Boot2Docker. Sont là les instructions officielles pour la configuration de NFS? Je n'ai trouvé dans un GitHub gist, et après leur utilisation, il ne semble pas plus rapide. Comment avez-vous configuration de NFS?
- Avez-vous vu github.com/boot2docker/boot2docker/issues/64 ?
- La bonne façon de travailler avec menu fixe est de lancer Linux en natif au lieu de OS X, ou faire tout votre travail de développement à l'intérieur d'une machine virtuelle Linux. Le "boot2docker" l'intégration est un gros vilain hack qui ne fait rien mais semer la confusion et de déception.
- après la lecture par le biais de tous les 70 commentaires, j'ai trouvé ce script qui est censé changer VirtualBox pour utiliser NFS. Après l'exécution, les performances pour monté des dossiers est toujours aussi mauvais. J'ai mis à jour la question d'origine avec l'exemple de timing.
- Ce n'est pas utile.
- La vérité fait mal! Et honnêtement, je ne trouve pas de faire mon travail de développement dans une VM particulièrement problématique. Je trouve ça beaucoup plus simple que de coucher avec OS X/virtualbox intégration.
- Je crois que NFS ne résoudre les problèmes de performance lorsque vous essayez de partager les ressources du système de fichiers de l'hôte de machine virtuelle. J'ai été en bas de cette route avec Vagrant base de développement. Je n'ai pas l'occasion de tester pleinement le présent et de répondre à la question pour vous en ce moment 🙂 Mon conseil serait de s'y tenir jusqu'à ce que vous résoudre 🙂 "Il devrait être possible!" (tm) 🙂
- Avez-vous suivi la même procédure que dans ce script pour activer NFS? Ou avez-vous autre chose?
- J'utilise un boot2docker iso qui inclus guest additions et de nfs. La difficulté est que je ne peux pas trouver une version mise à jour de cette norme ISO plus.
- FWIW; IHMO la méthode recommandée pour tout type de développement est de développer dans l'isolement (barding tout OS X + menu fixe des problèmes de performances avec l'hôte de partage de ressources de système de fichiers). j'.e: je développe habituellement sur mon hôte, de toute façon (Linux) et d'utiliser Docker (dans n'importe quel environnement) pour les tests, l'intégration et le déploiement(s).
- J'ai mis en place plusieurs docker dev environnements OS X, nfs est le chemin à parcourir avec vagrant, j'ai abandonné boot2docker il y a longtemps, et assurez-vous que votre temps est synchronisé.
- Désolé si c'est hors du champ gauche, mais si l'objectif est de développer sur OSX en s'appuyant sur un code externe des pensions, il est sans doute plus "indigènes" d'approche à l'aide de XCode? Peut-être que certains connecteur personnalisé ou des pensions de côté Mercurial/SVN passerelle? Je voulais juste soulever l'idée, étant donné que tous les commentaires/les solutions semblent coller à l'OPs contexte de travailler presque exclusivement avec des non-natifs de composants et d'un ou plusieurs de ces composants peut jouer plus agréable quand accroché avec plus fiables natif/bien-solutions éprouvées pour osx
- Une autre solution possible serait de coller avec NFS et déplacer la sortie de Jekyll en dehors de NFS. J'ai couru quelques tests sur ma machine comme POC: gist.github.com/m1keil/cf2c489a51e5bdf6ee7c
- Idée intéressante. Donc NFS performance est principalement limitée par écrit? Ce serait plus logique. Le problème, cependant, est que la seule raison pour utiliser NFS sur rsync est si vous avez la synchronisation bidirectionnelle, mais si vous êtes de mettre la sortie de l'exécution de code sur la machine virtuelle dans un non-SNR dossier, alors vous perdez cet avantage.
- C'est vrai, mais parfois vous n'avez pas besoin de haute performance bi-directionnel sync (comme dans votre cas). J'ai laissé plus de commentaires détaillés dans votre blog.
- Je suis l'aide de coreos-vagrant optimisé avec le partage nfs options. Ma configuration: jverdeyen.être/docker/comment-php-symfony-coreos-docker . Je suis également en utilisant dnsdock pour résoudre les noms de domaines. Pour les performances, j'ai aussi créer des données de conteneur avec un tmpfs (ram disk) mont partagée à travers des conteneurs.
- Tant que github.com/docker/for-mac/issues/77 c'est une question ouverte il n'y a pas beaucoup d'espoir pour une solution de contournement-moins de solution.
Vous devez vous connecter pour publier un commentaire.
J'ai décidé d'ajouter ma propre réponse à la meilleure solution que j'ai trouvé jusqu'à présent. Je vais mettre à jour si je l'ai trouver de meilleures options.
Meilleure solution jusqu'à présent
La meilleure solution que j'ai trouvé pour la mise en place d'un développement productif de l'environnement avec Docker sur OS X est: Boot2Docker + Rsync. Avec rsync, les temps de construire dans un conteneur Docker sont sur pied d'égalité avec l'exécution de la construire directement sur OSX! De plus, le fichier de l'observateur de code ne pas besoin d'interrogation (
inotify
travaille depuis rsync utilise des dossiers), si chaud, rechargement est presque aussi vite.Il y a deux façons de configurer: une installation automatisée et une installation manuelle.
Installation automatisée
J'ai emballé toutes les étapes de la mise en place Boot2Docker avec Rsync dans un projet open source appelé docker-osx-dev. Le code est un peu rude, mais j'ai réussi à l'utiliser pendant plusieurs semaines afin de basculer facilement entre 3 projets avec 3 différents tech des piles. L'essayer, rapport de bugs, et de soumettre certains pr! Aussi, voir mon blog, Un développement de la production de l'environnement avec Docker sur OS X pour plus d'info.
Manuel d'installation
brew install boot2docker
.boot2docker init && boot2docker start --vbox-share=disable
.boot2docker shellinit
et de copier les variables d'environnement il imprime dans votre~/.bash_profile
fichier.boot2docker ssh "tce-load -wi rsync"
./foo/bar
dossier à partir d'OS X, vous devez créer/foo/bar
sur le Boot2Docker VM:boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar"
.rsync --archive --rsh="ssh -i $HOME/.ssh/id_boot2docker -o StrictHostKeyChecking=no" /foo/bar docker@dockerhost:/foo
. De vérifier la rsync docs pour les divers paramètres, vous souhaiterez peut-être activer, comme l'utilisation de--exclude .git
à exclure la.git
dossier lors de la synchronisation.brew install fswatch
) transmis dans rsync.docker run
à feu vers le haut de votre conteneur Docker et d'utiliser le-v
drapeau pour monter le dossier que vous synchronisez:docker run -v /foo/bar:/src some-docker-image
.inotify
), et la construction devrait courir vite parce que tous les fichiers sont en "local" sur le récipient.boot2docker ip
de commande pour trouver les IP, c'est sur.VOLUME
, puis vous pourriez donner à un autre conteneur accès à ce volume à l'aide de la--volumes-from
drapeau. Je n'ai pas essayé encore, mais je pense que cela fonctionnerait.rsync
de pousser local de fichier et de répertoire des changements du volume des données (soit classique des volumes de données ou de données volume de conteneurs). Cela fonctionne bien pour Docker boîte à outils des scénarios sur un Mac, et devrait également fonctionner pour les gens de Windows via Bash pour Windows. Voir les exemples dans le github.com/JeNeSuisPasDave/asd-sync-src-to-container et une discussion de la question develves.net/blogs/asd/2016-11-26-still-using-docker-toolbox. J'ai été en utilisant ce mécanisme sur une variété de projets à grand succès. Plus récemment testé avec Docker 1.12.3.Mise à jour: Maintenant que docker pour mac est en version bêta avec des non-hack fonctionnalités, allant de l'itinéraire peut être beaucoup plus raisonnable pour le développement local, sans un essai vaut la peine de les hacks et les solutions de contournement.
Ne pas. Je sais que ce n'est pas la réponse que vous êtes probablement dans l'espoir d', mais prendre une honnête évaluation de la rentabilité d'essayer d'obtenir du local code source + dockerized exécution vs juste faire du développement local sur OSX.
À un certain point, toutes les questions, le programme d'installation de l'effort et de l'exploitation des points de douleur PEUT être résolu assez bien, mais à partir de maintenant mon point de vue sur ce que c'est une perte nette.
Attendre un peu et ce sera presque certainement améliorer.
Je ne suis pas sûr qu'un correctif pour ce qui est dans le proche avenir. Si ce type de fonctionnalité est la clé de votre développement de flux de travail, je ne considère pas cela un dealbreaker. Ça ne vaut pas un grand R&D, comparativement à seulement à l'aide de rbenv/bundler pour gérer votre jekyll/ruby installe et exécute localement sur OSX comme les gens l'ont fait avec succès pour les dix dernières années+.
Tout comme le "cloud" a zéro implication dans mon local de développement de l'installation, pour le moment, docker est une victoire pour les essais/mise en scène/déploiement et de l'exécution des bases de données et d'autres composants tiers, mais les applications en réalité, je suis le codage se faire directement sur OSX.
Docker pour Mac et Windows doit être la dernière voie de développement avec Docker sur mac OS X (et Windows). Un Docker produit, le logiciel est un “intégré, facile à déployer de l'environnement pour la construction, l'assemblage et l'expédition des applications à partir de Mac ou de Windows.” Il prétend être capable de résoudre les problèmes présentés par les OP. De son Le 24 mars 2016 annonce:
Avertissement: je suis peut être partiale, car je suis l'auteur de docker-sync.
J'ai probablement essayé toutes les solutions citées ici, dont certains de plus en plus (voir la compersion https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync), mais en gros, ils ne l'ont pas sur le côté de la performance (la plupart d'entre eux) ou sur le menu fixe-machine (ou aucun) utilisé /appliquée.
http://docker-sync.io a été construit pour fusionner toutes les solutions et de fournir les meilleures stratégies de mise en œuvre de plusieurs, vous pouvez choisir).
Il peut être utilisé avec rsync (1 façon de synchronisation), y compris la permission des correctifs pour les utilisateurs, et à l'unisson (2 chemin de la synchronisation). Il n'a ni la force de vous docker-machine ou d'un hyperviseur, ni vous oblige à avoir de docker pour Mac. Il fonctionne avec tous les d'entre eux.
La performance EugenMayer/docker-sync/wiki/4.-La Performance n'est pas influencé, c'est comme vous n'avez pas d'actions à tous.
le panneau de synchronisation et de son évolution-les observateurs sont optimisés et les faire travailler avec des projets avec 12k de fichiers sans problèmes.
Essayer, si vous le souhaitez, j'aimerais entendre vos commentaires!
Je sens que vous! Je pense que j'ai essayé à peu près tout ce que vous avez essayé et malheureusement, il est encore lent. Puis je suis tombé sur ce commentaire https://github.com/boot2docker/boot2docker/issues/64#issuecomment-70689254 que suggère l'utilisation de Vagrant et Parallèles, et au lieu de Virtualbox. Cela m'a permis d'utiliser nfs et en effet j'ai vu un gros boost de performance pour mon projet (Drupal).
Voici le Vagabond de fichier. Tout ce que vous devez faire est d'installer l'errance, copiez-le dans un fichier appelé Vagrantfile et le mettre dans un dossier. Allez dans ce répertoire, et il suffit de faire une
vagrant up
au lieu de normal de votre boot2docker jusqu'.Je suis également utiliser Vagrant avec parallels et boot2docker (https://github.com/Parallels/boot2docker-vagrant-box). Le développement n'a jamais été plus facile pour moi. Fonctionne très bien avec
docker-compose
et des installations à grande échelle. Je n'ai pas vraiment l'impression d'un retard ou massive de la consommation de ressources.C'est ce que mon
Vagrantfile
ressemble:J'ai développé dans un OS X (mi-2011, le Macbook Air) + Boot2Docker + Docker-composition de l'environnement depuis quelques semaines maintenant. N'avez pas exécuté dans les grands problèmes de performances, mais je éviter d'exécuter toute sorte de construire lors de l'élaboration (pourquoi ne pas utiliser quelque chose comme
jekyll serve --skip-initial-build
?). Voici un exempledocker-compose.yml
fichier que j'utilise:docker-composer.yml:
Dockerfile:
J'ai parfois l'utilisation de NFS (http://syskall.com/using-boot2docker-using-nfs-instead-of-vboxsf/) mais je n'ai pas remarqué une grosse différence de performances pour le faire.
Pour moi, la commodité d'un simple
docker-compose up test
pour obtenir mon environnement en cours d'exécution a été vaut le coût en performance (j'ai régulièrement travailler sur de multiples projets avec différentes piles).PS:
nodemon
est l'un des rares fichier observateurs qui travaillent avec vboxsf (voir https://github.com/remy/nodemon/issues/419).Docker l'Unisson fonctionne comme un charme!
https://github.com/leighmcculloch/docker-unison
Synchronisation bidirectionnelle avec une très bonne performance!
Se docker à travailler comme un outil de développement est possible. Mais sa va faire mal. J'ai documenté le processus ici :
http://harmingcola.blogspot.com/2015/05/how-to-setup-docker-as-development-tool.html
Cette méthode est la plus récente (Septembre 2015) et de la façon la plus simple pour obtenir le Panneau de configuration sur Mac:
lien ici:
Vous installez le Panneau à l'aide de Docker boîte à outils lien vers les instructions ici:
C'est un Docker package d'installation,
qui comprend les éléments suivants Panneau outils:
Menu fixe de la Machine pour l'exécution de l'docker-machine binaire
Docker Moteur pour l'exécution de l'docker binaire
Docker Composer pour l'exécution de l'docker-composition binaire
Kitematic, le Docker GUI
une coquille préconfiguré pour un Docker environnement de ligne de commande
Oracle VM VirtualBox
Ce qui est dans la boîte à outils: