Docker Compose completo: gestiona aplicaciones multi-contenedor
Docker Compose es la herramienta que necesitas cuando una aplicación tiene varios servicios: base de datos, backend, frontend, caché. Sin ella tienes que arrancar cada contenedor manualmente. Con Docker Compose defines todo en un YAML y arrancas con un comando. En este post te explico cómo usarlo con ejemplos reales de producción.
Qué es Docker Compose y para qué sirve
Docker Compose es una herramienta para definir y ejecutar aplicaciones Docker multi-contenedor. En vez de múltiples comandos docker run, defines todos los servicios en un docker-compose.yml y los gestionas con comandos simples. Consulta la documentación oficial de Docker Compose para más detalle.
Docker Compose v1 vs v2
La versión antigua usaba docker-compose con guión. La versión actual usa docker compose sin guión, integrada en Docker 24+. Los tutoriales que ves con guión son de la v1.
docker compose version
Estructura del docker-compose.yml
El archivo define servicios, redes y volúmenes. Ejemplo con WordPress y MySQL:
services:
db:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppassword
volumes:
- db_data:/var/lib/mysql
networks:
- wp-network
wordpress:
image: wordpress:latest
restart: always
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppassword
WORDPRESS_DB_NAME: wordpress
depends_on:
- db
networks:
- wp-network
volumes:
db_data:
wp_data:
networks:
wp-network:
| Clave | Qué hace |
|---|---|
| image | Imagen Docker a usar |
| build | Construir desde Dockerfile local |
| ports | Mapeo host:contenedor |
| environment | Variables de entorno |
| volumes | Montar volúmenes o directorios |
| depends_on | Orden de arranque |
| restart | Política de reinicio |
| networks | Redes del servicio |
Comandos esenciales de Docker Compose
# Arrancar en segundo plano
docker compose up -d
# Arrancar y reconstruir imágenes
docker compose up -d --build
# Parar servicios
docker compose down
# Parar y eliminar volúmenes
docker compose down -v
# Ver estado
docker compose ps
# Ver logs en tiempo real
docker compose logs -f wordpress
# Ejecutar comando en un servicio
docker compose exec wordpress bash
# Reiniciar un servicio
docker compose restart wordpress
Ejemplo real: Node.js con PostgreSQL y Redis
Este es el stack que uso en proyectos de producción: API, base de datos y caché:
services:
api:
build: .
ports:
- "3000:3000"
environment:
NODE_ENV: production
depends_on:
db:
condition: service_healthy
restart: on-failure
networks:
- app-network
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: myapp
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d myapp"]
interval: 10s
timeout: 5s
retries: 5
networks:
- app-network
cache:
image: redis:7-alpine
networks:
- app-network
volumes:
postgres_data:
networks:
app-network:
Variables de entorno con archivo .env
Nunca pongas contraseñas directamente en el docker-compose.yml si lo subes a un repositorio. Usa un archivo .env separado:
# Archivo .env — nunca subir a git
DB_USER=user
DB_PASS=mipassword
DB_NAME=myapp
# En docker-compose.yml las referencias van entre llaves:
# POSTGRES_USER: value_from_env_file
# En .gitignore añade:
# .env
Healthchecks: esperar a que el servicio esté listo
depends_on solo garantiza el orden de arranque, no que el servicio esté listo para recibir conexiones. Para eso están los healthchecks:
services:
db:
image: mysql:8.0
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
api:
depends_on:
db:
condition: service_healthy
Conclusión
Docker Compose simplifica radicalmente la gestión de aplicaciones multi-contenedor. Una vez defines tu stack en un docker-compose.yml, levantas todo con un comando en cualquier entorno. Si aún no tienes clara la base, empieza por el post de Introducción a Docker.
En el próximo post veremos Networking en Docker: bridge, host y overlay. Tienes algún stack de Docker Compose que uses habitualmente? Compártelo en los comentarios.
