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:
-
Tutum
proporciona un contenedor todo en uno para la aplicación Wordpress: https://github.com/tutumcloud/tutum-docker-wordpress Phusion
, que proporciona una imagen base optimizada para Docker, precisa en la documentación ( https://github.com/phusion/baseimage-docker#docker_single_process ):Docker funciona bien con múltiples procesos en un contenedor. De hecho, no hay una razón técnica por la que deba limitarse a un solo proceso
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:
- la herramienta orquestadora
Gaudi
proporciona un ejemplo con una arquitectura LEMP basada en 3 contenedores "daemon" (nginx, mysql, phpfpm) y 2 contenedores de aplicaciones (compositor, bower) ( http://marmelab.com/blog/2014/06/04/demo-symfony-with-docker-and-gaudi.html )
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:
- ¿Cuáles son los criterios, pros / contras a considerar al elegir entre estas soluciones?
- ¿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 ...?
- 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.