web-applications vagrant docker puppet lamp

web applications - ¿Cómo desarrollar una aplicación web LAMP con Docker, Puppet y Vagrant?



web-applications (2)

¿Debería haber contenedores Docker separados para el servidor web (como Apache), el servidor de base de datos (como MySQL) y cada parte de la aplicación web?

No hay una respuesta correcta a esa pregunta. Si va a utilizar Docker en producción, intente ejecutar sus contenedores Docker en su entorno de desarrollo, ya que estarán en producción. De lo contrario, use los contenedores acoplables de la manera más fácil que pueda.

El Docker Hub proporciona contenedores listos para usar para php, bases de datos, etc. y es fácil de usar. Por otro lado, debe vincularlos para permitirles interactuar. Para un entorno de desarrollo y si usa varios contenedores, le aconsejaría usar docker-compose .

Otra ruta es construir una imagen acoplable que sea la más cercana a su máquina de producción (suponiendo que solo tenga una máquina) que ejecute la base de datos, el servidor web y php. Un contenedor de dicha imagen tendría que ejecutar múltiples procesos. Esto se puede lograr de diferentes maneras. Eche un vistazo a supervisor o imagen de phusion/baseimage .

Cuando hablo de partes de la aplicación web, me refiero a cosas como mysite.com, controlpanel.mysite.com, etc.

Podrías tenerlos separados. Si esas aplicaciones necesitan compartir sesiones, asegúrese de que las sesiones estén almacenadas en la base de datos o en un volumen acoplado que sea accesible para todos.

Los contenedores Docker parecen estar diseñados para ser reemplazables en lugar de tener que actualizar el software dentro de ellos. ¿Qué pasa con los datos que escriben que no quiero perder?

Docker tiene una cosa llamada volumen para permitir que los datos se escriban en un sistema de archivos fuera del contenedor. Existen diferentes formas de trabajar con volúmenes: puede montar un directorio desde el host de la ventana acoplable a un volumen de contenedor, o puede tener contenedores de volumen de datos o volúmenes con nombre .

Los volúmenes de Docker son un concepto importante y vale la pena tomarse el tiempo para dominarlos.

Si desea acceder fácilmente a los datos utilizados por sus contenedores desde su host docker, el camino a seguir es montar un directorio en el host docker. Aunque puede ser complicado con respecto a los permisos y la propiedad de los archivos

Con respecto a las copias de seguridad, eche un vistazo a la guía del usuario de la ventana acoplable donde se detalla todo lo que necesita saber con respecto a los volúmenes.

¿Es una buena idea usar Puppet para crear y administrar los contenedores Docker, tanto para el servidor de desarrollo como para el servidor de producción?

La mejor práctica es operar en su entorno de desarrollo de la misma manera que lo hará en su entorno de producción. No tiene sentido configurar la marioneta correctamente para su entorno de desarrollo si todo ese trabajo no se utilizará para el entorno de producción. Tener un Vagrantfile que aprovisione una VM con docker es realmente fácil con solo el aprovisionamiento de shell ; En mi humilde opinión, títeres / chef / ... son excesivos.

Estás haciendo las preguntas correctas, pero no hay una respuesta que se ajuste a todas las situaciones. En mi opinión, hay dos formas de hacer las cosas:

  • hacer que su entorno de desarrollo se reproduzca exactamente en su entorno de producción
  • haga que su entorno de desarrollo sea diferente de la producción manteniéndolo tan simple y directo como sea posible para que los desarrolladores no sientan la fricción inducida por el uso de nuevas herramientas

En la edad oscura, mi configuración habitual para el desarrollo de aplicaciones web LAMP era probar localmente en mi máquina. PHP (en mi caso), la base de datos y el servidor web se instalaron de forma nativa.

El servidor se configuró con instalaciones estándar de Apache y MySQL, y tenía varios hosts virtuales para diferentes partes de la aplicación web. Cuando estaba contento con los resultados que tenía en mi máquina local, iniciaba sesión en el servidor y git pull el entorno de preparación. Suponiendo que todo funcionara tan bien en el servidor como en mi máquina, haría lo mismo para la producción.

Nuevos comienzos…

Así que ahora estoy comenzando una nueva aplicación web desde cero, y quiero hacerlo "de la manera correcta". He leído sobre Docker, Vagrant y Puppet (y Chef, aunque personalmente prefiero el sistema de dependencias de Puppet en lugar del proceso iterativo de Chef). A pesar de toda la investigación que he hecho, todavía parece haber varias preguntas para las que no puedo encontrar respuestas:

¿Debería haber contenedores Docker separados para el servidor web (como Apache), el servidor de base de datos (como MySQL) y cada parte de la aplicación web?

Cuando hablo de partes de la aplicación web, me refiero a cosas como mysite.com , controlpanel.mysite.com , etc. Estas "partes" compartirán la misma base de datos.

Dado que Docker parece proporcionar contenedores preparados para cosas como los servidores web y de base de datos, parece que esas cosas al menos deberían estar en contenedores separados. ¿Las diferentes partes de mi aplicación web también deberían estar en contenedores separados?

Los contenedores Docker parecen estar diseñados para ser reemplazables en lugar de tener que actualizar el software dentro de ellos. ¿Qué pasa con los datos que escriben que no quiero perder?

El servidor de la base de datos administrará los archivos relacionados con el contenido de mi base de datos (que querré hacer una copia de seguridad). El servidor web creará registros y mis aplicaciones web administrarán varios archivos y cachés, etc. Todos estos archivos deben escribirse fuera de los contenedores de la aplicación (porque podría reemplazarlos al actualizarlos), entonces, ¿a dónde van? ? ¿Directo al sistema de archivos de las máquinas host? ¿O en un "Docker Volume" separado? Si van a los volúmenes de Docker, ¿debo usar un volumen separado para la base de datos, el servidor web, la aplicación, etc.? ¿Puedo acceder fácilmente a los contenidos usando SFTP desde mi máquina local como lo hago ahora? ¡No quiero perder ninguna comodidad aquí!

¿Es una buena idea usar Puppet para crear y administrar los contenedores Docker, tanto para el servidor de desarrollo como para el servidor de producción?

Parece que Puppet tiene soporte para administrar contenedores Docker directamente, por lo que parece una forma razonablemente buena de configurar fácilmente un servidor o el entorno de producción (usando Vagrant) desde cero.

Espero haber hecho algunas preguntas relevantes; sería genial obtener algunas "mejores prácticas" adecuadas para el desarrollo y la producción de aplicaciones web tipo LAMP, ¡es que no parece haber mucho que haya encontrado!


Si bien la respuesta de @Thomasleveil ya es muy buena y cubre todas las partes importantes, me gustaría agregar algunos puntos adicionales.

Vagabundo, Títere / Chef y Docker-componer

Cuando aprovisiona una máquina virtual con Vagrant, generalmente usa Puppet o Chef para instalar los paquetes necesarios para su servidor ... junto con algunos scripts de shell. PuPHPet es una excelente fuente para configurar una pila LAMP basada en una máquina virtual y aprender cómo Puppet y Vagrant trabajan juntos en una configuración un poco más compleja. Una alternativa es Protobox por cierto.

Cuando usa contenedores Docker con Vagrant de la misma manera que lo hace con máquinas virtuales. Luego, con vagrant up , esencialmente está ejecutando contenedores docker con el proveedor Docker. Vagrant construirá los contenedores para usted desde un Dockerfile o usará una imagen existente, más o menos como docker-compose ( fig ) y los ejecutará.

Una razón importante para elegir Vagrant para su configuración de Docker es si usted o su equipo están trabajando parcialmente en un entorno Windows, ya que Vagrant le permite mantener su configuración constante, sin importar cuál sea su sistema host (consulte Host VM ).

Si está en OS X puede usar docker-compose con una Virtual Box VM, si está en Linux puede usar Docker de forma nativa. También siempre es posible iniciar sesión en boot2docker (u otra Docker Host VM) a través de ssh , sin importar si está en Windows u OS X.

Nota: No debe usar SSH en sus contenedores, pero ese es otro tema.

A partir de febrero de 2015

docker-compose parece un poco más ágil y también maneja el inicio, la detención y la reconstrucción de contenedores de manera más eficiente.

Vagrant tiene la ventaja de especificar una máquina virtual host diferente, por ejemplo. por proyecto, si prefiere tal configuración.

Nota: también hay un aprovisionador de Docker que está más relacionado con un proceso de compilación de Puppet.

¿Debería haber contenedores Docker separados para el servidor web (como Apache), el servidor de base de datos (como MySQL) y cada parte de la aplicación web?

Al usar contenedores Docker, básicamente está ejecutando procesos únicos y aislados. Se debe evitar el uso de un supervisor y tampoco es necesario para una pila LAMP.

Entonces mi respuesta es definitivamente: ¡Sí, debería haber contenedores separados!

Cuando hablo de partes de la aplicación web, me refiero a cosas como mysite.com, controlpanel.mysite.com, etc.

Esto depende de sus necesidades, le sugiero que lea la documentación de la aplicación de 12 factores , que describe las cosas importantes que debe tener en cuenta de manera muy detallada.

Los contenedores Docker parecen estar diseñados para ser reemplazables en lugar de tener que actualizar el software dentro de ellos. ¿Qué pasa con los datos que escriben que no quiero perder?

Además de la respuesta de @ Thomasleveil, le recomendaría también un back-end de almacenamiento separado para cargas de usuarios como Amazon S3, SFTP o WebDAV.

En mi opinión, el contenedor de su aplicación web debe tratarse como una aplicación cliente que accede a su base de datos y backends de almacenamiento (servicios) y no debe confiar en los datos de los volúmenes cuando se ejecuta en un entorno de producción.

¿Es una buena idea usar Puppet para crear y administrar los contenedores Docker, tanto para el servidor de desarrollo como para el servidor de producción?

No conozco las capacidades de orquestación de Puppet, pero para construir contenedores, si está utilizando Vagrant, no veo la necesidad de Puppet, debido al aprovisionador nativo de Docker de Vagrant.

Prima

Para todas las cosas descritas anteriormente, puede echar un vistazo a mi plantilla de aplicación PHP de 12 factores basada en el Marco Yii 2.0 con una pila LAMP dockerizada. Con Docker, también puede conectar fácilmente proxies inversos o contenedores de prueba de selenio en su proyecto, ya que existen como imágenes preconstruidas y se pueden descargar y configurar en unos minutos y comenzar en segundos.