La mayoría de las aplicaciones reales no son un único contenedor. Son una combinación de servicios: un servidor web, una base de datos, un servidor de caché, quizá una cola de mensajes. Gestionar cada uno de esos contenedores manualmente con comandos individuales es ineficiente y propenso a errores.
Docker Compose resuelve exactamente ese problema. Define toda la infraestructura de la aplicación en un único archivo YAML y la levanta con un solo comando.
Es la herramienta que convierte Docker de una solución para contenedores individuales en una plataforma real de orquestación para el desarrollo y el despliegue de aplicaciones complejas.
Docker Compose V2 está incluido directamente en Docker Desktop desde 2022 y en las instalaciones modernas de Docker Engine en Linux. No requiere instalación separada. Si usas Docker, ya tienes Docker Compose.
Si todavía no tienes claro qué es Docker y cómo funciona la arquitectura de contenedores, el artículo sobre qué es Docker cubre los fundamentos antes de entrar en la orquestación multi-contenedor.
Qué es Docker Compose
Docker Compose es una herramienta que permite definir y ejecutar aplicaciones formadas por múltiples contenedores Docker. Su funcionamiento se basa en un archivo de configuración en formato YAML, habitualmente llamado docker-compose.yml, donde se describe toda la infraestructura que necesita la aplicación: los servicios, las redes internas entre ellos y los volúmenes de datos.
En lugar de ejecutar comandos individuales para crear redes, iniciar contenedores, configurar puertos y definir dependencias, Docker Compose hace todo eso automáticamente a partir del archivo de configuración. Un solo comando (docker compose up) levanta toda la pila de servicios correctamente configurada y conectada.
🔴 ¿Quieres entrar de lleno al mundo DevOps & Cloud Computing? 🔴
Descubre el DevOps & Cloud Computing Full Stack Bootcamp de KeepCoding. La formación más completa del mercado y con empleabilidad garantizada
👉 Prueba gratis el Bootcamp en DevOps & Cloud Computing por una semanaImagina una aplicación web típica con tres componentes: un servidor Node.js, una base de datos PostgreSQL y Redis para caché. Sin Docker Compose necesitarías arrancar tres contenedores con comandos separados, crear una red para que se comuniquen y asegurarte de que la base de datos arranca antes que la aplicación.
Con Docker Compose, todo eso está en el docker-compose.yml y se ejecuta con un solo comando.
Docker Compose V2: lo que ha cambiado

Docker Compose V2 sustituyó a la versión original (V1) en 2022 y es el estándar actual. Los cambios más importantes que conviene conocer:
- El comando cambia de
docker-composeadocker compose(sin guion). Docker Compose V2 es un plugin de Docker, no una herramienta separada. - La clave
version:está deprecada. Muchos tutoriales y artículos todavía incluyenversion: '3.8'al inicio del archivo. En Docker Compose V2 esa línea es ignorada y puede omitirse completamente. - Incluido en Docker Desktop. No requiere instalación adicional en Windows, macOS ni en las distribuciones Linux modernas que usan Docker Engine actualizado.
Cómo funciona el archivo docker-compose.yml
El archivo docker-compose.yml tiene una estructura jerárquica con tres secciones principales: services, volumes y networks. La sección de servicios es la más importante y la que define los contenedores de la aplicación.
Services: los contenedores de la aplicación
Cada servicio definido en la sección services corresponde a un contenedor. Para cada servicio se especifica la imagen a usar o el Dockerfile para construirla, los puertos expuestos, los volúmenes montados, las variables de entorno y cualquier otra configuración.
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: myapp
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Volumes: persistencia de datos
Los volúmenes en Docker Compose sirven para persistir datos fuera del ciclo de vida del contenedor. Hay dos tipos principales.
Los volúmenes nombrados (como postgres_data en el ejemplo) son gestionados por Docker y persisten aunque el contenedor se elimine. Son la forma correcta de persistir datos de bases de datos.
Los bind mounts montan un directorio del host dentro del contenedor. Se usan en desarrollo para que los cambios en el código se reflejen instantáneamente en el contenedor sin reconstruir la imagen:
services:
web:
build: .
volumes:
- .:/app # bind mount: código local → contenedor
- /app/node_modules # volumen anónimo: protege node_modules
Networks: comunicación entre servicios
Por defecto, Docker Compose crea automáticamente una red compartida para todos los servicios definidos en el mismo archivo. Los servicios se pueden comunicar entre sí usando el nombre del servicio como hostname.
En el ejemplo anterior, el servicio web puede conectarse a la base de datos usando el hostname db, que es el nombre del servicio en el archivo Compose. No hace falta conocer la IP del contenedor.
Para aplicaciones más complejas se pueden definir redes explícitas que aíslan grupos de servicios:
services:
frontend:
networks:
- public
backend:
networks:
- public
- private
db:
networks:
- private
networks:
public:
private:
depends_on: orden de arranque
depends_on define que un servicio no debe arrancar hasta que los servicios de los que depende estén en marcha. En el ejemplo, el servicio web espera a que db esté listo antes de arrancar.
En Docker Compose V2 se puede combinar con condition para esperar no solo a que el contenedor arranque sino a que el servicio dentro esté realmente disponible:
services:
web:
depends_on:
db:
condition: service_healthy
db:
image: postgres:16-alpine
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user"]
interval: 5s
timeout: 5s
retries: 5
Variables de entorno
Las variables de entorno se pueden definir directamente en el docker-compose.yml o referenciar desde un archivo .env:
# Opción 1: variables directas
services:
web:
environment:
- NODE_ENV=development
- PORT=3000
# Opción 2: desde archivo .env
services:
web:
env_file:
- .env
El archivo .env nunca debe subirse al repositorio. Se documenta con un archivo .env.example que sí va al repositorio con valores de ejemplo.
Ejemplo completo: aplicación Node.js con PostgreSQL y Redis
Este es un ejemplo real de un archivo docker-compose.yml para una aplicación Node.js con base de datos PostgreSQL y caché Redis:
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
- NODE_ENV=development
- DATABASE_URL=postgresql://user:password@db:5432/myapp
- REDIS_URL=redis://cache:6379
depends_on:
db:
condition: service_healthy
cache:
condition: service_started
volumes:
- .:/app
- /app/node_modules
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: myapp
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user"]
interval: 5s
retries: 5
cache:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
postgres_data:
Con este archivo, docker compose up levanta los tres servicios en el orden correcto, con la base de datos esperando a estar lista antes de que arranque la aplicación.
Comandos esenciales de Docker Compose
| Comando | Qué hace |
|---|---|
docker compose up |
Construye las imágenes (si es necesario) y arranca todos los servicios |
docker compose up -d |
Arranca los servicios en segundo plano (modo detached) |
docker compose up --build |
Fuerza la reconstrucción de las imágenes antes de arrancar |
docker compose down |
Detiene y elimina los contenedores y las redes creadas |
docker compose down -v |
Detiene contenedores y también elimina los volúmenes |
docker compose ps |
Lista el estado de los servicios definidos en el Compose |
docker compose logs |
Muestra los logs de todos los servicios |
docker compose logs -f servicio |
Sigue los logs en tiempo real de un servicio concreto |
docker compose exec servicio bash |
Abre una terminal dentro del contenedor del servicio |
docker compose build |
Construye o reconstruye las imágenes sin arrancar los servicios |
docker compose watch |
Activa la sincronización automática de código (Compose Watch, V2.22+) |
Docker Compose vs Kubernetes: cuándo usar cada uno

Es una pregunta frecuente cuando se empieza a trabajar con contenedores. La respuesta depende del contexto.
Ideal para desarrollo local, entornos de prueba y aplicaciones en un único host. Simple de configurar y mantener. No requiere infraestructura adicional. El estándar en equipos de desarrollo.
Diseñado para producción a escala en múltiples nodos. Auto-escalado, alta disponibilidad y despliegue en cloud. Mayor complejidad de configuración y operación. Necesario cuando la aplicación crece más allá de un solo servidor.
La estrategia habitual en equipos profesionales es usar Docker Compose en desarrollo y Kubernetes en producción. Los contenedores son los mismos en ambos entornos, lo que garantiza la paridad dev/prod.
Rubén trabajaba como ingeniero de aplicaciones cuando decidió dar el salto al ecosistema DevOps. Cada oferta interesante mencionaba Docker, Kubernetes y Terraform. Hizo el Bootcamp DevOps de KeepCoding para entender ese ecosistema desde dentro.
Hoy trabaja como SRE en Red Hat con Kubernetes y Jenkins en producción. Docker Compose fue su punto de entrada al mundo de la orquestación de contenedores, y el conocimiento que adquirió en desarrollo le resultó directamente aplicable en producción.
Cómo aprender Docker Compose de forma profesional
Docker Compose es una herramienta que se aprende rápido en los conceptos básicos. En pocas horas se puede tener un entorno multi-contenedor funcionando.
Lo que más tarda en desarrollarse es el criterio para diseñar archivos Compose que escalen bien: saber cuándo usar volúmenes nombrados y cuándo bind mounts, cómo estructurar las redes para aplicaciones con múltiples capas y cómo integrar Docker Compose en pipelines CI/CD reales.
Para ver Docker Compose en un caso de uso real con FastAPI, el artículo sobre FastAPI con Docker Compose muestra el flujo completo de una aplicación Python desplegada con Compose.
Y para la configuración de entornos de desarrollo completos con hot reload y debugging, el artículo sobre cómo usar Docker para entornos de desarrollo cubre el caso de uso más habitual.
Para aprender Docker Compose con proyectos reales y profesores en activo, el DevOps y Cloud Computing Full Stack Bootcamp de KeepCoding cubre el recorrido completo en 6 meses.
Conclusión

Docker Compose transforma Docker de una herramienta para contenedores individuales en una plataforma real para gestionar aplicaciones complejas. Su valor está en la simplicidad: toda la infraestructura en un archivo YAML, toda la aplicación levantada con un solo comando. DevOps y Cloud Computing Full Stack Bootcamp de KeepCoding.
Es el estándar en entornos de desarrollo profesionales y la puerta de entrada natural a la orquestación de contenedores antes de dar el salto a Kubernetes en producción.
Aprender Docker Compose bien es aprender a pensar en términos de servicios, dependencias y redes, que es exactamente el modelo mental que se necesita para trabajar con infraestructura cloud moderna.
La referencia oficial más completa sobre Docker Compose, incluyendo todas las claves del archivo YAML y los comandos disponibles, está en docs.docker.com/compose/.



