Intro
No puedo encontrar una buena manera de configurar un entorno de desarrollo en OS X usando Docker y Boot2Docker. El problema al que me enfrento es cómo administrar el código fuente para que:
- Puedo modificar el código en OS X usando las herramientas (editor de texto, IDE, git, etc.) que ya tengo instaladas.
- Esas modificaciones se reflejan en el contenedor de Docker, por lo que si vuelvo a ejecutar las pruebas o actualizo una página web, puedo ver mis cambios de inmediato.
En teoría, esto debería ser fácil de hacer montando mi código fuente como un volumen:
docker run -it -v /path/to/my/source/code:/src some-docker-image
Desafortunadamente, esto tiene dos problemas importantes que lo hacen completamente inutilizable en OS X:
Problema n. ° 1: los volúmenes montados en VirtualBox (que usan vboxsf) son extremadamente lentos
Por ejemplo, este es el tiempo que tarda Jekyll en compilar mi página de inicio si el código fuente es parte de la imagen de 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
Aquí está exactamente la misma imagen de Docker, excepto que esta vez, monto el código fuente de 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
Problema n. ° 2: la visualización de archivos no funciona
Los mecanismos de vigilancia predeterminados en SBT, Jekyll y grunt utilizan tecnologías como inotify, que no funcionan si se ejecutan en un contenedor Docker y los cambios se realizan en OS X en una carpeta montada.
Soluciones provisionales que probé
Busqué soluciones (incluidas todas las de SO) y probé algunas de ellas, pero no encontré ninguna exitosa:
- Me cambié Boot2Docker utilizar NFS , pero era tan lento.
- Probé Vagrant + NFS , y eso también fue igual de lento.
- Probé un montaje Samba , pero la carpeta siempre aparecía vacía en el contenedor de Docker.
- Intenté usar el sistema de archivos Unison , que funcionó brevemente para sincronizar archivos, pero luego seguía mostrando errores de conexión .
- Activé el sondeo en Jekyll , pero eso aumentó significativamente el retraso hasta que se recogieron mis cambios.
- Probé embarcación auxiliar , un "más rápido, más amable del estibador en OS X con el vagabundo" y tengo alguna mejora. En lugar de que la compilación de Jekyll fuera 10-15 veces más lenta, fue 2-3 veces más lenta. Eso es mejor, pero aún no se puede usar del todo.
¿Alguien ha encontrado una solución que realmente funcione y le permita desarrollar código de manera productiva con Docker y OS X?
Actualización: ¡por fin una solución!
Finalmente encontré una solución que parece productiva usando Boot2Docker + rsync. Capturé los detalles sobre cómo configurar esto en mi propia respuesta , así como en un proyecto de código abierto llamado docker-osx-dev .
fuente
Respuestas:
Decidí agregar mi propia respuesta con la mejor solución que he encontrado hasta ahora. Actualizaré esto si encuentro mejores opciones.
La mejor solución hasta ahora
La mejor solución que he encontrado para configurar un entorno de desarrollo productivo con Docker en OS X es: Boot2Docker + Rsync . Con rsync, los tiempos de compilación en un contenedor Docker están a la par con ejecutar la compilación directamente en OSX. Además, el código del observador de archivos no necesita sondeo (
inotify
funciona ya que rsync usa carpetas normales), por lo que la recarga en caliente es casi tan rápida.Hay dos formas de configurarlo: una instalación automática y una instalación manual.
Instalación automatizada
He empaquetado todos los pasos para configurar Boot2Docker con Rsync en un proyecto de código abierto llamado docker-osx-dev . El código es un poco tosco, pero lo he estado usando con éxito durante varias semanas para cambiar fácilmente entre 3 proyectos con 3 pilas de tecnología diferentes. ¡Pruébelo, informe errores y envíe algunos PR! Además, consulte mi publicación de blog, Un entorno de desarrollo productivo con Docker en OS X para obtener más información.
Configuración manual
brew install boot2docker
.boot2docker init && boot2docker start --vbox-share=disable
.boot2docker shellinit
y copie las variables de entorno que imprime en su~/.bash_profile
archivo.boot2docker ssh "tce-load -wi rsync"
./foo/bar
carpeta de OS X, es necesario crear/foo/bar
en la 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
. Verifique los documentos de rsync para ver las distintas configuraciones que puede desear habilitar, como usar--exclude .git
para excluir la.git
carpeta al sincronizar.brew install fswatch
) canalizado a rsync.docker run
para iniciar su envase acoplable y el uso de la-v
bandera para montar la carpeta sincronizas:docker run -v /foo/bar:/src some-docker-image
.inotify
), y la compilación debería ejecutarse rápidamente porque todos los archivos son "locales" en el contenedor.boot2docker ip
comando para averiguar en qué IP se encuentra.fuente
VOLUME
, entonces podría otorgar acceso a otro contenedor a ese volumen usando el--volumes-from
bandera. No lo he probado todavía, pero sospecho que funcionaría.Actualización : Ahora que Docker para Mac está en versión beta con funcionalidad que no es de pirateo, ir por esa ruta puede ser mucho más razonable para el desarrollo local sin un ensayo de trucos y soluciones.
No lo hagas . Sé que esa no es la respuesta que probablemente esperas, pero haz una evaluación honesta del costo / beneficio de intentar obtener código fuente local + ejecución acoplada en lugar de simplemente hacer desarrollo local en OSX.
En algún momento, todos los problemas, el esfuerzo de configuración y los puntos débiles operativos PUEDEN resolverse lo suficientemente bien, pero a partir de ahora, mi opinión al respecto es una pérdida neta.
Espere un momento y es casi seguro que esto mejorará.
No estoy seguro de que haya una solución para esto en un futuro próximo. Si este tipo de funcionalidad es clave para su flujo de trabajo de desarrollo, lo consideraría un factor decisivo. No vale la pena un gran esfuerzo de I + D en comparación con el simple hecho de usar rbenv / bundler para administrar sus instalaciones de jekyll / ruby y ejecutarlas localmente en OSX, como la gente ha estado haciendo con éxito durante la última década +.
Al igual que "la nube" no tiene ninguna participación en mi configuración de desarrollo local, en este momento, Docker es una ventaja para las pruebas, la preparación y la implementación y para ejecutar bases de datos y otros componentes de terceros, pero las aplicaciones que estoy codificando funcionan correctamente. en OSX.
fuente
Docker para Mac y Windows será la forma definitiva de desarrollar con Docker en OS X (y Windows). Un producto de Docker, el software es un "entorno integrado y fácil de implementar para crear, ensamblar y enviar aplicaciones desde Mac o Windows". Pretende poder resolver los problemas presentados por el OP. Desde su anuncio del 24 de marzo de 2016 :
fuente
Descargo de responsabilidad: podría ser parcial, ya que soy el autor de docker-sync.
Probablemente probé todas las soluciones mencionadas aquí, incluidas algunas más (consulte la compersion https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync ), pero básicamente fallaron en el lado de rendimiento (la mayoría de ellos) o en la máquina acoplable (o ninguno) utilizado / aplicado.
http://docker-sync.io ha sido construido para fusionar todas las soluciones y proporcionar las mejores estrategias (implementando varias, puede elegir).
Se puede utilizar con rsync (sincronización de 1 vía), incluidas las correcciones de permisos para los usuarios, y con unísono (sincronización de 2 vías). No lo obliga a usar una máquina acoplable o un hipervisor específico, ni requiere que tenga una ventana acoplable para Mac. Funciona con todos ellos.
El rendimiento EugenMayer / docker-sync / wiki / 4.-El rendimiento no se ve influenciado, es como si no tuvieras acciones en absoluto.
Docker-sync y sus observadores de cambios están optimizados y funcionan con proyectos con archivos de 12k sin problemas.
Pruébelo, si lo desea, ¡me encantaría escuchar sus comentarios!
fuente
¡Te siento! Creo que probé casi todo lo que probaste y, desafortunadamente, aún fue lento. Luego me encontré con este comentario https://github.com/boot2docker/boot2docker/issues/64#issuecomment-70689254 que sugiere usar Vagrant y Parallels y en lugar de Virtualbox. Esto me permitió usar nfs y de hecho vi un gran aumento en el rendimiento de mi proyecto (Drupal).
Aquí está el archivo Vagrant. Todo lo que necesita hacer es instalar vagrant, copiar esto en un archivo llamado Vagrantfile y ponerlo en alguna carpeta. Vaya a esa carpeta y simplemente haga un en
vagrant up
lugar de su boot2docker normal.fuente
También estoy usando Vagrant con paralelos y boot2docker ( https://github.com/Parallels/boot2docker-vagrant-box ). El desarrollo nunca fue tan fácil para mí. Funciona muy bien con
docker-compose
configuraciones grandes. Realmente no siento un retraso o un consumo masivo de recursos.Así es
Vagrantfile
como se ve mi :fuente
He estado desarrollando en un entorno OS X (Macbook Air de mediados de 2011) + Boot2Docker + Docker-compose durante algunas semanas. No me he encontrado con problemas importantes de rendimiento, pero evito ejecutar ningún tipo de compilación durante el desarrollo (¿por qué no usar algo como
jekyll serve --skip-initial-build
?). Aquí hay undocker-compose.yml
archivo de ejemplo que estoy usando:docker-compose.yml:
Dockerfile:
A veces uso NFS ( http://syskall.com/using-boot2docker-using-nfs-instead-of-vboxsf/ ) pero no he notado una gran diferencia de rendimiento al hacerlo.
Para mí, la conveniencia de un simple
docker-compose up test
hacer que mi entorno funcione ha valido la pena el costo en rendimiento (trabajo rutinariamente en múltiples proyectos con diferentes pilas).PD:
nodemon
es uno de los pocos observadores de archivos que funcionan con vboxsf (consulte https://github.com/remy/nodemon/issues/419 ).fuente
¡Docker Unison funciona de maravilla! https://github.com/leighmcculloch/docker-unison
¡Sincronización bidireccional con muy buen rendimiento!
fuente
Hacer que Docker funcione como herramienta de desarrollo es posible. Pero va a doler. He documentado el proceso aquí:
http://harmingcola.blogspot.com/2015/05/how-to-setup-docker-as-development-tool.html
fuente
Este método es el más reciente (septiembre de 2015) y la forma más fácil de configurar Docker en Mac: enlace aquí:
Instale Docker usando el enlace de Docker Toolbox para obtener instrucciones aquí:
Es un paquete de instalación completo de Docker, que incluye las siguientes herramientas de Docker:
Docker Machine para ejecutar el binario docker-machine
Docker Engine para ejecutar el binario docker
Docker Compose para ejecutar el binario docker-compose
Kitematic, la interfaz gráfica de usuario de Docker, un shell preconfigurado para un entorno de línea de comandos de Docker
Oracle VM VirtualBox
¿Qué hay en la caja de herramientas?
fuente