Docker Compose y la orquestación de contenedores

Continuamos con la serie de artículos sobre contenedores; primero, comenzamos con la creación de nuestras propias imágenes con Docker Build y vimos cómo ejecutarlas con Docker run. Hoy aprenderemos qué es Docker Compose y comenzaremos nuestro viaje dentro del mundo de la orquestación de contenedores.

Actualmente hemos estado gestionando nuestros contenedores manual e independientemente, lo que para alguna prueba puntual es válido y funcional. Pero cuando empieza a crecer el número de contenedores a gestionar, este método se vuelve inviable. En estos casos es donde entra en juego la orquestación de contenedores para gestionar múltiples contenedores de forma eficiente.

Qué es la orquestación de contenedores

La orquestación de contenedores consiste en la gestión y monitorización centralizada y eficiente de contenedores. No solo de los contenedores en sí mismos sino también de su entorno, incluyendo sus relaciones y conexiones entre ellos.

Una herramienta de orquestación debe tener al menos 4 elementos clave:

  • Despliegue
  • Escalado
  • Red
  • Fiabilidad

El despliegue, como indica su nombre, es la posibilidad de desplegar nuestros contenedores de forma eficiente. Por lo general, este despliegue se realiza haciendo uso de manifiestos. (veremos estos manifiestos más adelante).

El escalado se refiere a la posibilidad de incrementar el número de contenedores corriendo de forma sencilla. Si, por ejemplo, tenemos un contenedor corriendo un servidor web y el tráfico crece, podemos escalarlo y duplicar el mismo contenedor las veces que sea necesario para satisfacer la demanda. El escalado no solo funciona en el sentido del crecimiento, también se pueden disminuir la cantidad de réplicas del contenedor, si el tráfico baja, por ejemplo.

Un buen orquestador tiene que ser capaz de gestionar la red interna que interconecta los contenedores. Como hemos aprendido, los contenedores suelen ser descartables, podemos levantar o parar estos contenedores según las necesidades puntuales de nuestra aplicación, por lo que es muy complicado gestionar las direcciones ips de cada contenedor. Para esto, las herramientas de orquestación son capaces de generar segmentos de red internos para nuestras aplicaciones, además de contar con balanceadores de red y un servicio de DNS que nos permitirá referirnos a los distintos elementos de nuestra aplicación por su nombre, sin necesidad de gestionar direcciones ip.

Fiabilidad: un orquestador debe ser capaz de mantener nuestra aplicación operativa; una vez que declaramos los contenedores que necesitamos tener desplegados para nuestra aplicación, el orquestador se encargará de mantener estos siempre disponibles. Sabemos que los contenedores son descartables, se detienen y mueren; en estas ocasiones hay que ejecutarlos de nuevo o incluso levantar uno totalmente nuevo para reemplazar un contenedor muerto. Un orquestador es capaz de realizar estas tareas automáticamente, levantando los contenedores que mueran en función a lo que le declaremos.

Puede que todo esto te suene un poco complicado, pero no te preocupes, en cuanto nos pongamos manos a la obra verás que son conceptos sencillos de entender, y que realmente es el orquestador el que se ocupa de las tareas complicadas; nosotros solo tenemos que preocuparnos de declarar correctamente lo que queremos que haga el orquestador.

En nuestro caso, para comenzar nuestro camino con los orquestadores vamos a utilizar uno de los más sencillos, Docker Compose, que contiene todos los elementos antes descritos y es muy sencillo de utilizar.

¿Qué es Docker Compose?

Es una herramienta que nos permite ejecutar múltiples contenedores intercomunicados de forma sencilla, haciendo uso de manifiestos, en este caso en formato YAML. Este manifiesto es donde definiremos el estado deseado. Docker Compose se encargará de ejecutar todas las acciones necesarias para mantener ese estado, y lo mejor de todo es que puede hacerse con un solo comando.

Este artículo no pretende ser una referencia para el uso de Docker Compose y todas sus posibilidades, para eso tenemos la documentación oficial de Docker ( https://docs.docker.com/compose/compose-file/ ) donde tendremos todas las opciones disponibles y su sintaxis. La intención es presentar a Docker Compose como una alternativa sencilla para el despliegue de aplicaciones en contenedores y una introducción a la orquestación de contenedores.

Por lo general, para el uso de cualquier orquestador se suele declarar el estado deseado en uno o varios manifiestos; básicamente es el principio de la Infrastructure as Code (IaC).

Los manifiestos en Docker Compose se escriben en formato YAML, que es un formato muy extendido en otro tipo de orquestadores también muy extendidos como Kubernetes o Docker Swarn, por lo que lo aprendido aquí nos será útil cuando demos el paso a estas herramientas más potentes y complejas.

Un ejemplo de un manifiesto yaml de Docker Compose sencillo para una base de datos Mysql puede ser:

version: '3.1'
services:
db:
image: rameijeiras/pandorafms-percona-base
environment:
MYSQL_ROOT_PASSWORD: pandora
MYSQL_DATABASE: pandora
MYSQL_USER: pandora
MYSQL_PASSWORD: pandora
ports:
- "3306:3306"

Como podéis ver es similar a lo que hacemos en un comando Docker run, pero en formato YAML.

Este manifiesto es homólogo a la ejecución manual del comando:

docker run --name db \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=pandora \
-e MYSQL_DATABASE=pandora \
-e MYSQL_USER=pandora \
-e MYSQL_PASSWORD=pandora \
-d rameijeiras/pandorafms-percona-base

Una vez que tenemos un manifiesto guardado, por lo general en un fichero docker-compose.yml, simplemente debemos situarnos en el directorio del fichero y ejecutar el comando docker-compose up. Automáticamente, Docker Compose hará las tareas necesarias para levantar el contenedor: descargará la imagen, si no la tenemos en local, definirá las variables de entorno declaradas y expondrá el puerto 3306 del contenedor al 3306 del host, como hemos declarado.

Para este contenedor, las ventajas del compose sobre la ejecución del comando Docker run no se aprecian demasiado. En este caso es no tener que lanzar un comando largo y poder hacerlo en otro más sencillo, pero cuando tenemos que gestionar más de un contenedor e interconectarlos es donde la utilidad de un orquestador como Docker Compose brilla.

Instalación Docker Compose

Para poder utilizar Docker Compose debemos tener instalado Docker en nuestra máquina o en un servidor; si no sabes cómo instalar Docker debes seguir los pasos en su documentación oficial ( https://docs.docker.com/engine/install/ ) para los distintos sistemas operativos.

La instalación de Docker Compose es muy sencilla; dejo aquí la documentación, ( https://docs.docker.com/compose/install/ ) aunque los pasos son muy sencillos.

En sistemas Linux basta con ejecutar un par de comandos:

sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

En sistemas Windows con la instalación de Docker for Windows se instala Docker Compose por defecto.

Podemos comprobar la instalación en cualquier sistema ejecutando el comando

docker-compose -v

Linux

null
imagen: WindowsTerminal_G4P8jVQxNG.png

Windows (powershell):

null
imagen: WindowsTerminal_ruyy7PUpug.png

Ejecutando Pandora FMS Community con Docker Compose

Ahora veremos un ejemplo práctico y, cómo no, utilizaremos nuestra aplicación favorita: Pandora FMS. En los anteriores artículos hemos aprendido a generar nuestras propias imágenes y ejecutarlas usando el comando Docker run; hoy lo haremos de una forma mucho más sencilla utilizando simplemente un manifiesto en formato yaml y el comando docker-compose up.

Si no has leído los artículos anteriores no te preocupes; hemos publicado los resultados de los mismos en el repositorio https://github.com/rafaelameijeiras/PandoraFMS y tenemos publicadas las imágenes generadas en Docker hub, por lo que podéis seguir el tutorial para ejecutar Pandora FMS sin problema.

El manifiesto que utilizaremos será:

version: '3.1'
services:
db:
image: rameijeiras/pandorafms-percona-base
restart: always
command: ["mysqld", "--innodb-buffer-pool-size=300M"]
environment:
MYSQL_ROOT_PASSWORD: pandora
MYSQL_DATABASE: pandora
MYSQL_USER: pandora
MYSQL_PASSWORD: pandora
networks:
- pandora

pandora:
image: rameijeiras/pandorafms-community
restart: always
depends_on:
- db
environment:
MYSQL_ROOT_PASSWORD: pandora
DBHOST: db
DBNAME: pandora
DBUSER: pandora
DBPASS: pandora
DBPORT: 3306
INSTANCE_NAME: pandora01
SLEEP: 10
RETRIES: 5
volumes:
- mysql:/var/lib/mysql
networks:
- pandora
ports:
- "8080:80"
- "41121:41121"
- "162:162/udp"

networks:
pandora:
volumes:
mysql:

Si has descargado el repositorio estará en el directorio

PandoraFMS/pandorafms_community/docker-compose.yml


imagen: WindowsTerminal_ZqL7HX9JOj.png

Ahora simplemente debes ejecutar el comando:

docker-compose -f PandoraFMS/pandorafms_community/docker-compose.yml up

Como puedes ver hemos usado el parámetro -f (file) para definir el fichero del manifiesto que queremos usar, sin necesidad de movernos al directorio que lo contiene; también podemos usar otro nombre para el fichero, diferente a docker-compose.yaml, si usamos el argumento -f seguido del path y nombre del fichero yaml.

Una vez lanzado el comando, comenzará la ejecución de las tareas necesarias para levantar e interconectar los contenedores declarados. Si no tienes las imágenes localmente las descargara antes de levantar los contenedores. Mucho más sencillo que ejecutar cada contenedor independientemente.


imagen: compose-up.gif

Por defecto, al ejecutar el comando dejará por pantalla el log de ambos contenedores; podemos usar ctrl + z para enviarlo al background o, mejor aún, podemos ejecutar el comando con el flag -d que por defecto lanzará los contenedores en background dejando la terminal disponible para su uso.

docker-compose -f PandoraFMS/pandorafms_community/docker-compose.yml up -d

Para ver el estado de todos los contenedores declarados en este manifiesto, es tan sencillo como ejecutar:

docker-compose -f PandoraFMS/pandorafms_community/docker-compose.yml ps


imagen: WindowsTerminal_yDo0HjuAZw.png

Ahora simplemente vamos a nuestro navegador y ponemos la ip de nuestro servidor Docker seguido por dos puntos “:” y el puerto que hemos expuesto en el manifiesto, diagonal “/” pandora_console ; en mi caso lo estoy corriendo en local así que usaré 127.0.0.1:8080/pandora_console


imagen: yTJF7R3Z6h.png

Como podéis ver ya tenéis Pandora FMS Community Edition corriendo con tan solo la ejecución de un comando; un despliegue limpio y rápido.

Para detener los contenedores declarados en el manifiesto bastará con ejecutar:

docker-compose -f PandoraFMS/pandorafms_community/docker-compose.yml stop


imagen: WindowsTerminal_iCFmhaMMFZ.png

Como podemos ver en el manifiesto, estamos almacenando la información de la base de datos en el volumen local mysql, por lo que sin importar cuantas veces paremos o levantemos el contenedor los datos del contenedor de base de datos son persistentes.

Si queremos borrar todos los datos sin dejar rastro, incluyendo los datos persistentes de la base de datos, podemos ejecutar el comando:

docker-compose -f PandoraFMS/pandorafms_community/docker-compose.yml down


imagen: WindowsTerminal_kjiqQWXJRu.png

Que destruirá los contenedores y todos los datos asociados a ellos.

Como veis, utilizar Docker Compose facilitará mucho nuestros despliegues. Es una herramienta muy versátil y potente, pero puede llegar a ser complicada al principio. Si es tu caso no te preocupes, es muy difícil ver todas sus posibilidades en un solo post.

Así que si te gusta el mundo de los contenedores y quieres aprender más de Docker Compose y otros orquestadores más avanzados como Kubernetes, mantente atento al blog.

Antes de despedirnos, recuerda que si tienes que monitorizar más de 100 dispositivos puedes disfrutar de una DEMO GRATUITA de 30 días de Pandora FMS Enterprise. Consíguela aquí.

Si cuentas con un número reducido de dispositivos para monitorizar puedes utilizar la versión OpenSource de Pandora FMS. Encuentra más información aquí.

Shares