Docker Compose: fundamentos | Nicolás Garzón
proyecto declarativo
Texto
Copiar compose.yaml
→ modelo de aplicación
→ resources del proyecto
→ containers + networks + volumesSu valor no está solo en ahorrar comandos. Convierte configuración de runtime en un archivo versionable, revisable y repetible.
Una aplicación real puede requerir:
API;
database;
Redis;
worker;
reverse proxy;
volumes;
variables;
healthchecks;
networks.
Con docker run, la configuración queda repartida en comandos largos, documentación y memoria del operador. Compose centraliza el modelo.
YAML
Copiar services :
api :
build :
context : .
target : development
command : npm run dev
environment :
DATABASE_URL : postgres: //app: app@db: 5432/app
ports :
- "127.0.0.1:3000:3000"
depends_on :
db :
condition : service_healthy
networks : [ backend, data]
db :
image : postgres: 17
environment :
POSTGRES_USER : app
POSTGRES_PASSWORD : app
POSTGRES_DB : app
volumes :
- db- data: /var/lib/postgresql/data
healthcheck :
test : [ "CMD-SHELL" , "pg_isready -U app -d app" ]
interval : 5s
timeout : 3s
retries : 10
networks : [ data]
volumes :
db-data :
networks :
backend :
data :
internal : true
cómo construir API;
qué imagen usa PostgreSQL;
DNS interno db;
persistencia;
health;
puerto local;
aislamiento de red.
Un service no es exactamente un container concreto. Describe una unidad de ejecución que Compose puede crear o recrear.
Texto
Copiar service api
→ image/build
→ command
→ environment
→ mounts
→ networks
→ health
→ container generadoEl container puede cambiar de ID al recrearse mientras el service name continúa como identidad lógica y DNS.
Compose agrupa recursos bajo un project name.
Bash
Copiar docker compose --project-name wiki up -d Puede generar recursos conceptuales:
Texto
Copiar wiki-api-1
wiki-db-1
wiki_backend
wiki_db-dataEl nombre puede derivarse del directorio, archivo, variable u opción. Cambiarlo puede crear otro conjunto de resources y hacer parecer que volumes o datos desaparecieron.
Bash
Copiar docker compose ls
docker compose config --quiet
docker compose ps Bash
Copiar docker compose upResuelve configuración, crea resources faltantes, inicia services y muestra logs attached.
Bash
Copiar docker compose up -d Bash
Copiar docker compose ps --all Muestra estado de containers del proyecto.
Bash
Copiar docker compose logs -f --tail 200 apiBash
Copiar docker compose exec api sh Ejecuta un proceso en un container running. Puede fallar si la image no tiene shell.
Bash
Copiar docker compose run --rm api npm run migrateCrea un container one-off basado en el service. No siempre publica ports del service por defecto y puede tener diferencias de dependencies. Revisa flags y modelo exacto.
Detienen/inician las mismas instancias.
Reinicia containers, pero no aplica necesariamente cambios de configuración o image.
Bash
Copiar docker compose downElimina containers y networks del proyecto. Named volumes se conservan normalmente.
Bash
Copiar docker compose down -v También elimina volumes del proyecto. Es una operación destructiva.
Cambiar environment, image, mounts o command requiere recrear.
Bash
Copiar docker compose up -d Compose compara configuración y puede reemplazar containers afectados.
docker compose restart usa la configuración ya creada. No es la forma de aplicar un archivo nuevo.
YAML
Copiar services :
api :
image : registry.example.com/api@sha256: ... YAML
Copiar services :
api :
build :
context : .
dockerfile : Dockerfile
target : developmentEn producción, construye en CI, publica y despliega un digest. Construir directamente en cada host reduce trazabilidad.
Compose combina interpolación, defaults y varios archivos. Inspecciona antes de ejecutar:
Bash
Copiar docker compose config
variables ausentes;
paths incorrectos;
merge inesperado;
puertos públicos;
nombres;
configuración duplicada.
No publiques la salida sin revisar secretos.
YAML
Copiar services :
api :
image : "${API_IMAGE:?API_IMAGE is required}"
environment :
LOG_LEVEL : "${LOG_LEVEL:-info}" Distingue interpolación del archivo Compose de variables enviadas al container. Un .env usado por Compose no se inyecta automáticamente completo en un service salvo que se declare.
Ejecutar up varias veces intenta converger al modelo. Pero Compose no administra lógica de negocio:
migrations;
seed;
backup;
rotación de secrets;
compatibilidad de schemas;
failover de database.
Esas tareas deben modelarse como jobs o procedimientos explícitos.
depends_on puede ordenar creación y esperar health en condiciones compatibles. No garantiza que una dependencia permanezca disponible después.
La aplicación debe reconectar y tolerar reinicios.
Bash
Copiar docker compose up -d --scale worker = 3 Funciona para services compatibles. Limitaciones:
container_name impide escalado normal;
host ports fijos chocan;
stateful services requieren coordinación;
no distribuye automáticamente entre hosts;
no reemplaza un orquestador.
Compose permite servicios opcionales y archivos adicionales. Evita duplicar archivos completos por ambiente; mantén una base y overrides pequeños, revisando siempre el resultado final.
Compose es excelente para:
desarrollo local;
integration tests;
demos;
CI;
single-host controlado.
Puede usarse en producción pequeña, pero debes aceptar y operar:
punto único de fallo del host;
despliegues;
backup;
proxy/TLS;
logging;
seguridad;
recovery.
Compose no convierte un host en cluster.
Bash
Copiar docker compose config --quiet
docker compose build
docker compose up -d --wait
docker compose ps
docker compose logs --tail 100
docker compose run --rm api npm test
docker compose downPara tests que deben empezar limpios:
Bash
Copiar docker compose down -v solo en un proyecto efímero donde eliminar datos sea intencional.
Añade labels del proyecto automáticamente. Utiliza:
Bash
Copiar docker compose events
docker compose top
docker compose images
docker compose statsLa disponibilidad exacta depende de la versión. Centraliza logs y métricas para workloads duraderos.
Se crean otros volumes y networks.
Usaste restart en lugar de up/recreate.
Elimina datos persistentes.
El healthcheck puede ser superficial o la dependencia puede caer después.
Otra copia del proyecto usa el mismo host port.
Se resuelven según contexto del proyecto y host del daemon.
Crea colisiones globales y limita escalado. Usa service names.
Los archivos divergen. Usa base + overrides/profiles y valida config.
Versionas credenciales. Usa secret mounts o gestión externa.
Solo ayuda al arranque. Implementa retries.
Puede generar carreras. Usa job coordinado.
Compose modela una aplicación, no solo containers sueltos.
El project name controla identidad de resources.
up converge/recrea; restart no aplica nueva configuración.
down -v elimina volumes.
docker compose config muestra el resultado efectivo.
Compose no proporciona HA multi-host.
Comprueba lo aprendido
¿Qué diferencia hay entre service y container?
¿Por qué cambiar project name puede hacer parecer que se perdieron datos?
¿Cuándo usarías run --rm en lugar de exec?
¿Qué no garantiza depends_on?
Diseña un workflow seguro de desarrollo y limpieza.
Services, networks y volumes en Compose , donde se modelan ownership, aislamiento y lifecycle de cada resource.