Docker en producción | Nicolás Garzón
Texto
Copiar image aprobada
+ configuración segura
+ capacidad
+ disponibilidad
+ observabilidad
+ recuperación
+ procedimientos
→ servicio operableEl contenedor es una unidad de empaquetado y ejecución. La confiabilidad pertenece al sistema completo.
SLO de disponibilidad y latencia;
RPO y RTO;
cantidad de usuarios/carga;
criticidad de datos;
ventanas de mantenimiento;
responsabilidades del equipo;
presupuesto de infraestructura;
amenazas y requisitos regulatorios.
Sin estos objetivos no puedes decidir si un host con Compose es suficiente o necesitas un orquestador/servicio administrado.
Producción debe ejecutar un digest aprobado:
Texto
Copiar registry.example.com/api@sha256:...
Git commit;
build ID;
SBOM;
provenance;
scan;
firma;
configuración de deployment;
digest anterior para rollback.
No construyas en el servidor. No edites archivos dentro del container para “parchar”.
La misma image recibe configuración externa:
environment no sensible;
secret files/manager;
certificates;
feature flags;
endpoints.
Valida al startup y falla cerrado. No uses defaults que desactiven auth o conecten a recursos equivocados.
Una instancia stateless puede recrearse sin perder negocio.
sesiones;
uploads;
colas;
database;
cache compartida;
configuración;
logs.
No todo debe externalizarse: /tmp y cache recreable pueden ser efímeros. La frontera debe ser consciente.
Databases, queues y storage requieren:
volumes/servicios durables;
backup;
restore;
replicación;
upgrades;
capacity;
consistencia.
Un restart policy no vuelve altamente disponible una database.
Puede ser razonable para:
proyecto personal;
carga pequeña;
presupuesto limitado;
downtime aceptable;
recovery manual documentado.
host estable y parcheado;
reverse proxy;
TLS;
firewall;
backups fuera del host;
monitoring externo;
automatización del deployment;
runbook de reconstrucción;
spare capacity.
Riesgo aceptado: la pérdida del host interrumpe todos los servicios hasta recuperar.
failover automático;
distribución entre nodos;
rolling updates coordinados;
rescheduling;
service discovery multi-host;
autoscaling;
políticas de placement;
necesitas un orquestador/scheduler o una plataforma equivalente.
Docker Engine por sí solo administra un host, no decide dónde reubicar un workload si ese host desaparece.
Texto
Copiar internet
→ load balancer/reverse proxy :443
→ API instances en network privada
TLS termination;
routing;
compression;
rate limiting;
health-based upstreams;
access logs;
redirects.
No expongas directamente databases, admin UIs o workers.
Texto
Copiar crear nueva instancia
→ startup
→ migrations compatibles
→ readiness correcta
→ añadir al tráfico
→ observar
→ retirar anterior con graceful shutdownUn process running no debe recibir tráfico antes de estar ready.
Al retirar una instancia:
deja de recibir tráfico;
drena requests;
deja de tomar jobs;
termina trabajo o lo reencola;
cierra pools;
sale antes del timeout.
Prueba con señales reales. Un kill -9 durante cada deploy genera errores y pérdida de jobs.
Detiene anterior y arranca nueva. Simple, con downtime.
Conviven versiones. Requiere compatibilidad de API/schema.
Mantiene dos entornos y cambia tráfico. Consume más recursos, facilita rollback.
Expone una fracción y compara señales.
Elige según riesgo y capacidad de observación.
Antes de desplegar define:
digest anterior;
comando/procedimiento;
criterio cuantitativo;
compatibilidad de configuración;
compatibilidad de schema;
límite de tiempo.
Un rollback de image no revierte migrations destructivas. Usa expand/contract y backups.
CPU;
memory;
PIDs;
disk;
IOPS;
network;
connections;
file descriptors.
Los límites protegen el host, pero también pueden causar throttling u OOM. Basa valores en carga y p95/p99.
deploys con versiones simultáneas;
recovery;
builds si existen;
crecimiento;
logging;
kernel/daemon.
Escalar réplicas ayuda solo si:
el servicio es stateless;
la database soporta conexiones adicionales;
el load balancer descubre instancias;
jobs son idempotentes;
métricas elegidas representan presión real.
CPU no siempre es la métrica adecuada. Queue depth, latency o concurrency pueden ser mejores.
YAML
Copiar user : "10001:10001"
read_only : true
cap_drop : [ ALL]
security_opt :
- no- new- privileges: true
mounts mínimos;
networks mínimas;
seccomp/MAC;
resource limits;
secrets de corto alcance;
images escaneadas;
daemon restringido.
No montes Docker socket en una app ordinaria.
kernel, Engine, containerd y runc parcheados;
SSH restringido;
firewall;
usuarios mínimos;
grupo docker controlado;
disk cifrado cuando corresponda;
logs/auditoría;
NTP;
backups de configuración;
separación entre workloads de distinta confianza.
Quien controla el daemon normalmente controla el host.
Puede reducir blast radius, pero verifica:
networking;
puertos;
cgroups;
storage;
startup tras reboot;
devices.
No adoptes un control sin probar el workload.
Producción debe usar una fuente protegida y auditable cuando el riesgo lo exige.
owner;
scope;
distribución;
rotación;
revocación;
expiración;
respuesta a filtración.
Un secret entregado a la app puede ser robado si la app es comprometida. Usa permisos mínimos en sistemas externos.
Texto
Copiar proxy → api
api → database
worker → queue + database
observability → collectorsNo una única network global.
DNS;
TLS interno;
egress;
firewall;
IPv6;
MTU/VPN;
source IP;
timeouts.
logs estructurados centralizados;
métricas de aplicación/host;
traces;
events;
dashboard de deployment;
alertas accionables.
Alertas útiles se basan en síntomas:
error rate;
latency;
saturation;
queue lag;
disk capacity;
backup failure;
certificate expiry.
Evita alertar por cada restart sin contexto o por CPU breve.
Un container healthy puede incumplir el SLO.
disponibilidad;
latencia;
integridad de jobs;
frescura de datos;
recovery.
Usa error budgets para equilibrar releases y estabilidad.
Configura rotación incluso con centralización. Monitorea:
/var/lib/docker o data root;
image layers;
build cache;
container logs;
volumes;
inodes.
Disk full puede derribar todo el host.
Para cada estado crítico:
frecuencia;
ubicación fuera del host;
cifrado;
retención;
permisos;
restore probado;
RPO/RTO.
Incluye configuración de proxy, Compose/IaC y secrets metadata sin copiar secretos inseguros.
provisionar host/plataforma;
instalar versión compatible;
restaurar configuración;
obtener digests;
restaurar datos;
configurar secrets;
iniciar dependencies;
validar;
cambiar DNS/tráfico;
observar.
Practícalo. Un documento no ejecutado puede estar incompleto.
kernel reboot;
Engine upgrade;
storage migration;
certificate rotation;
rollback.
En un solo host habrá mantenimiento o riesgo acumulado. Multi-host permite drenar nodos.
No dependas de comportamiento accidental. Valida:
Compose version;
cgroup version;
logging driver;
image store;
rootless;
network features.
Registra la plataforma en inventario.
Puede servir para single-host si:
el riesgo está aceptado;
deployment está automatizado;
datos se respaldan;
proxy/TLS existen;
host está monitorizado;
recuperación está documentada.
scheduling multi-host;
failover de nodo;
autoscaling completo;
rollout avanzado;
desired state distribuido.
service unhealthy;
OOM;
disk full;
certificate expiry;
database recovery;
registry unavailable;
failed deploy;
leaked secret;
lost host;
network outage.
Cada runbook debe incluir diagnóstico, mitigación, escalamiento y verificación.
impacto;
migrations;
capacidad;
seguridad;
rollback;
observación;
comunicación.
digest efectivo;
métricas;
logs;
incidents;
cleanup de versión anterior cuando la ventana termine.
Texto
Copiar Cloud VM
├── firewall 22 restringido, 80/443 públicos
├── Caddy/Nginx
├── API container por digest
├── worker por digest
├── PostgreSQL o servicio externo
├── volumes
├── metrics/log agent
└── backups externosAcepta que la VM es SPOF y define RTO para reconstruirla.
Texto
Copiar fase 1: Compose single-host
fase 2: database administrada + object storage
fase 3: varios app hosts detrás de load balancer
fase 4: scheduler/orquestador si la complejidad lo justificaNo adoptes Kubernetes solo por moda; adopta capacidades cuando el coste del riesgo/operación lo justifique.
Instancias actuales siguen, pero nuevos nodos/deploys fallan. Mantén retención/cache y plan.
Restart local no recupera conectividad.
Rolling requiere capacidad para versiones simultáneas.
Pools o procesos deben recargar/recrearse gradualmente.
Puede retirar todas las instancias durante outage ajeno.
La métrica correcta incluye pruebas de restore.
Producción es operación del sistema, no ejecución de un comando.
El digest y la configuración definen qué se ejecuta.
Stateless facilita reemplazo; stateful exige recuperación.
Un host único es un punto único de fallo.
Observabilidad, backup y rollback deben existir antes del incidente.
La plataforma adecuada depende del SLO y del coste operativo.
Comprueba lo aprendido
Diseña una arquitectura single-host con RTO de dos horas.
¿Qué cambia para lograr alta disponibilidad real?
Diseña un rollout con migration expand/contract.
¿Qué señales usarías para rollback automático?
Escribe un runbook para pérdida total del host.
Orquestación y límites de Compose , donde se define con precisión cuándo el modelo single-host deja de ser suficiente.