macos - mac - ¿Cuál es la forma correcta de configurar un entorno de desarrollo en OS X con Docker?
tutorial docker mac (10)
¡Docker Unison funciona a las mil maravillas! https://github.com/leighmcculloch/docker-unison
Sincronización bidireccional con un muy buen rendimiento!
Introducción
No puedo encontrar una buena manera de configurar un entorno de desarrollo en OS X usando Docker y Boot2Docker. El problema que encuentro 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 he instalado.
- Esas modificaciones se reflejan en el contenedor 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 principales que lo hacen completamente inutilizable en OS X:
Problema 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 homepage 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, monte 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 # 2: La observación de archivos está rota
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 que probé
Busqué soluciones (incluidas todas las de SO) y probé algunas, pero no encontré una exitosa:
- Cambié Boot2Docker para usar NFS , pero fue igual de lento.
- Probé Vagrant + NFS , y eso también fue igual de lento.
- Intenté un montaje Samba , pero la carpeta siempre aparecía vacía en el contenedor Docker.
- Traté de usar el sistema de archivos Unison , que funcionó brevemente para sincronizar archivos, pero luego seguí mostrando errores de conexión .
- Permití el sondeo en Jekyll , pero eso aumentó significativamente el retraso hasta que se recogieron mis cambios.
- Dinghy , un "Docker más rápido y amigable en OS X con Vagrant" y obtuve algunas mejoras. En lugar de que la compilación de Jekyll fuera 10-15x más lenta, era 2-3x más lenta. Eso está mejor, pero aún no es muy útil.
¿Alguien ha encontrado una solución que realmente funcione y le permita desarrollar código productivamente con Docker y OS X?
Actualización: ¡una solución por fin!
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 .
¡Te siento! Creo que he intentado casi todo lo que intentaste 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 de rendimiento para mi proyecto (Drupal).
Aquí está el archivo Vagrant.
Todo lo que necesita hacer es instalar vagrant, copiar esto en un archivo llamado Vagrantfile y guardarlo en alguna carpeta.
Vaya a esa carpeta y simplemente haga un
vagrant up
lugar 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
Descargo de responsabilidad: podría estar sesgado, ya que soy el autor de docker-sync.
Probablemente probé todas las soluciones nombradas aquí, incluidas algunas más (vea la competencia https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync ), pero básicamente fallaron al lado de rendimiento (la mayoría de ellos) o en la máquina acoplable (o ninguno) utilizado / forzado.
http://docker-sync.io se ha creado para combinar 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 ingresar a la máquina acoplable ni a un hipervisor específico, ni requiere que tenga un acoplador para Mac. Funciona con todos ellos.
El rendimiento EugenMayer / docker-sync / wiki / 4.-El rendimiento no está influenciado, es como si no tuvieras ningún recurso compartido.
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.
Es posible hacer que Docker funcione como herramienta de desarrollo. Pero va a doler. He documentado el proceso aquí:
http://harmingcola.blogspot.com/2015/05/how-to-setup-docker-as-development-tool.html
Este método es la forma más reciente (septiembre de 2015) y más fácil de obtener la configuración de Docker en Mac: enlace aquí:
Instala Docker usando el enlace de Docker Toolbox a las instrucciones aquí:
Es un paquete completo de configuración 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 GUI 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?
- Docker Client
- Docker Machine
- Docker Compose (solo Mac)
- Docker Kitematic
- VirtualBox
He estado desarrollando en un entorno OS X (mediados de 2011 Macbook Air) + Boot2Docker + Docker-compose desde hace unas semanas.
No me he encontrado con problemas importantes de rendimiento, pero evito ejecutar cualquier tipo de compilación durante el desarrollo (¿por qué no usar algo como
jekyll serve --skip-initial-build
?).
Aquí hay un ejemplo
docker-compose.yml
archivo
docker-compose.yml
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 una simple
docker-compose up test
para hacer que mi entorno se ejecute 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
).
También estoy usando Vagrant con paralelos y boot2docker (
https://github.com/Parallels/boot2docker-vagrant-box
).
El desarrollo nunca fue más fácil para mí.
Funciona realmente bien con
docker-compose
y configuraciones grandes.
Realmente no siento un retraso o un consumo masivo de recursos.
Así es como se ve mi
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
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 la ejecución de 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 automatizada 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 tecnológicas diferentes. ¡Pruébelo, informe de errores y envíe algunas relaciones públicas! Además, vea mi publicación de blog, Un entorno de desarrollo productivo con Docker en OS X para obtener más información.
Configuración manual
-
Instalar
Boot2Docker
:
brew install boot2docker
. -
Ejecute Boot2Docker, pero con las carpetas compartidas de VirtualBox deshabilitadas:
boot2docker init && boot2docker start --vbox-share=disable
. -
Ejecute
boot2docker shellinit
y copie las variables de entorno que imprime en su archivo~/.bash_profile
. -
Instale rsync en la VM Boot2Docker:
boot2docker ssh "tce-load -wi rsync"
. -
Cree las carpetas base que necesita en la VM Boot2Docker y establezca los permisos correctamente para ellas.
Por ejemplo, si va a sincronizar la carpeta
/foo/bar
desde OS X, debe crear/foo/bar
en la VMboot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar"
:boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar"
. -
Ejecute rsync para sincronizar los archivos con la VM Boot2Docker:
rsync --archive --rsh="ssh -i $HOME/.ssh/id_boot2docker -o StrictHostKeyChecking=no" /foo/bar docker@dockerhost:/foo
. Consulte los documentos de rsync para ver las diversas configuraciones que puede habilitar, como usar--exclude .git
para excluir la carpeta.git
al sincronizar. -
Use un observador de archivos para mantener los archivos sincronizados.
Por ejemplo, podría usar
fswatch
(
brew install fswatch
) conectado a rsync. -
En este punto, debería poder usar Docker
docker run
para iniciar su contenedor Docker y usar el indicador-v
para montar la carpeta que está sincronizando:docker run -v /foo/bar:/src some-docker-image
. -
Actualice el código en OS X como de costumbre.
Los cambios deben propagarse muy rápidamente usando rsync, el código normal del observador de archivos debe recoger los cambios como de costumbre (es decir, usar
inotify
) y la compilación debe ejecutarse rápidamente porque todos los archivos son "locales" para el contenedor. -
Si necesita probar un sitio web en ejecución, ejecute el comando
boot2docker ip
para averiguar en qué IP está.
Actualización : ahora que Docker para Mac está en versión beta con funcionalidad no pirateada, seguir esa ruta puede ser mucho más razonable para el desarrollo local sin el valor de un ensayo de hacks y soluciones alternativas.
No lo hagas Sé que esa no es la respuesta que probablemente esté esperando, pero realice una evaluación honesta del costo / beneficio de tratar de obtener el código fuente local + la ejecución dockerizada en lugar de simplemente hacer un 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 sobre esto es una pérdida neta.
Problema 1: los volúmenes montados en Virtual Box (que usan vboxfs) son extremadamente lentos
Espere un momento y esto seguramente mejorará.
Problema # 2: La observación de archivos está rota
No estoy seguro de que haya una solución para esto en el futuro cercano. Si este tipo de funcionalidad es clave para su flujo de trabajo de desarrollo, lo consideraría un factor decisivo. No vale la pena realizar un gran esfuerzo de I + D en comparación con el simple uso de rbenv / bundler para administrar sus instalaciones 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, por el momento, Docker es una victoria para probar / organizar / implementar y para ejecutar bases de datos y otros componentes de terceros, pero las aplicaciones que realmente estoy codificando se ejecutan directamente en OSX.
Docker para Mac y Windows será la forma definitiva de desarrollar con Docker en OS X (y Windows). Un producto Docker, el software es un "entorno integrado y fácil de implementar para crear, ensamblar y enviar aplicaciones desde Mac o Windows". Supone 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 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 la máquina docker 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 Docker viene incluido: línea de comando Docker, Docker Compose y línea de comando Notario Docker.
- Montaje de volumen para su código y datos: el acceso a datos de volumen funciona correctamente, incluidas las notificaciones de cambio de archivos (en Mac inotify ahora funciona perfectamente dentro de contenedores para directorios montados en 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 host local: Docker para Mac y Windows incluye un servidor DNS para contenedores, y están integrados 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 del entorno limitado de OS X y estamos trabajando en estrecha colaboración con Apple para lograrlo.