Desplegando Aplicaciones con Docker Compose
PROMO DigitalOcean
Antes de comenzar, quería contarles que hay una promoción en DigitalOcean donde te dan un crédito de USD 100.00 durante 60 días para que puedas probar los servicios que este Proveedor Cloud ofrece. Lo único que tienes que hacer es suscribirte a DigitalOcean con el siguiente botón:
O a través del siguiente enlace: https://bit.ly/digitalocean-itsm
Introducción
En artículos anteriores hemos usado Docker de manera imperativa, es decir, a través de la linea de comandos ejecutando las ordenes y sus argumentos (docker images
, docker ps
, docker run
, docker exec
, etc); cuando mucho hemos trabajado con uno o dos contenedores.
El Problema
Imaginemos la siguiente situación: queremos desplegar un Wordpress por ejemplo, el cual consta de la aplicación como tal y el Servidor de Base de Datos al que debemos pasarle unos parámetros como el usuario root, la contraseña el puerto, etc. Entonces nos quedaría algo así:
|
|
Y para crear la base de datos:
|
|
Se hace muy engorroso tener que recordar todos los parámetros necesarios para configurar dos servicios diferentes (Wordpress y MariaDB) al mismo tiempo. Así mismo, tendríamos que saber que dirección IP tendría el contenedor de MariaDB ya que como recordarás en el articulo Conceptos y Comandos Básicos en Docker los contenedores son efimeros, y una vez que mueren, se reinician o fallan, esa dirección IP se pierde y al levantar nuevamente el contenedor, se asigna otra diferente.
Docker Compose
A través de un archivo en formato .yaml
, podemos realizar toda nuestra configuración Declarativamente de manera que vamos a obtener cierto orden en nuestros servicios. Regularmente el archivo lo ubicamos en un directorio aparte que puede contener los datos que vamos a guardar y los archivos de confguracion que le podemos cargar a nuestros servicios (un nginx.conf, my.cnf, etc)
El formato YAML
es el mismo usado para Ansible y Kubernetes, consta de una serie de claves y valores que deben ser identados con dos espacios o con un TAB. Una de las desventajas de utilizar YAML es que ese identado suele ser bastante problematico con configuraciones grandes, sin embargo, no hay nada que un buen plugin de de VSCode o VSCodium no puedan manejar.
Instalando Docker Compose
Linux
Es relativamente fácil instalar Docker Compose en Linux, todo lo que debemos hacer es ejecutar el siguiente comando en una terminal:
|
|
En distribuciones como Manjaro o ArchLinux, ya lo tendremos disponible en los repositorios, es solo ejecutar:
|
|
Microsoft Windows y MacOS
Para instalar Docker Compose en ambos sistemas operativos, debemos instalar Docker Desktop, el cual es solo descargar el instalador Windows | MacOS con Procesadores Intel | MacOS con Procesadores ARM y seguir las instrucciones del instalador.
Nos aseguramos que Docker Compose esté instalado ejecutando:
|
|
|
|
Estructura del Archivo docker-compose.yaml
Consta de tres llaves básicas:
version: "3"
: aquí declaramos la versión de Docker Compose que queremos utilizar.
service
: aquí declaramos todos los contenedores que forman parte de nuestro servicio/aplicación. Le podemos colocar los nombres de los mismos.
networks
(opcional): aquí declaramos el driver de red que usarán nuestros servicios. Recordemos que en Docker tenemos los drivers: bridge (es el driver por defecto. Los contenedores que la usen van a obtener una IP interna y se van a poder comunicar entre ellas, también en el host), host (toma la dirección IP directamente de nuestro Router), Macvlan (el contenedor dentro de esta red, se le va a asignar una dirección MAC única y además va a estar en la red real, pudiendo acceder a los recursos de la misma (DHCP, DNS, etc)), null (El contenedor que se encuentre en esta red, no tendrá IP. Es útil en aquellos casos donde se ejecuten tareas o scripts en el cual el resultado deba ser almacenado en un volumen)
Retomando el ejemplo anterior (Wordpress + MariaDB), el archivo docker-compose.yaml quedaría de la siguiente manera:
|
|
Desglosemos uno a uno los parámetros:
-
image: wordpress
: la imagen que vamos a usar. -
restart: always
: con este parámetro nos aseguramos que se reinicie el contenedor siempre así haya un error con el mismo. También podemos hacer que el contenedor se inicie automáticamente al reiniciar el sistema. -
ports
: puerto del host:puerto del contenedor. El guión significa que es un parámetro de tipo lista, por lo que podemos redireccionar más puertos si fuese necesario. -
environment:
: aquí colocamos las variables de entorno que necesiamos para que ambos servicios funcionen. Si observas bien, hay varios parámetros comoWORDPRESS_DB_HOST
,WORDPRESS_DB_USER
,WORDPRESS_DB_PASSWORD
yWORDPRESS_DB_NAME
que la imagen de Wordpress necesita para poder conectarse a la base de datos. Hay un detalle a considerar con el parámetroWORDPRESS_DB_HOST: db
es que db es el nombre que le colocamos al servicio que se ocupa de levantar la base de datos MariaDB con lo va a hacer match con esa etiqueta, permitiendonos conectarnos a la db sin necesidad de colocar la dirección IP de la base de datos. -
depends_on
: con este parámetro le decimos especificamente al servicio Wordpress que espere a que el servicio db esté iniciado antes de levantar el Wordpress. Es útil cuando tenemos un servicio que tarda un poco en iniciar (normalmente aplicaciones Java o de base de datos) -
volumes
: con $PWD estamos mapeando nuestro directorio actual (donde se encuentra el docker-compose.yaml) al directorio del contenedor donde están los archivos de datos. En el caso de MariaDB redirecciona el directorio db del host a /var/lib/mysql del contenedor. Lo mismo con Wordpress
Iniciando Nuestra Aplicación
Para iniciar nuestra aplicación de ejemplo con Wordpress y MariaDB, debemos estar en el directorio donde se encuentra nuestro docker-compose.yaml y ejecutamos:
|
|
Para verificar que Wordpress haya iniciado correctamente, en cualquier navegador colocamos la direccion http://localhost:8080 y voilà.
Si omitimos el -d
veremos que nuestro servicio inicia en primer plano y veremos lo que está ocurriendo con las aplicaciones.
Para detener el servicio:
|
|
Para iniciar solo un servicio en particular:
|
|
Para detener un servicio en particular:
|
|
Para ver los contenedores en ejecución:
|
|
Para entrar a un servicio y ejecutar comandos:
|
|
Para ver las imagenes utilizadas:
|
|
Si queremos actualizar las imagenes de los contenedores sin interrumpir el servicio:
|
|
Para eliminar todo:
|
|
Nos vemos en la próxima! Happy Dockering 😄
Referencias
Artículos sobre Docker
- Como Instalar Docker en Linux
- Como Instalar Portainer: El Mejor Gestor Gráfico de Docker en Linux
- Conceptos y Comandos Básicos en Docker
- Construyendo Imágenes Personalizadas en Docker con Dockerfile
- Desplegando Aplicaciones con Docker Compose
- Como Configurar un Registro Privado de Docker en Linux
- SupervisorD: Gestionando Procesos en Docker
- Buenas Prácticas al Escribir Dockerfiles
- Crear Imágenes Multi-Arquitectura en Docker con buildx
Apoya este Proyecto
Si te pareció útil este artículo y el proyecto en general, considera brindarme un café :)
Buy me a coffee