¿Cuál es la forma correcta de configurar un entorno de desarrollo en OS X con Docker?

94

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:

  1. Puedo modificar el código en OS X usando las herramientas (editor de texto, IDE, git, etc.) que ya tengo instaladas.
  2. 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:

  1. Me cambié Boot2Docker utilizar NFS , pero era tan lento.
  2. Probé Vagrant + NFS , y eso también fue igual de lento.
  3. Probé un montaje Samba , pero la carpeta siempre aparecía vacía en el contenedor de Docker.
  4. Intenté usar el sistema de archivos Unison , que funcionó brevemente para sincronizar archivos, pero luego seguía mostrando errores de conexión .
  5. Activé el sondeo en Jekyll , pero eso aumentó significativamente el retraso hasta que se recogieron mis cambios.
  6. 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 .

Yevgeniy Brikman
fuente
¿Ha probado el instalador oficial de Docker para OS X junto con NFS? AFAIK, este no es un problema limitado a Docker en OS X, sino también al desarrollo basado en Vagrant en OS X con bases de código más grandes ( tenemos un problema similar pero con Vagrant ). Descubrí que NFS es la única solución viable y aceptable.
James Mills
@JamesMills: Seguí las instrucciones oficiales para instalar Docker y Boot2Docker. ¿Existen instrucciones oficiales para configurar NFS? Solo los encontré en una esencia de GitHub, y después de usarlos, no parecía más rápido. ¿Cómo configuró NFS?
Yevgeniy Brikman
6
La forma correcta de trabajar con Docker es ejecutar Linux de forma nativa en lugar de OS X, o hacer todo su trabajo de desarrollo dentro de una máquina virtual Linux. La integración "boot2docker" es un gran truco feo que no hace más que sembrar confusión y decepción.
Larsks
7
@larsks: Eso no es útil.
Yevgeniy Brikman

Respuestas:

46

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 ( inotifyfunciona 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

  1. Instalar Boot2Docker : brew install boot2docker.
  2. Ejecutar Boot2Docker, pero con VirtualBox carpetas compartidas de personas con discapacidad: boot2docker init && boot2docker start --vbox-share=disable.
  3. Ejecute boot2docker shellinity copie las variables de entorno que imprime en su ~/.bash_profilearchivo.
  4. Instalar rsync en el Boot2Docker VM: boot2docker ssh "tce-load -wi rsync".
  5. Cree las carpetas base que necesita en la máquina virtual Boot2Docker y establezca los permisos correctamente para ellas. Por ejemplo, si va a estar sincronizando la /foo/barcarpeta de OS X, es necesario crear /foo/baren la Boot2Docker VM: boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar".
  6. Ejecutar rsync para sincronizar los archivos a la Boot2Docker VM: 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 .gitpara excluir la .gitcarpeta al sincronizar.
  7. Utilice un observador de archivos para mantenerlos sincronizados. Por ejemplo, podría usar fswatch ( brew install fswatch) canalizado a rsync.
  8. En este punto, usted debería ser capaz de utilizar docker runpara iniciar su envase acoplable y el uso de la -vbandera para montar la carpeta sincronizas: docker run -v /foo/bar:/src some-docker-image.
  9. Actualice el código en OS X como de costumbre. Los cambios deberían propagarse muy rápidamente usando rsync, el código normal del observador de archivos debería recoger los cambios como de costumbre (es decir, usando inotify), y la compilación debería ejecutarse rápidamente porque todos los archivos son "locales" en el contenedor.
  10. Si necesita probar un sitio web en ejecución, ejecute el boot2docker ipcomando para averiguar en qué IP se encuentra.
Yevgeniy Brikman
fuente
¡Gracias por compartir! Cuando dicen que rsync es "unidireccional", ¿significa que no puedo usar el sistema de archivos OS X para compartir archivos entre dos contenedores? Ejemplo: el contenedor 1 observa los archivos fuente y compila un binario, el contenedor 2 se usa para ejecutar el binario compilado (usando Haskell en este ejemplo).
Nicolas Hery
1
@NicolasHery: Tengo entendido que rsync copiará los cambios de OS X al contenedor de Docker, pero no al revés. Por lo tanto, cualquier archivo generado por el contenedor de Docker (por ejemplo, un binario compilado) no será visible en OS X. Sin embargo, si esos archivos se generan en una carpeta marcada como a VOLUME, entonces podría otorgar acceso a otro contenedor a ese volumen usando el --volumes-frombandera. No lo he probado todavía, pero sospecho que funcionaría.
Yevgeniy Brikman
1
Gran respuesta. Puede crear un controlador para docker-machine ( github.com/docker/machine ) que haga la mayor parte del texto estándar por usted.
dom
1
@dom: Me gusta esa idea, pero ¿sabes cómo crear un controlador para docker-machine? ¿Es una solicitud de extracción en el repositorio la única forma o es posible crear un controlador externamente?
Yevgeniy Brikman
1
¿Este tutorial sigue siendo válido para una nueva versión 1.9.1 en Windows? ¿Puedo usarlo o quizás Docker ya tenía una nueva solución para este "problema"?
18

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.

Problema n. ° 1: los volúmenes montados en Virtual Box (que usan vboxfs) son extremadamente lentos

Espere un momento y es casi seguro que esto mejorará.

Problema n. ° 2: la visualización de archivos no funciona

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.

Peter Lyons
fuente
1
Secundo que. Desarrollamos en OSX y ejecutamos las aplicaciones directamente dentro del sistema (con recarga en vivo, etc.). Luego, una vez que la aplicación está completa, la acoplamos para pruebas, puesta en escena y producción.
ItalyPaleAle
4
Hm, eso es un poco decepcionante. Siempre he tenido paridad en mis entornos de ensayo / producción. Es el desarrollo lo que siempre fue el valor atípico, ya que codifico en OS X. La documentación de Docker ciertamente hizo que pareciera que este era un problema resuelto. Voy a darle otro día de esfuerzo y veré si puedo hacer que algo funcione.
Yevgeniy Brikman
¿Aún sientes que esta respuesta es válida hoy, Peter? Solo unos meses después, pero dado el proyecto de @ Yevgeniy y solo 2 problemas que ahora están solucionados, ¡tal vez el costo / beneficio ya valga la pena! ¿No es así?
Cregox
1
Es una cuestión de preferencia personal. Todavía no metería con esto debido a la gran cantidad de proyectos entre los que salto como consultor. Si trabajara a tiempo completo principalmente en el mismo proyecto durante semanas / meses, podría valer la pena configurar las cosas de rsync / fswatch.
Peter Lyons
Docker Toolbox es la forma correcta de hacerlo hoy en día porque si usa homebrew u otro administrador de paquetes, las versiones de la herramienta de la ventana acoplable no estarán sincronizadas, a menos que sigan el control de versiones como la caja de herramientas de la ventana acoplable.
taco
12

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 :

  • Más rápido y más confiable: ¡no más VirtualBox! El motor Docker se ejecuta en una distribución de Alpine Linux sobre una máquina virtual xhyve en Mac OS X o en una máquina virtual Hyper-V en Windows, y esa máquina virtual es administrada por la aplicación Docker. No necesita docker-machine para ejecutar Docker para Mac y Windows.
  • Integración de herramientas: Docker para Mac es una aplicación de Mac y Docker para Windows es una aplicación de Windows, que incluye una interfaz de usuario nativa y capacidad de actualización automática. El conjunto de herramientas de Docker viene incluido: línea de comando de Docker, Docker Compose y línea de comando de Docker Notary.
  • Montaje de volumen para su código y datos: el acceso a datos de volumen funciona correctamente, incluidas las notificaciones de cambio de archivo (en Mac, inotify ahora funciona sin problemas dentro de contenedores para directorios montados por volumen). Esto permite ciclos de edición / prueba para el desarrollo "en contenedor".
  • Fácil acceso a los contenedores en ejecución en la red de host local: Docker para Mac y Windows incluye un servidor DNS para contenedores y está integrado con el sistema de red Mac OS X y Windows. En una Mac, Docker se puede usar incluso cuando está conectado a una VPN corporativa muy restrictiva.
  • Docker para Mac se diseñó desde cero para poder adaptarse al modelo de seguridad de la zona de pruebas de OS X y estamos trabajando estrechamente con Apple para lograrlo.
Quinn acusado
fuente
Acabo de ver esto el otro día, y parece la solución más prometedora con diferencia. Estoy muy emocionado de intentarlo una vez que salga de la versión beta, y si funciona bien, lo cambiaré para que sea la respuesta aceptada oficialmente.
Yevgeniy Brikman
4
Desafortunadamente, la versión Beta actual (1.11.0-beta7) parece ser tan lenta como otros métodos, por lo que puede llevar un tiempo hasta que sea factible usar forums.docker.com/t/…
walterra
3

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!

Eugen Mayer
fuente
2

¡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 uplugar de su 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
Alex Dicianu
fuente
¿Supongo que esto requiere una instalación paralela?
Yevgeniy Brikman
2

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-composeconfiguraciones grandes. Realmente no siento un retraso o un consumo masivo de recursos.

Así es Vagrantfilecomo se ve mi :

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

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 un docker-compose.ymlarchivo de ejemplo que estoy usando:

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

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: nodemones uno de los pocos observadores de archivos que funcionan con vboxsf (consulte https://github.com/remy/nodemon/issues/419 ).

Olivier Lalonde
fuente
Incluso si me salto la compilación inicial con Jekyll, cada vez que cambio un archivo, tendrá que reconstruirse, lo que aún toma del orden de 1-3 minutos si el código fuente está montado. Esto hace que sea imposible realizar ningún tipo de desarrollo de estilo de cambio y recarga.
Yevgeniy Brikman
@YevgeniyBrikman Oh, no era consciente de eso :( Supongo que la última opción sería tener su código en vivo dentro de la máquina virtual boot2docker y montarlo en su máquina host usando sshfs. De lo contrario, supongo que tendrá que esperar mejor rendimiento de la carpeta montada para utilizar la ventana acoplable como entorno de desarrollo.
Olivier Lalonde
-1

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

Harmingcola
fuente
Gracias por publicar, pero ¿cómo resuelve esto los problemas de rendimiento con los volúmenes montados?
Yevgeniy Brikman
Ah, lo siento, ya no tienes que usar vBox para montar nada. Puede montar carpetas a través de la interfaz docker normal
harmingcola
-4

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

ingrese la descripción de la imagen aquí

¿Qué hay en la caja de herramientas?

  • Cliente Docker
  • Máquina Docker
  • Docker Compose (solo Mac)
  • Docker Kitematic
  • VirtualBox
rootcript
fuente
3
Sí, pero lamentablemente no resolvió el problema presentado originalmente.
Nick