Docker Compose para contener una aplicación MEAN Stack



Docker Compose es una herramienta para definir y ejecutar múltiples contenedores para ejecutar aplicaciones complejas en Docker, por ejemplo, contener una aplicación MEAN.

En los blogs anteriores sobre Docker, habría leído sobre qué son las imágenes de Docker, los contenedores de Docker y cuál es su necesidad. Si no ha leído sobre ellos, le pido que lea , antes de continuar con este blog sobre Docker Compose.

Después de explorar las posibilidades que ofrece Docker, ciertamente es muy emocionante aprender más. ¿No es así? Bueno, al menos lo estaba cuando me topé con un desafío.





Introducción a Docker Compose

Crear contenedores para una sola aplicación de servicio fue fácil para mí. Pero cuando tuve que contener varios servicios en contenedores separados, me encontré con un obstáculo. Mi requisito era contener y alojar una aplicación MEAN stack.

Sí, lo leíste bien. Una aplicación de pila completa. Inicialmente pensé que no era posible. Pero después de enterarme de Docker Compose, supe que todos mis problemas se resolverían.



Docker Compose se puede utilizar para crear contenedores separados (y alojarlos) para cada una de las pilas en una aplicación de pila MEAN. MEAN es el acrónimo de MongoDB Express Angular & NodeJs. La demostración que mostraré en este blog también trata sobre el mismo tema.

Al usar Docker Compose, podemos alojar cada una de estas tecnologías en contenedores separados en el mismo host y hacer que se comuniquen entre sí. Cada contenedor expondrá un puerto para comunicarse con otros contenedores.

Docker Compose mantendrá la comunicación y el tiempo de actividad de estos contenedores.



Entonces, puede preguntarse, ¿cómo configurar toda esta infraestructura? Bueno, entonces déjame darte una explicación más detallada.

Dockerfile

De forma similar a como hacemos girar cualquier contenedor de una sola aplicación escribiendo un dockerfile, tendremos que escribir un dockerfile separado para construir cada una de las aplicaciones de un solo contenedor. Además, también tendremos que escribir un archivo Docker Compose que hará el trabajo real. Docker Compose File ejecutará los diferentes dockerfiles para crear los diferentes contenedores y permitir que interactúen entre sí.

En nuestro caso, tenemos una aplicación de pila completa que se compone de MongoDB, ExpressJS, Angular y NodeJS. MongoDB se encarga de la base de datos de back-end, NodeJS y ExpressJS son para la renderización del lado del servidor y Angular es para el front-end.

Aplicación MEAN Stack - Docker Compose - Edureka

Como hay tres componentes, tenemos que girar contenedores para cada uno de los componentes. Tenemos que girar los contenedores de la siguiente manera:

  1. Contenedor 1 - Angular
  2. Contenedor 2: NodeJS y ExpressJS
  3. Contenedor 3 - MongoDB

Creación de contenedores Docker

Como primer paso para dockerizar la aplicación media, escribamos el archivo docker para compilar cada uno de los componentes, comenzando desde el contenedor de Angular. Este dockerfile deberá estar presente dentro del directorio del proyecto junto con el archivo 'package.json'. El 'package.json' contiene los detalles sobre qué versión de las dependencias debe usar 'NPM' para construir la aplicación angular.

1. Dockerfile para el front-end

DESDE el nodo: 6 EJECUTAR mkdir -p / usr / src / app WORKDIR / usr / src / app COPY package.json / usr / src / app RUN npm cache clean EJECUTAR npm install COPY. / usr / src / app EXPOSE 4200 CMD ['npm', 'start']

Como siempre, nuestro primer comando es extraer una imagen base, y estamos extrayendo una imagen base 'nodo: 6'.

Los siguientes dos comandos tratan sobre la creación de un nuevo directorio '/ usr / src / app' dentro del contenedor de Docker para almacenar códigos angulares y hacer de este el directorio de trabajo dentro del contenedor.

Luego, estamos copiando el archivo 'package.json' de nuestro directorio de proyecto al interior del contenedor.

Luego ejecutamos el comando 'npm cache clean' que limpia la caché npm.

Después de eso, ejecutamos el comando 'npm install' que comienza a descargar las placas de caldera necesarias para alojar la aplicación Angular. Comienza a descargar las placas de la caldera en función de las versiones de las dependencias especificadas en 'package.json'.

El siguiente comando 'EJECUTAR' es copiar todos los códigos, carpetas presentes desde el directorio del proyecto al interior del contenedor.

El comando anterior le pide al contenedor que exponga el número de puerto 4200 para comunicarse con el servidor de back-end para enviar solicitudes hechas por los usuarios que acceden al cliente de front-end a través de la interfaz de usuario web.

Finalmente, el último comando es el comando 'EJECUTAR' para iniciar 'npm'. Esto comienza a ejecutar los códigos para construir nuestra aplicación Angular.

La aplicación Angular ya está lista, pero no se alojará correctamente debido a su dependencia de un servidor back-end y una base de datos. Así que vayamos más allá y escribamos un archivo docker para contener el servidor back-end.

2. Dockerfile para back-end

Incluso este dockerfile estará presente en un directorio de proyecto. Este directorio también contendrá el archivo 'package.json' para definir las dependencias del servidor Express y otros requisitos de NodeJS. Pero lo más importante es que contiene el código del proyecto para admitir el servidor back-end.

DESDE el nodo: 6 EJECUTAR mkdir -p / usr / src / app WORKDIR / usr / src / app COPY package.json / usr / src / app RUN npm cache clean EJECUTAR npm install COPY. / usr / src / app EXPOSE 3000 CMD ['npm', 'start']

Como puede ver, hay muchas similitudes entre los dos dockerfiles. Usamos el mismo 'nodo: 6' que la capa de imagen base, creamos un nuevo directorio dentro del contenedor, lo convertimos en el directorio de trabajo y ejecutamos el comando 'npm install', entre otros. Pero la única diferencia es el número de puerto expuesto para la comunicación. En este caso, se define el número de puerto 3000. Aquí es donde se alojará el servidor y buscará solicitudes del cliente.

3. Base de datos

Quizás se pregunte por qué no he mencionado 'dockerfile para base de datos' en el encabezado. La razón es que en realidad no tenemos ninguna necesidad de personalización. Inmediatamente podemos extraer una imagen base 'MongoDB' para almacenar nuestros datos y simplemente exponer el número de puerto en el que se puede acceder.

Ahora la pregunta en tu mente sería, ¿dónde haría eso? Bueno, podemos hacerlo en el archivo Docker Compose.

Archivo de composición de Docker

Docker Compose File es un archivo YAML que contiene detalles sobre los servicios, redes y volúmenes para configurar la aplicación Docker.

Ejecute el siguiente comando para encontrar la versión de su motor Docker.

Docker -v

La ejecución del comando devolverá la versión que se ejecuta en su host. Según la versión de Docker Engine en su host, descargue una versión adecuada de Docker Compose. Puede buscar la versión adecuada para descargar, desde Documentación oficial de Docker .

Desde que estoy ejecutando Docker Engine versión 17.05.0-ce, he usado Docker Compose versión 3.

Instalar Docker Compose

Para descargar Compose, ejecute el siguiente conjunto de comandos.

sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o / usr / local / bin / docker- componer sudo chmod + x / usr / local / bin / docker-compose

Tenga en cuenta que el número de versión en el comando cambiará según la versión de Docker Engine que esté ejecutando.

A continuación se muestran los comandos que forman parte de mi archivo de composición de Docker.

pruebas basadas en datos en selenio
versión: '3.0' # especificar la versión de docker-compose # Definir los servicios / contenedores que se ejecutarán services: angular: # nombre del primer servicio build: angular-app # especificar el directorio de los puertos de Dockerfile: - '4200: 4200' # especificar mapeo de puertos express: # nombre del segundo servicio build: express-server # especificar el directorio de los puertos Dockerfile: - '3000: 3000' #specificar puertos mapeo enlaces: - base de datos # enlazar este servicio a la base de datos del servicio de base de datos: # nombre de la imagen del tercer servicio: mongo # especificar la imagen para construir el contenedor desde los puertos: - '27017: 27017' # especificar el reenvío de puertos

Estoy bastante seguro de que los comandos del archivo anterior no tienen sentido para usted. Entonces, solucionemos ese problema.

En la primera línea de código, definí la versión de Docker Compose que estoy usando. Este es un paso muy importante si desea que Compose funcione correctamente sin arrojar ningún error. Asegúrese de descargar la versión de Docker Compose de acuerdo con la versión de su motor de Docker.

Después de eso, definí tres contenedores usando la palabra clave 'servicios'. Estos servicios se refieren a los tres componentes de mi pila, front-end, back-end y base de datos. Entonces, en este caso, el nombre de mis contenedores será el nombre de mis servicios, es decir, 'angular', 'express' y 'base de datos'.

La palabra clave 'compilación' se utiliza para indicar que el archivo docker para hacer girar ese contenedor está presente en ese directorio. Espera, ¿estás confundido cómo?

Es sencillo. La ruta debe especificarse después de 'build:'. En nuestro caso, 'angular-app' y 'express-server' son rutas a dos directorios a los que se puede acceder desde el directorio donde está presente Docker Compose File. Para nuestro contenedor de base de datos, simplemente he dicho que use una 'imagen: mongo' base en lugar de una ruta a dockerfile.

Para cada uno de estos servicios, también he especificado los números de puerto que se pueden usar para recibir / enviar solicitudes de otros contenedores (servicios). 4200 en caso de angular, 3000 en caso de express y 27017 en caso de mongo.

Además, el contenedor expreso tiene un 'enlace:' al contenedor de la base de datos, lo que indica que cualquier dato que se reciba en el lado del servidor se enviará a la base de datos donde se almacenará.

Ahora, finalmente, estamos a la conclusión de configurar un Redactar. Para iniciar un Docker Compose y girar los tres contenedores con tres servicios, simplemente debemos ejecutar los dos comandos siguientes desde el directorio donde está presente el Docker Compose File (archivo YAML):

docker-compose build docker-compose up

El comando 'docker-compose build' se usa para construir / reconstruir los servicios, mientras que el comando 'docker-compose up' se usa para crear / iniciar los contenedores. ¡Adelante! Pruébelo usted mismo.

A continuación se muestran capturas de pantalla de imágenes de Docker que se están creando y luego ejecutando. Puede notar que la imagen angular se está construyendo y luego se etiqueta con el nombre 'angular: último'.

Además, una imagen para Express se crea con el nombre y la etiqueta 'express: latest'.

Ahora que la imagen está construida, intentemos ejecutarla y hacer girar un contenedor en el proceso. A continuación se muestra esa captura de pantalla.

A continuación se muestra la captura de pantalla que dice 'paquete web: compilado correctamente', lo que significa que Docker ha colocado en contenedores los tres servicios.

Ahora que los contenedores están alojados, puede ver los servicios activos en sus respectivos puertos. Vaya a escribir los siguientes números de puerto en su navegador web para interactuar con la GUI de la aplicación MEAN.

localhost: 4200 - Aplicación angular (front-end)
localhost: 3000 - Express Server y NodeJS (back-end / servidor)
localhost: 27017 - MongoDB (base de datos)

Impresionado todavía? ¡Espere, porque Docker aún no ha terminado! Podemos usar el comando 'docker-compose scale =’ x ''para escalar o reducir fácilmente el número de implementaciones. En otras palabras, podemos crear esa cantidad de contenedores para un servicio. A continuación, se muestra el comando completo para escalar un servicio en particular a contenedores '5':

docker-compose scale = 5

Escalar los servicios con tanta facilidad, empaquetarlos y contenerlos de una manera tan rentable es lo que hace de Docker una de las mejores herramientas de implementación y mi favorita personal.

Si aún tiene dudas sobre este concepto, puede ver el video a continuación en el que he explicado el mismo concepto con una práctica práctica de cómo configurar un Docker Compose.

Docker Compose | Aplicación en contenedores MEAN Stack | Tutorial de DevOps

Ahora que ha aprendido sobre Docker, consulte el por Edureka, una empresa de aprendizaje en línea de confianza con una red de más de 250.000 alumnos satisfechos repartidos por todo el mundo. Este curso de formación de certificación de Edureka Docker ayuda a los alumnos a adquirir experiencia en la implementación de Docker y su dominio.

Tienes una pregunta para nosotros? Menciónalo en la sección de comentarios y nos comunicaremos contigo.