5. Docker Compose

Docker Compose es una herramienta que permite definir y gestionar múltiples contenedores como un solo servicio. Esto se realiza mediante un archivo docker-compose.yml, en el que se describe la configuración completa del entorno, facilitando despliegues repetibles, organizados y portables.


¿Por qué usar Docker Compose?


Sintaxis básica del archivo docker-compose.yml

version: '3.8'
services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
  app:
    build: .
    volumes:
      - .:/app
    depends_on:
      - db
  db:
    image: postgres:15
    environment:
      POSTGRES_USER: usuario
      POSTGRES_PASSWORD: contraseña
volumes:
  datos_db:

Comandos principales

docker compose up       # Levanta todo
docker compose down     # Detiene y elimina contenedores y redes
docker compose build    # Construye las imágenes
docker compose logs -f  # Ver logs en vivo
docker compose exec app bash  # Accede al contenedor app

Nota: A partir de Docker v20.10+, se recomienda usar docker compose (sin guion), aunque docker-compose aún es válido.


Variables de entorno

Puedes usar un archivo .env para definir valores reutilizables:

Archivo .env:

POSTGRES_USER=usuario
POSTGRES_PASSWORD=contraseña
PUERTO_EXTERNO=8080

Y luego usarlos en el YAML:

environment:
  POSTGRES_USER: ${POSTGRES_USER}
  POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
ports:
  - "${PUERTO_EXTERNO}:80"

El archivo .env debe estar en el mismo directorio que el docker-compose.yml. Puedes versionarlo parcialmente, excluyendo claves sensibles con .gitignore.


Redes personalizadas

Docker Compose crea una red por defecto, pero puedes definir otras:

networks:
  red_interna:
    driver: bridge
services:
  app:
    networks:
      - red_interna

Montaje de volúmenes

Para mantener persistencia de datos o facilitar el desarrollo:

volumes:
  - ./datos:/var/lib/postgresql/data

Esto enlaza un directorio local con uno dentro del contenedor.


Ejemplo completo de stack

version: '3.8'
services:
  db:
    image: mariadb
    environment:
      MYSQL_ROOT_PASSWORD: ejemplo123
    volumes:
      - db_data:/var/lib/mysql

  wordpress:
    image: wordpress
    ports:
      - "8000:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: ejemplo123
    depends_on:
      - db

volumes:
  db_data:

Consejos prácticos


Herramientas relacionadas


06 Volúmenes y persistencia de datos