Skip to content

Docker Compose ​

Docker Compose permite definir y ejecutar aplicaciones formadas por varios contenedores mediante un archivo YAML, normalmente llamado compose.yaml. En él se describen los servicios, las redes, los volúmenes y su configuración.

Ejemplo: aplicación web y base de datos ​

El siguiente ejemplo ejecuta un servidor web Nginx y una base de datos PostgreSQL. Guarda el contenido como compose.yaml:

yaml
services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:17-alpine
    environment:
      POSTGRES_DB: app
      POSTGRES_USER: app
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Define POSTGRES_PASSWORD en el archivo .env}
    volumes:
      - datos-postgres:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U app -d app"]
      interval: 5s
      timeout: 5s
      retries: 5

volumes:
  datos-postgres:

Los servicios de Compose comparten una red por defecto y pueden encontrarse usando sus nombres. Por ejemplo, desde otro servicio de esta configuración, el host de PostgreSQL sería db. El volumen datos-postgres conserva los datos de la base de datos aunque se recree el contenedor.

depends_on con service_healthy espera a que la comprobación de salud de la base de datos tenga éxito antes de iniciar web. Esto controla el orden de arranque, pero no configura Nginx para conectarse a PostgreSQL.

Configurar variables de entorno ​

En el mismo directorio, crea un archivo .env que no se debe subir al control de versiones:

dotenv
POSTGRES_PASSWORD=pon_aqui_una_clave_local

Añade .env a .gitignore. Usa secretos gestionados adecuadamente para producción; no guardes contraseñas reales en el archivo Compose ni en el repositorio.

Comandos habituales ​

Ejecuta estos comandos desde el directorio que contiene compose.yaml:

bash
docker compose up -d        # Crear e iniciar los servicios en segundo plano
docker compose ps           # Ver el estado de los servicios
docker compose logs -f      # Seguir los registros
docker compose logs -f db   # Seguir los registros de un servicio
docker compose exec db sh   # Abrir una consola en el servicio db
docker compose stop         # Detener los servicios sin eliminarlos
docker compose start        # Iniciar los servicios detenidos
docker compose down         # Detener y eliminar contenedores y red

Para reconstruir las imágenes definidas con build después de cambiar su código o Dockerfile:

bash
docker compose up -d --build

Imágenes propias ​

En lugar de usar una imagen publicada, un servicio puede construir su imagen desde un Dockerfile:

yaml
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3000:3000"

context indica los archivos disponibles durante la construcción y dockerfile permite especificar la ruta del Dockerfile relativa al contexto.

Persistencia y eliminación de datos ​

docker compose down elimina los contenedores y la red, pero conserva los volúmenes con nombre por defecto. Para borrar también los volúmenes del proyecto:

bash
docker compose down --volumes

Esta opción elimina los datos persistidos, por lo que debe usarse solo cuando realmente se quieran borrar. Para consultar la configuración que Compose ha resuelto, incluida la sustitución de variables:

bash
docker compose config