Docker Compose: orquestar múltiples contenedores
Dedicados & VPS
21

Qué es Docker Compose

Casi ninguna aplicación real vive sola: necesitas una base de datos, un caché, quizás un worker de colas y un servidor web. Lanzar cada contenedor con docker run y sus mil flags es tedioso y propenso a errores. Docker Compose resuelve esto definiendo todo tu stack en un único archivo YAML declarativo.

El archivo docker-compose.yml

Compose agrupa los contenedores en servicios, los conecta mediante networks y persiste datos con volumes. Un archivo básico para WordPress con MySQL se ve así:

services:
  db:
    image: mariadb:11
    restart: unless-stopped
    environment:
      MARIADB_ROOT_PASSWORD: rootsecret
      MARIADB_DATABASE: wordpress
      MARIADB_USER: wpuser
      MARIADB_PASSWORD: wppass
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - backend

  wordpress:
    image: wordpress:6-php8.2-apache
    restart: unless-stopped
    depends_on:
      - db
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: wppass
    volumes:
      - wp_data:/var/www/html
    networks:
      - backend

volumes:
  db_data:
  wp_data:

networks:
  backend:

Comandos esenciales

Coloca el archivo en una carpeta y ejecuta los comandos desde ahí:

  • docker compose up -d: construye (si aplica) y levanta todos los servicios en segundo plano.
  • docker compose ps: muestra el estado de cada servicio.
  • docker compose logs -f wordpress: sigue los logs de un servicio específico.
  • docker compose exec db mariadb -uroot -p: abre una sesión dentro del contenedor de base de datos.
  • docker compose restart wordpress: reinicia un servicio sin tocar los demás.
  • docker compose down: detiene y elimina contenedores y redes (los volúmenes persisten).
  • docker compose down -v: elimina también los volúmenes (¡borra la base de datos!).

Persistencia de datos

La regla de oro: los contenedores son efímeros, los datos deben vivir en volúmenes. En el ejemplo anterior, MariaDB guarda sus archivos en el volumen db_data. Puedes destruir el contenedor db mil veces y los datos seguirán ahí cuando lo vuelvas a crear. Lo mismo aplica a wp_data, que guarda la carpeta wp-content.

Variables de entorno y archivos .env

Es buena práctica sacar las contraseñas del YAML y ponerlas en un archivo .env a la par del compose:

DB_ROOT_PASSWORD=rootsecret
DB_USER=wpuser
DB_PASSWORD=wppass

Luego referencias las variables con ${DB_PASSWORD} en el YAML. Agrega el .env a tu .gitignore para no subir secretos al repositorio.

Ventajas frente a scripts manuales

Con un solo archivo cualquier persona del equipo puede levantar el entorno idéntico al tuyo en segundos. Además, Compose crea automáticamente una red privada donde los servicios se encuentran por nombre: WordPress usa db como hostname porque Compose resuelve ese nombre al contenedor correcto. Adiós a buscar IPs.

Docker Compose es el puente natural entre ejecutar un contenedor suelto y trabajar con orquestadores más complejos como Kubernetes.