Docker Compose
Hasta ahora hemos trabajado con un solo contenedor. Correr tu aplicación local de forma asilada y con unos cuantos comandos era "factible".
La realidad es que el 90% de los sistemas de software en el planeta tierra y más allá no constan de 1 sola parte. Consisten de un Frontend (React/Next), un Backend (Node/Python) y una o muchas Bases de Datos (Postgres/Redis).
¿Tuvieras que abrir 3 terminales y tipear:
docker run -d -p 3000:3000 --name web front +
docker run -d -p 8080:8080 --name api back +
docker run -d -p 5432:5432 -e POSTGRES_USER=admin --name db postgres... cada vez que arrancas tu día?
Y si los tres intentan comunicarse entre sí... sus IPs de red van a diferir. Aquí es donde Docker Compose brilla.
Docker Compose es una herramienta oficial que viene con Docker para orquestar localmente múltiples contenedores como si fuesen una familia feliz y unida que se comunican entre sí por nombre interno en lugar de por enredadas IPs.
El Archivo docker-compose.yml
Se basa en un archivo en formato YAML (muy parecido al dictado JSON) que se posa regularmente en la raíz del proyecto para definir los servicios (contenedores) que levantarán el sistema estelar completo.
Ejemplo simplísimo para arrancar tu API amarrado a una Base de Datos en un par de segundos:
# 1. Definimos la versión general de sintaxis que leerá Docker (3 es el estándar moderno)
version: '3.8'
# 2. Empezamos a dictar todos nuestros contenedores
services:
# A) Contenedor 1: Nuestra base de datos.
# (No necesitamos crear un Dockerfile; que simplemente baje la imagen de internet)
basededatos:
image: postgres:14
ports:
- "5432:5432"
environment: # Las variables de configuración de esta base a levantar
POSTGRES_USER: administrador
POSTGRES_PASSWORD: super_password
# B) Contenedor 2: Nuestro Backend (API desarrollada por nosotros)
backend:
build: . # Esto le indica que busque el 'Dockerfile' en nuestra propia carpeta para construir este bloque, pues no hay un original en la nube pre-empaquetado para él.
ports:
- "8080:8080"
depends_on:
- basededatos # ESTO ES LA MAGIA: Obligamos a que el Backend no se encienda HASTA que la base de datos de arriba esté levantada y lista para funcionar. Redirigirá el tráfico automáticamente asegurando su sincronía estelar e inmediata.
environment:
# Cuando mi backend necesite llamar internamente a la base de datos de Docker, en donde pondría "localhost:5432" pondré amablemente a su propio 'services:'
DB_HOST: basededatos
Levantando "La Orquesta"
En vez de pelearte escribiendo múltiples manualidades con docker run en diferentes ventanas:
Abre una sola terminal oficial donde viva este genial y revolucionario YAML y ejecuta:
# Levanta TODO el entorno de una vez.
# Agregar un '-d' tras 'up' levantará todo en el fondo (Detached).
docker-compose up -d
Ya está. Literalmente en segundos se descargarán la base de Postgres oficial, tu máquina empezará veloz e implacablemente a construir tu imagen BackEnd bajo tu propio Dockerfile, creará una red secreta local y privada interna entre el Node Engine y PostgreSQL para comunicarse como uno, y encenderá todo al compás exponiendo los deseados puertos en tu explorador bajo la marca Localhost. Voilá!. 🚀
Y al finalizar el ardúo día, apágate y destruye ambos con idéntico minimalismo tecnológico:
docker-compose down