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


En la edad media, 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 fueron instalados de forma nativa.

El servidor se configuró con instalaciones estándar de Apache y MySQL, y tuve varios hosts virtuales para diferentes partes de la aplicación web. Cuando estaba satisfecho con los resultados que tenía en mi máquina local, iniciaba sesión en el servidor y git pull en el entorno de ensayo. Asumiendo que todo era trabajando 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 adecuada". 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 que no puedo encontrar respuestas para:

¿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 listos para cosas como la web y servidores 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 deben 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 base de datos administrará los archivos relacionados con el contenido de mi base de datos (de los que quiero hacer copias 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 actualizar?), entonces, ¿a dónde van? Directamente en el sistema de archivos de las máquinas host? ¿O en un "volumen Docker" separado? Si entran en volúmenes Docker, ¿debo usar un volumen separado para la base de datos, el servidor web, la aplicación, etc.? Todavía puedo acceder fácilmente a los contenidos usando SFTP desde mi máquina local ¿como yo 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 esto 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 para obtener algunas "mejores prácticas" adecuadas para el desarrollo y la producción de aplicaciones web similares a LAMP, ¡es solo que no parece haber mucho que haya encontrado!

Author: Robert, 2014-10-01

2 answers

¿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 usar docker en producción, intente ejecutar los contenedores docker en su entorno de desarrollo, ya que estarán en producción. De lo contrario, solo use los contenedores docker 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 tienes que vincularlos para permitirles interactuar. Para un entorno de desarrollo y si usa varios contenedores, le recomendaría usar docker-compose .

Otra ruta es construir una imagen de docker 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 tal imagen tendría que ejecutar múltiples procesa. Esto se puede lograr de diferentes maneras. Echa un vistazo a supervisor o phusion/baseimage.

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

Podrías separarlos. Si esas aplicaciones necesitan compartir sesiones, asegúrese de que las sesiones se almacenen en la base de datos o en un volumen de docker accesible para todos.

Los contenedores Docker parecen estar diseñados para ser reemplazable 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 volume para permitir que los datos se escriban en un sistema de archivos fuera del contenedor. Hay diferentes formas de trabajar con volúmenes: puede montar un directorio desde el host de la docker a un volumen contenedor, o puede tener contenedores de volumen de datos, o llamados volúmenes.

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

Si desea acceder fácilmente a los datos utilizados por sus contenedores, montar un directorio en el host de docker es el camino a seguir.

Con respecto a las copias de seguridad, eche un vistazo a la guía del usuario de docker 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 la producción servidor?

La mejor práctica es operar en su entorno de desarrollo de la misma manera que operará en su entorno de producción. No tiene sentido configurar puppet correctamente para su entorno de desarrollo si todo ese trabajo no se usará para el entorno de producción. Tener un Vagrantfile que aprovisione una VM con docker es realmente fácil con solo shell provisioning ; IMHO puppet/chef/... son exagerados.


Usted está pidiendo el derecho preguntas pero no hay respuesta que se ajuste a todas las situaciones. En mi opinión hay dos maneras de hacer las cosas:

  • haga que su entorno de desarrollo replique exactamente su entorno de producción
  • haga que su entorno de desarrollo sea diferente de la producción manteniéndolo tan simple y directo como pueda para que los desarrolladores no sientan la fricción inducida por el uso de nuevas herramientas
 44
Author: Thomasleveil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-24 14:06:27

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

Vagrant, Puppet / Chef y docker-compose

Cuando está aprovisionando 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 de Lamp basada en Máquinas virtuales 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 está utilizando contenedores Docker con Vagrant de la misma manera que lo hace con las máquinas virtuales. A continuación, con vagrant up esencialmente estás ejecutando contenedores docker con el proveedor Docker . Vagrant construirá los contenedores para usted desde un Dockerfile o utilizará una imagen existente, más o menos como docker-compose (fig) y ejecutarlos.

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

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

Nota: Usted no debe SSH en sus contenedores, pero ese es otro tema.

A partir de febrero de 2015

docker-compose se siente un poco más ágil para mí y también maneja iniciar, detener y reconstruir 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 marionetas.


Debe haber ¿ser 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 se utilizan contenedores Docker, básicamente se ejecutan procesos individuales y aislados. El uso de un supervisor debe evitarse y tampoco es necesario para una pila de LÁMPARAS.

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


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

Esto depende de sus necesidades, le sugiero que lea la documentación de la aplicación 12factor, que describe las cosas importantes a tener en cuenta de una 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 Respuesta de @ Thomasleveil Te recomendaría también un backend de almacenamiento separado para cargas de usuarios como Amazon S3, SFTP o WebDAV.

En mi opinión, su contenedor de aplicaciones web debe tratarse como una aplicación cliente que accede a su base de datos y backends de almacenamiento (servicios) y no depender de datos de 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 servidor de producción?

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


Bonus

Para todas las cosas descritas anteriormente, puedes echar un vistazo a mi 12factor PHP application template basado en el framework Yii 2.0 con una pila de LAMP acoplada. Con Docker también puede fácilmente plug - in reverse proxies o selenium testing containers en su proyecto, porque existen como imágenes pre-compiladas y se pueden descargar y configurar en pocos minutos y comenzar en segundos.

 13
Author: schmunk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-17 17:10:37