node hub compose web-applications web-deployment lamp docker

web-applications - hub - docker compose node js



Docker: cómo hacer Dockerize e implementar múltiples instancias de una aplicación LAMP (2)

Ambas soluciones son posibles. Sin embargo, me gustaría ir con la solución 2, un contenedor por proceso, ya que es más compatible con la "filosofía" de Docker.

Lo bueno de Docker es que puedes crear una pila de aplicaciones (como la tuya) con bloques de construcción independientes (imágenes de aplicaciones únicas). Puede combinar esos bloques de construcción y reutilizarlos. Si echa un vistazo al registro oficial de Docker , encontrará la mayoría de sus componentes como imágenes previas a la construcción. Por ejemplo, encontrará un Nginx en https://registry.hub.docker.com/u/dockerfile/nginx y una base de datos MySQL en https://registry.hub.docker.com/_/mysql . Por lo tanto, configurar tu stack es bastante fácil si eliges usar un contenedor por proceso / aplicación:

(Nota, esto es solo un ejemplo, no estoy familiarizado con PHP y esas cosas ...)

Obtenga sus imágenes:

docker pull mysql docker pull dockerfile/nginx docker pull tutum/apache-php docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql docker run -d -p 80:80 -v <sites-enabled-dir>:/etc/nginx/sites-enabled -v <log-dir>:/var/log/nginx dockerfile/nginx docker run -d -p 80:80 tutum/apache-php

Puedes configurar tu stack muy fácilmente así. Y, si lo desea, puede cambiar algunos componentes individuales. Por ejemplo, puede cambiar la base de datos MySQL con MariaDB sin tocar otro componente.

Lo más complicado de esa solución es cómo configurar tu stack. Para vincular sus contenedores, consulte https://docs.docker.com/userguide/dockerlinks . Puede utilizar este enfoque para vincular, por ejemplo, su contenedor de aplicaciones con su contenedor MySQL.

Necesito implementar muchas instancias de la misma aplicación LAMP (o LEMP):

  • cada instancia será accesible desde un subdominio, con loadbalancer / proxy frontal
  • cada instancia debe tener sus propios datos de base de datos y archivos.
  • cada instancia puede ser monitoreada
  • límite de memoria / CPU se puede establecer por instancia de aplicación
  • fácil de automatizar la implementación de una nueva instancia de webapp
  • el entorno puede reproducirse fácilmente para prueba y desarrollo.

La aplicación requiere:

  • procesos de dameon ( Nginx , MariaDB , PHPFPM )
  • binarios ( composer , bower , ...)
  • otros sistemas específicos de libs y config

Después de leer la documentación de Docker y muchos howtos, veo diferentes soluciones para dockerize esta aplicación web:

Solución 1: use un contenedor todo en uno

Toda la pila está en un contenedor:

  • archivos fuente webapp, procesos daemon EMP, binarios, ...
  • volúmenes montados para archivos de datos de mysql y webapp

Ejemplos:

Pros (en mi humilde opinión):

  • Parece fácil de automatizar la implementación, monitorear, destruir ...
  • Fácil de usar en prod, test y entorno de desarrollo.

Contras (en mi humilde opinión):

  • Monolítico
  • Difícil de escalar
  • No usa toda la fuerza de Docker

Solución 2: utilice una pila de contenedores por instancia de webapp

Para cada aplicación web que se implementa, se implementa una pila de contenedores:

  • Un contenedor por proceso: Nginx , Mysql , PHP-FPM ,
  • Los contenedores binarios ( composer , bower , ...) también pueden ser dockerizados o fusionados en el contenedor phpfpm
  • montar volúmenes para archivos de datos mysql y webapp

Ejemplos:

Pro (en mi humilde opinión):

  • Desacoplado
  • procesos aislados por instancia
  • Un proceso por contenedor, no necesita administrador de daemon como RUnit o Supervisord

Contras (en mi humilde opinión):

  • Parece más complicado para hacer el trabajo
  • Difícil de mantener, para ver un "panorama general" de todos los estados de contenedores, enlaces, versión ...

Solución 3: mezclando las 2 soluciones anteriores

  • Un contenedor de "aplicación" con: archivos src de la aplicación, nginx, phpfmp, compositor, git ..
  • Un contenedor para db mysql, que se puede compartir o no con el contenedor de la aplicación

Soy más Dev que Ops, también está confundido para mí.

Entonces, preguntas:

  1. ¿Cuáles son los criterios, pros / contras a considerar al elegir entre estas soluciones?
  2. ¿Cómo administrar todas las pilas de contenedores si elijo la Solución 2, para tener una "visión general" de todos los estados, enlaces, versiones ...?
  3. Los archivos src de la aplicación (PHP) pueden construirse en el contenedor o montarse como volumen, por ej. / var / www?

Recientemente revisé el análisis de Docker para este tipo de configuración. Sé que hay algunos que ven a Docker como una especie de MicroVM, pero mi opinión es que la filosofía de Docker se inclina más hacia un solo proceso por contenedor. Esto rastrea bien con el principio de responsabilidad única en la programación. Cuanto más hace un contenedor Docker, menos reutilizable y más difícil de administrar. Publiqué todos mis pensamientos aquí:

http://software.danielwatrous.com/a-review-of-docker/

Luego fui a construir una pila LEMP usando Docker. No me pareció muy útil dividir los procesos de PHP y Nginx en contenedores Docker separados, pero las funciones de la Web y de la Base de Datos están en contenedores separados. También le muestro cómo administrar enlaces y compartir volúmenes para evitar ejecutar daemons SSH en sus contenedores. Puedes seguir lo que hice aquí como punto de referencia.

http://software.danielwatrous.com/use-docker-to-build-a-lemp-stack-buildfile/

Para su punto acerca de la complejidad aumentada para la función única por contenedor, tiene razón. Se verá y se sentirá como si tuviera niveles diferenciados y distribuidos. Las aplicaciones muy grandes lo han hecho durante años y aumenta la complejidad en lo que respecta a la comunicación, la seguridad y la gestión. Por supuesto, trae una serie de beneficios también.