Docker y Kubernetes: guía de contenedores
Containerización, orquestación y cuándo usar cada enfoque en tu infraestructura
Los contenedores han revolucionado cómo se despliega y ejecuta software. Docker empaqueta una aplicación con todas sus dependencias en una unidad portable que funciona igual en cualquier entorno: desarrollo, staging, producción, cloud o local. Kubernetes orquesta miles de contenedores en producción, gestionando escalado, networking y disponibilidad.
Esta guía explica los conceptos fundamentales de containerización, cómo Docker y Kubernetes se complementan, cuándo Kubernetes es necesario y cuándo es excesivo, y cómo se comparan con serverless.
¿Qué son los contenedores?
Un contenedor es un paquete ligero y portable que incluye una aplicación y todo lo necesario para ejecutarla: código, runtime, bibliotecas del sistema y configuración. A diferencia de las máquinas virtuales, los contenedores comparten el kernel del sistema operativo host, lo que los hace mucho más ligeros (MBs vs GBs) y rápidos de iniciar (segundos vs minutos).
La containerización resuelve el problema de "en mi máquina funciona": si el contenedor funciona en desarrollo, funcionará en producción. Esto elimina discrepancias entre entornos causadas por versiones diferentes de dependencias, configuraciones del SO o variables de entorno.
- Portabilidad: el mismo contenedor funciona en cualquier máquina con Docker instalado
- Aislamiento: cada contenedor tiene su propio filesystem, red y procesos
- Ligereza: comparten el kernel del host, sin la sobrecarga de una VM completa
- Reproducibilidad: el Dockerfile define exactamente cómo se construye el entorno
Docker: containerización en la práctica
Docker es la plataforma de containerización más popular. Un Dockerfile define paso a paso cómo se construye la imagen del contenedor: imagen base (ubuntu, node, python), instalación de dependencias, copia de código y comando de inicio. La imagen resultante se almacena en un registry (Docker Hub, GitHub Container Registry, AWS ECR) y se despliega en cualquier máquina.
Docker Compose permite definir aplicaciones multi-contenedor (web + base de datos + cache) en un archivo YAML, levantando todo el stack con un comando. Para desarrollo local es una herramienta fundamental: cada miembro del equipo levanta el mismo entorno en segundos.
- Dockerfile: define la imagen paso a paso (base, deps, código, CMD)
- Docker Compose: orquestación local de múltiples contenedores
- Registries: Docker Hub, GitHub Container Registry, AWS ECR, GCP Artifact Registry
- Multi-stage builds: imágenes de producción más pequeñas y seguras
Kubernetes: orquestación a escala
Kubernetes (K8s) es un orquestador de contenedores creado por Google que automatiza el despliegue, escalado y gestión de aplicaciones containerizadas. Cuando tienes decenas o cientos de contenedores que necesitan comunicarse entre sí, escalar según la demanda, reiniciarse automáticamente cuando fallan y distribuirse entre múltiples servidores, Kubernetes gestiona toda esa complejidad.
Los conceptos clave son: Pod (la unidad mínima, uno o más contenedores), Deployment (define cuántas réplicas de un Pod ejecutar), Service (expone Pods como un servicio de red) y Ingress (gestiona tráfico HTTP externo). Kubernetes ejecuta en cualquier cloud (EKS en AWS, GKE en GCP, AKS en Azure) o on-premise.
- Pod: unidad mínima de despliegue (uno o más contenedores)
- Deployment: gestiona réplicas, rolling updates y rollbacks
- Service: expone Pods internamente o externamente con load balancing
- Ingress: enrutamiento HTTP/HTTPS con TLS y reglas de path
- Helm: gestión de paquetes para Kubernetes (charts)
¿Cuándo necesitas Kubernetes?
Kubernetes añade complejidad operativa significativa: un cluster necesita monitorización, actualizaciones de versiones, gestión de networking, configuración de seguridad y un equipo con conocimientos específicos. Para un equipo pequeño con pocos servicios, Kubernetes puede ser excesivo.
Kubernetes tiene sentido cuando: tienes más de 5-10 servicios que necesitan comunicarse, necesitas escalado automático por servicio, requieres despliegues sin downtime (rolling updates, canary), o tu equipo ya tiene experiencia con K8s. Para casos más sencillos, Docker Compose en un servidor o plataformas PaaS (Railway, Render) son alternativas más manejables.
- Sí K8s: >5-10 microservicios, escalado independiente, equipo con experiencia
- No K8s: <5 servicios, equipo pequeño, presupuesto limitado para ops
- Alternativas: Docker Compose + servidor, Railway, Render, Fly.io, ECS Fargate
Contenedores vs serverless
Contenedores y serverless no son mutuamente excluyentes; resuelven problemas en diferentes puntos del espectro de control vs abstracción. Los contenedores dan control total sobre el entorno de ejecución, sin límites de tiempo ni cold starts, con portabilidad entre proveedores. Serverless elimina toda la gestión de infraestructura pero con restricciones en ejecución y menos portabilidad.
La tendencia es la convergencia: AWS Fargate ejecuta contenedores sin gestionar servidores (serverless containers), Cloud Run de GCP ejecuta contenedores Docker de forma serverless, y Fly.io ofrece un modelo similar. Estos servicios combinan la portabilidad del contenedor con la simplicidad operativa del serverless.
- Contenedores: control total, sin límites de tiempo, portables, pero requieren gestión
- Serverless: cero gestión, pero con cold starts, límites y menos portabilidad
- Serverless containers: Fargate, Cloud Run, Fly.io — lo mejor de ambos
Buenas prácticas de containerización
Usa imágenes base oficiales y mínimas (Alpine, Distroless) para reducir la superficie de ataque y el tamaño de la imagen. Implementa multi-stage builds para separar dependencias de build y de runtime. No ejecutes procesos como root dentro del contenedor: crea un usuario no privilegiado.
Haz las imágenes inmutables: no modifiques un contenedor en ejecución, despliega una nueva versión. Escanea las imágenes en busca de vulnerabilidades (Trivy, Snyk) antes de desplegarlas. Y mantén los Dockerfiles simples y documentados: un Dockerfile bien escrito es documentación ejecutable de tu entorno.
- Imágenes base mínimas: Alpine, Distroless, imágenes oficiales slim
- Multi-stage builds: separar build de runtime para imágenes más pequeñas
- No root: ejecutar procesos con usuario no privilegiado
- Escaneo de vulnerabilidades: Trivy, Snyk, Docker Scout
- Una preocupación por contenedor: no empaquetar múltiples procesos
Puntos clave
- Los contenedores empaquetan aplicaciones con sus dependencias para portabilidad total
- Docker es la herramienta estándar para crear y gestionar contenedores
- Kubernetes orquesta contenedores a escala pero añade complejidad operativa significativa
- Serverless containers (Fargate, Cloud Run) combinan portabilidad y simplicidad operativa
- Usa imágenes mínimas, multi-stage builds y escaneo de vulnerabilidades como buenas prácticas
¿Necesitas containerizar o orquestar tus aplicaciones?
Te ayudamos a diseñar la estrategia de containerización adecuada para tu escala, equipo y presupuesto.