Rack de servidores representando Docker Compose y aplicaciones multi-contenedor
|

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:
ClaveQué hace
imageImagen Docker a usar
buildConstruir desde Dockerfile local
portsMapeo host:contenedor
environmentVariables de entorno
volumesMontar volúmenes o directorios
depends_onOrden de arranque
restartPolítica de reinicio
networksRedes 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.

¡No te pierdas los próximos posts!

¡No hacemos spam! Lee nuestra política de privacidad para obtener más información.

Publicaciones Similares

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *