“¿Usamos Kubernetes o Docker Compose?” es una de las preguntas más frecuentes cuando un equipo decide containerizar su aplicación. La respuesta incorrecta en cualquier dirección tiene consecuencias reales: Kubernetes en una app pequeña añade complejidad innecesaria que ralentiza al equipo; Docker Compose en una app grande crea cuellos de botella que frenan el crecimiento. Esta guía da criterios concretos para decidir.
Qué resuelve cada uno
Docker Compose
Docker Compose es una herramienta para definir y ejecutar aplicaciones multi-contenedor en un solo host. Ideal para desarrollo local y, con algunas consideraciones, para producción en proyectos de tamaño pequeño-medio.
# docker-compose.yml — define toda la app en un archivo
services:
api:
image: mi-empresa/api:latest
ports:
- "8080:8080"
environment:
SPRING_PROFILES_ACTIVE: prod
depends_on:
postgres:
condition: service_healthy
restart: unless-stopped
postgres:
image: postgres:16-alpine
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
redis:
image: redis:7-alpine
command: redis-server --maxmemory 256mb
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./certs:/etc/nginx/certs:ro
volumes:
pgdata:
Ventajas:
- Configuración simple en un solo archivo YAML
- Curva de aprendizaje mínima
- Perfecto para desarrollo local (replica el stack completo)
- Operaciones básicas:
docker compose up -d,docker compose logs,docker compose down
Limitaciones:
- Corre en un solo servidor — sin distribución de carga entre máquinas
- Escalado manual y limitado
- Sin self-healing automático si un contenedor muere y no arranca
- Sin rolling updates nativas (hay downtime en cada deploy)
Kubernetes (K8s)
Kubernetes es un orquestador de contenedores diseñado para gestionar workloads distribuidos a escala. Abstrae la infraestructura subyacente y gestiona automáticamente el scheduling, escalado, self-healing y actualizaciones sin downtime.
# deployment.yaml — Kubernetes gestiona cuántas réplicas y en qué nodo
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
spec:
replicas: 3
selector:
matchLabels:
app: api
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0 # Zero-downtime deploy
template:
metadata:
labels:
app: api
spec:
containers:
- name: api
image: mi-empresa/api:v1.2.3
ports:
- containerPort: 8080
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "1000m"
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 20
periodSeconds: 5
Ventajas:
- Escala horizontal automáticamente (HPA — Horizontal Pod Autoscaler)
- Self-healing: reinicia pods fallidos, redistribuye en nodos sanos
- Rolling updates y rollbacks sin downtime
- Distribuye carga entre múltiples nodos/máquinas
- Ecosistema maduro: Helm, ArgoCD, Prometheus, Grafana
Limitaciones:
- Curva de aprendizaje significativa (semanas/meses)
- Overhead operativo considerable para equipos pequeños
- Coste mínimo razonable: cluster gestionado (EKS, GKE, AKS) sale desde ~150€/mes
- YAML verboso — cada recurso necesita su manifiesto
El criterio de decisión real
Usa Docker Compose si…
Tu app corre en un solo servidor y eso es suficiente
Si tu aplicación sirve a cientos o pocos miles de usuarios, un servidor dedicado de 8-16 vCPU y 32-64GB RAM con Docker Compose es más que suficiente y mucho más simple de operar.
# Stack completo levantado en 30 segundos
docker compose -f docker-compose.prod.yml up -d
# Deploy de nueva versión (con mínimo downtime)
docker compose pull api
docker compose up -d --no-deps api
El equipo es pequeño (1-5 personas)
Kubernetes tiene un coste operativo real en tiempo de aprendizaje y mantenimiento. Para un equipo pequeño, ese tiempo sale mejor invertido en producto.
El presupuesto de infraestructura es ajustado
Un VPS o servidor dedicado con Docker Compose: 50€-200€/mes. Un cluster Kubernetes gestionado (3 nodos mínimo recomendable): 300€-600€/mes en los principales proveedores cloud.
Tienes un MVP o producto en etapa temprana
La prioridad es iterar rápido. Kubernetes añade fricción en el ciclo de desarrollo. Migra cuando el problema de escala sea real, no hipotético.
Usa Kubernetes si…
Necesitas alta disponibilidad real (multi-nodo)
Si tu SLA requiere 99,9%+ de disponibilidad, necesitas distribuir la carga entre múltiples nodos para sobrevivir al fallo de uno.
# HPA — escala automáticamente según CPU
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: api-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: api
minReplicas: 2
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
Tu tráfico es muy variable
Picos de Black Friday, campañas de marketing, eventos en directo — Kubernetes escala en minutos en respuesta al tráfico real.
Tienes múltiples microservicios
Con 5+ servicios independientes, la complejidad de Compose en producción se vuelve difícil de gestionar. Kubernetes con Helm charts da estructura y reutilización.
# Helm — despliega tu app con todas sus dependencias
helm install mi-app ./helm/mi-app \
--set image.tag=v1.2.3 \
--set replicas=3 \
--namespace produccion
El equipo tiene experiencia en DevOps/SRE
Si ya tienes personas con experiencia en K8s, el coste de adopción baja significativamente y los beneficios se materializan antes.
Una tercera opción: Docker Swarm
A menudo olvidado, Docker Swarm es el orquestador nativo de Docker. Ofrece clustering multi-nodo con una sintaxis muy similar a Compose, sin la complejidad de Kubernetes.
# Inicializar Swarm
docker swarm init --advertise-addr <IP-MANAGER>
# Añadir worker
docker swarm join --token <TOKEN> <IP-MANAGER>:2377
# Desplegar stack
docker stack deploy -c docker-compose.prod.yml mi-app
# Escalar un servicio
docker service scale mi-app_api=3
Cuándo tiene sentido: si necesitas clustering multi-nodo pero no quieres la complejidad de Kubernetes. Ideal para equipos que ya conocen Docker Compose y quieren un paso intermedio.
Limitaciones: ecosistema mucho más pequeño que Kubernetes, menos opciones de monitorización y GitOps.
Comparativa resumida
| Criterio | Docker Compose | Docker Swarm | Kubernetes |
|---|---|---|---|
| Curva de aprendizaje | Baja | Media | Alta |
| Multi-nodo | No | Sí | Sí |
| Auto-scaling | No | Básico | Avanzado (HPA) |
| Self-healing | Básico | Sí | Sí |
| Rolling updates | Manual | Sí | Sí |
| Coste operativo | Bajo | Medio | Alto |
| Coste infraestructura | Bajo | Medio | Medio-Alto |
| Ecosistema | Amplio | Limitado | Muy amplio |
| Recomendado para | <50K usuarios, 1 servidor | 50K-200K usuarios | >200K usuarios o múltiples servicios |
El camino habitual de evolución
La mayoría de proyectos exitosos siguen este camino:
MVP / Lanzamiento
└── Docker Compose en 1 servidor
│ (cuando el servidor empieza a saturarse)
▼
Docker Compose en servidor más grande
o Docker Swarm (2-3 nodos)
│ (cuando necesitas escala real o multi-servicio)
▼
Kubernetes (EKS / GKE / AKS)
El error más común es saltar directamente al final. Kubernetes antes de tener el problema que resuelve es complejidad accidental que ralentiza al equipo sin beneficio real.
Conclusión
La regla práctica es sencilla: empieza con Docker Compose, migra a Kubernetes cuando el problema de escala sea real. El 80% de las aplicaciones de negocio nunca necesitarán Kubernetes. El 20% que sí lo necesita llegará al punto donde la necesidad es evidente.
Si estás diseñando la infraestructura de tu proyecto y quieres una recomendación basada en tu caso concreto de carga y equipo, cuéntanos.