Última lección. Toca levantar la vista del proyecto y mirar hacia delante: qué tendencias del ecosistema tienen sustancia y cuáles son todavía apuesta, qué no va a cambiar —y por eso es donde conviene invertir el aprendizaje— y qué has llegado a construir en estas 47 lecciones. Al final encontrarás una autoevaluación honesta, recomendaciones para seguir y cuatro proyectos concretos para consolidar lo aprendido.
Contenido
- Dónde está Docker hoy
- Cómo leer una tendencia
- Rootless y aislamiento reforzado como norma
- WebAssembly en el ecosistema de contenedores
- La cadena de suministro como requisito regulatorio
- Builds más rápidos y reproducibles
- Contenedores en el borde y en dispositivos
- Cargas de trabajo de IA
- Plataformas internas de desarrollo
- Resumen de madurez
- Lo que no va a cambiar
- El camino de Aurora Libros
- Autoevaluación
- Cómo seguir aprendiendo
- Cuatro proyectos para consolidar
- Dónde está Docker hoy
En 2013 Docker era los contenedores. En 2026 es una implementación excelente de un estándar abierto que él mismo creó y donó. Esa frase suena a declive y no lo es: es la definición de éxito de una tecnología de infraestructura.
| Lo que Docker inventó o popularizó | Dónde está hoy |
|---|---|
| El formato de imagen en capas | OCI Image Spec, universal |
runc |
Donado a la OCI; base de casi todo |
| containerd | Proyecto graduado de la CNCF; lo usa Kubernetes |
| La experiencia de la CLI | Copiada por Podman, nerdctl, finch |
| El registro y su protocolo | OCI Distribution Spec |
| El Dockerfile | Formato de facto, incluso fuera de Docker |
| Compose | Especificación abierta que implementan terceros |
graph LR
D2013["Docker 2013<br/>«los contenedores»"] --> OCI["OCI 2015<br/>image + runtime spec"]
D2013 --> CNCF["containerd → CNCF 2017"]
OCI --> HOY["2026: estándar abierto"]
CNCF --> HOY
HOY --> R1["Docker: experiencia<br/>de desarrollo"]
HOY --> R2["containerd/CRI-O:<br/>producción"]
HOY --> R3["Podman: sin daemon,<br/>rootless"]
HOY --> R4["Tus imágenes:<br/>funcionan en todos"]
Lo que sigue siendo suyo y sigue mandando: la experiencia de desarrollo. Docker Desktop, docker compose, BuildKit y Buildx, Scout y la documentación son el camino más corto entre una idea y un contenedor funcionando, y por eso siguen siendo el punto de entrada de casi todo el mundo. La estrategia de la empresa se movió del centro de datos —donde ganó Kubernetes— al portátil del desarrollador y a la cadena de suministro, y ahí es fuerte.
Que el estándar sea abierto es la mejor noticia para ti: lo que has aprendido no caduca con un producto.
- Cómo leer una tendencia
Antes de la lista, un filtro. Para cada tendencia, tres preguntas: ¿qué problema real resuelve?, ¿qué madurez tiene de verdad?, y ¿me afecta a mí ahora o dentro de cinco años? Se lee así:
| Madurez | Qué significa | Qué hacer |
|---|---|---|
| En producción | Empresas serias lo usan hoy con éxito | Aprenderlo si te toca |
| Adoptable | Funciona, hay casos reales, faltan asperezas | Probar en un proyecto acotado |
| Prometedor | Técnicamente sólido, ecosistema inmaduro | Seguirlo, no apostarlo |
| Apuesta | Podría cambiarlo todo o no llegar a nada | Curiosidad, nunca producción |
Voy a etiquetar cada tendencia con honestidad, incluidas las que están de moda.
- Rootless y aislamiento reforzado como norma
Madurez: en producción. El modo rootless de Docker (05-03), el de Podman por defecto (07-05) y los SecurityContext obligatorios en Kubernetes van todos en la misma dirección: root dentro del contenedor deja de ser aceptable por defecto.
| Antes | Ahora |
|---|---|
| Contenedor como root, y nadie preguntaba | runAsNonRoot: true como política de admisión |
--privileged para salir del paso |
Capabilities concretas, justificadas por escrito |
| Sistema de ficheros escribible | readOnlyRootFilesystem + emptyDir para lo temporal |
| Seguridad revisada al final | Escaneo y políticas en el pipeline |
Lo que viene: políticas de admisión que rechazan el despliegue si el manifiesto no cumple —Kyverno, OPA Gatekeeper, Pod Security Admission—, y aislamiento reforzado (gVisor, Kata) donde se ejecuta código de terceros. Aurora Libros ya cumple: corre sin privilegios, con read_only, cap_drop: [ALL] y no-new-privileges. Eso que hiciste en el módulo 5 por buenas prácticas será en pocos años un requisito de admisión.
- WebAssembly en el ecosistema de contenedores
Madurez: prometedor, con nichos ya en producción. Wasm es un formato de bytecode portable con un modelo de seguridad de caja de arena. Con WASI puede hacer entrada/salida, y con runwasi se ejecuta como un contenedor más desde containerd.
| Dimensión | Contenedor Linux | Módulo Wasm |
|---|---|---|
| Tamaño típico | 50-200 MB | 1-10 MB |
| Arranque en frío | 200-800 ms | 1-10 ms |
| Aislamiento | Namespaces del kernel | Caja de arena del runtime |
| Portabilidad | Por arquitectura y SO | Un binario para todo |
| Acceso al sistema | Completo | Solo lo concedido por WASI |
| Ecosistema | Inmenso y maduro | Joven, en construcción |
| Lenguajes | Todos | Rust, Go, C/C++, .NET; JS y Python con matices |
Dónde encaja hoy: funciones sin servidor con arranques en frío inaceptables, plugins ejecutando código de clientes, extensiones de proxies y mallas, y dispositivos con recursos escasos.
Qué no sustituye, y conviene decirlo claro: PostgreSQL no se va a ejecutar en Wasm, ni tu API con node_modules completo y acceso libre al sistema de ficheros. Wasm no viene a reemplazar contenedores; viene a ocupar el hueco donde un contenedor es demasiado pesado. Para aurora-api hoy, la respuesta es no. Merece la pena seguirlo, no reescribir nada por él.
- La cadena de suministro como requisito regulatorio
Madurez: en producción, y avanzando hacia obligatorio. Es la tendencia con más impacto práctico a corto plazo, y ya la has implementado sin saber que ibas por delante.
| Pieza | Qué demuestra | Dónde la tienes |
|---|---|---|
| SBOM | Qué contiene exactamente la imagen | Publicado junto a aurora-api:2.0.0 (05-03) |
| Firma (Cosign) | Quién construyó esa imagen | Firmada en el pipeline (06-02) |
| Attestation de procedencia | Con qué código, en qué build, con qué pasos | Generada por GitHub Actions |
| Digests, no etiquetas | Que se despliega exactamente lo revisado | compose.prod.yaml y los manifiestos |
| Escaneo con puerta | Que nada vulnerable llega a producción | Trivy fallando el build |
| Política de admisión | Que el clúster rechaza lo no firmado | El siguiente paso natural |
El empuje ya no es solo técnico. En Estados Unidos hay requisitos de SBOM para proveedores de la administración desde 2021, y en Europa el Cyber Resilience Act impone obligaciones de seguridad y de transparencia sobre componentes a los productos con elementos digitales, con plazos que se cierran en la segunda mitad de esta década. Si tu software se vende a empresas europeas, esto va a llegar a tus contratos en forma de cuestionario.
Advertencia importante: el alcance concreto, los plazos y qué productos quedan cubiertos son cuestiones jurídicas que cambian, y esto no es asesoramiento legal. Si tu producto puede estar afectado, consúltalo con el departamento legal o de cumplimiento de tu organización y no lo deduzcas de un curso técnico. Lo que sí te puedo decir es lo práctico: la parte técnica ya sabes hacerla, y llegar con SBOM, firma y procedencia ya montados convierte una auditoría en un trámite.
- Builds más rápidos y reproducibles
Madurez: en producción. El build dejó de ser «esperar» para convertirse en un problema de ingeniería, y BuildKit (05-05) es el motor de casi todo lo que viene.
| Tendencia | Qué aporta | Estado |
|---|---|---|
| Caché remota compartida | El primer build de un compañero ya está caliente | Producción (tu pipeline: 41 s) |
| Builders remotos | Construir arm64 en hardware arm64, sin QEMU | Producción |
| Imágenes deterministas | Mismo commit → mismo digest, bit a bit | Adoptable (Nix, SOURCE_DATE_EPOCH, Bazel) |
| Sin Dockerfile | Buildpacks, ko, Jib, Nixpacks (07-04) |
Producción en su nicho |
| Bases mínimas | Distroless, Chainguard, Wolfi: casi cero CVE | Adoptable, creciendo rápido |
| Lazy pulling | Arrancar sin bajar la imagen entera (stargz) |
Prometedor |
Dos merecen atención. Las imágenes deterministas llevan la reproducibilidad al extremo: hoy tu build es reproducible en contenido pero los timestamps hacen que el digest varíe; con marcas de tiempo fijadas, dos builds del mismo commit producen el mismo digest, y eso hace la procedencia verificable por terceros sin confiar en nadie. Y las bases mínimas tipo Wolfi o Chainguard: distribuciones diseñadas para contenedores, con parches muy rápidos y objetivo de cero CVE conocidos, que resuelven el goteo de vulnerabilidades heredadas de la imagen base. Es el sucesor natural de tu node:22-alpine fijado por digest.
- Contenedores en el borde y en dispositivos
Madurez: en producción en su nicho. Llevar contenedores a fábricas, tiendas, vehículos o antenas, donde no hay centro de datos ni administrador.
| Necesidad del borde | Respuesta |
|---|---|
| Poca CPU y RAM | k3s, MicroK8s, o Compose a secas |
| Red intermitente | Operación autónoma y sincronización diferida |
| Sin nadie que administre | GitOps y actualizaciones automáticas |
| Arquitecturas mixtas | Multiarquitectura (lo tuyo de 05-05) |
| Imágenes pesadas por mala red | Bases mínimas, lazy pulling |
| Seguridad física dudosa | Arranque verificado, imágenes firmadas |
Si Aurora Libros abriera veinte librerías físicas con un terminal de consulta del catálogo en cada una, este sería su terreno: la misma imagen multiarquitectura, un k3s por tienda o simplemente Compose, y despliegue por GitOps. Ninguna pieza nueva que aprender.
Lo interesante del borde es que invierte las prioridades que has manejado todo el curso. En el centro de datos, el ancho de banda es barato y una imagen de 300 MB no molesta a nadie; en una tienda con una conexión compartida, cada megabyte de la imagen se paga en minutos de actualización multiplicados por veinte sedes. Ahí el trabajo de 05-04 —bajar de 142 a 102 MB— deja de ser una elegancia y se convierte en la diferencia entre actualizar la flota en una noche o en un fin de semana.
- Cargas de trabajo de IA
Madurez: en producción, con problemas sin resolver. Es hoy el mayor motor de cambio en el ecosistema, y donde más duelen las limitaciones del modelo actual.
| Problema | Realidad | Hacia dónde va |
|---|---|---|
| Tamaño de imagen | Imágenes de 5-20 GB con CUDA y librerías | Bases mínimas, lazy pulling, capas compartidas |
| Arranque en frío | Minutos hasta servir la primera petición | Streaming de imagen, precarga en el nodo |
| Pesos del modelo | Decenas de GB que no deben ir en la imagen | Volúmenes, almacenes de modelos, OCI artifacts |
| GPU | Requiere el toolkit del fabricante y drivers en el host | Estandarización vía CDI (Container Device Interface) |
| Planificación | La GPU no se reparte como la CPU | Time-slicing, MIG, planificadores especializados |
| Coste | Nodos con GPU carísimos e infrautilizados | Autoescalado agresivo, colas, spot |
# Acceso a GPU desde un contenedor, con el toolkit instalado en el host
docker run --rm --gpus all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smiLa regla de oro que emerge, y que es puro sentido común de contenedores: los pesos del modelo no van dentro de la imagen. Una imagen de 15 GB que hay que reconstruir y redistribuir cada vez que cambia una línea de Python es un despliegue de veinte minutos. Los pesos son datos: van en un volumen, en un almacén de objetos o en un artefacto OCI aparte. Es exactamente la separación entre imagen y estado que aprendiste en 03-06, aplicada a un problema nuevo.
Y una consecuencia que ya te afecta: los tiempos de arranque y el tamaño vuelven a importar mucho, lo que empuja todo el ecosistema hacia imágenes más pequeñas y arranques más rápidos. Nadie va a echar de menos ese empujón.
- Plataformas internas de desarrollo
Madurez: adoptable, con mucha moda alrededor. La constatación de la que nacen: Kubernetes es demasiado para que cada desarrollador lo maneje a diario. La respuesta es una capa por encima —Backstage, Crossplane, Score, Argo CD y un catálogo de plantillas— que ofrece una interfaz sencilla y esconde el YAML.
| Promesa | Riesgo real |
|---|---|
| El desarrollador declara «necesito una API con PostgreSQL» | Una abstracción con fugas: cuando falla, hay que bajar igual |
| Menos YAML por equipo | Otro sistema que mantener, con su propio equipo |
| Menos errores por copiar y pegar | Rigidez: lo que no está en la plantilla no existe |
| Onboarding en minutos | Coste alto hasta que la plataforma madura |
La regla que separa el éxito del fracaso: una plataforma interna funciona cuando abstrae sin ocultar. El día que algo falle, alguien tendrá que mirar los Pods, los eventos y los logs, y ahí no hay interfaz que valga. Por eso lo que has aprendido en este curso no lo hace obsoleto una plataforma interna: lo hace más valioso, porque tú eres quien puede bajar cuando la abstracción se rompe.
- Resumen de madurez
| Tendencia | Madurez | ¿Te afecta ya? |
|---|---|---|
| Rootless y políticas de admisión | En producción | Sí, hoy |
| Cadena de suministro (SBOM, firma, procedencia) | En producción → obligatorio | Sí, hoy |
| Builds rápidos y caché remota | En producción | Sí, ya lo usas |
| Bases mínimas (Wolfi, distroless) | Adoptable | Sí, próxima mejora |
| Contenedores en el borde | Producción en su nicho | Si tienes dispositivos |
| Cargas de IA | Producción con problemas abiertos | Si tocas modelos |
| Plataformas internas | Adoptable | En organizaciones grandes |
| Imágenes deterministas | Adoptable | Interesante, no urgente |
| WebAssembly | Prometedor | Seguirlo, no apostarlo |
| Lazy pulling generalizado | Prometedor | No todavía |
| Wasm sustituyendo contenedores | Apuesta | No |
Si tuvieras que dedicar tiempo este trimestre a una sola cosa de esta tabla, sería la segunda fila. Es la que ya tiene fecha.
- Lo que no va a cambiar
Las tendencias son entretenidas; los fundamentos son rentables. Estos cinco llevan una década estables y seguirán ahí cuando las modas de esta lección hayan pasado:
| Fundamento | Por qué es estable | Dónde lo aprendiste |
|---|---|---|
| La imagen en capas | Contenido direccionable por digest; capas compartidas y cacheables. Es el diseño correcto | 01-05, 02-02, 05-07 |
| La inmutabilidad | Una imagen no cambia: se sustituye. De ahí salen rollback, reproducibilidad y procedencia | 02-06, 06-07 |
| La configuración por entorno | La misma imagen en dev, staging y producción, con la configuración fuera | 04-05, 06-01 |
| Construir ≠ ejecutar | El pipeline construye y firma; el destino solo hace pull. Separación de responsabilidades y de privilegios |
06-02, 07-01 |
| El proceso aislado por el kernel | Namespaces, cgroups y capabilities. Wasm añade otro modelo; no elimina este | 05-07 |
Ahí es donde conviene invertir el aprendizaje. Quien entiende de verdad estos cinco puntos se mueve entre Docker, Podman, containerd, Kubernetes o lo que venga en 2030 leyendo la documentación una tarde. Quien solo memorizó comandos, vuelve a empezar cada vez.
Hay una prueba sencilla para saber en qué grupo estás. Piensa en estas cuatro preguntas y respóndelas mentalmente antes de seguir:
- ¿Por qué cambiar una línea de
src/index.jsno invalida la capa denpm ci? - ¿Por qué un contenedor sin estado puede reemplazarse y uno con estado no?
- ¿Por qué la misma imagen sirve para desarrollo y para producción?
- ¿Por qué
localhostdentro del contenedor no es tu máquina?
Si las cuatro tienen respuesta inmediata, no son comandos memorizados: es el modelo. Y el modelo es lo que se transfiere a cualquier herramienta futura.
- El camino de Aurora Libros
Aurora Libros empezó en 01-07 con quince pasos manuales de onboarding: instalar Node, instalar PostgreSQL de la versión correcta, instalar Redis, crear la base, cargar el catálogo, configurar variables, y rezar. Dos días para que alguien nuevo pudiera arrancar el proyecto, y un «en mi máquina funciona» garantizado.
| Módulo | Qué ganó la plataforma |
|---|---|
| 1. Introducción | Los conceptos, la instalación y el primer contenedor |
| 2. Imágenes | La API en una imagen propia, etiquetada y publicada en ghcr.io |
| 3. Contenedores | Red interna con DNS, volúmenes persistentes, límites y reinicio |
| 4. Compose | Los cuatro servicios en un fichero, con perfiles y entornos |
| 5. Avanzado | Rootless, cap_drop, SBOM, firma, 142→102 MB, multiarquitectura |
| 6. Producción | Doce factores, tres sondas, CI/CD, Kubernetes, HPA, rollback ensayado |
| 7. Ecosistema | Aprovisionamiento, criterios de decisión, herramientas y estándar OCI |
Hoy Aurora Libros es una plataforma real:
- Una imagen
ghcr.io/auroralibros/aurora-api:2.0.0de 104 MB, multietapa desdenode:22-alpinefijado por digest, multiarquitectura (amd64 y arm64), firmada con Cosign, con SBOM y attestation de procedencia. - Ejecución sin privilegios:
read_only,cap_drop: [ALL],no-new-privileges, usuario sin root. - Configuración fuera de la imagen, validada al arrancar y fallando en 0,4 segundos si falta algo.
- Apagado ordenado sin perder peticiones y tres sondas con semánticas separadas.
- Un pipeline que en cada
git pushprueba contra PostgreSQL 16 y Redis 7 reales, construye en 41 segundos con caché remota, escanea con Trivy, firma y publica. - Despliegue en Kubernetes con Kustomize, StatefulSet con PVC para los datos, Ingress con TLS, PgBouncer, HPA de 3 a 12 réplicas que llevó el p95 de 1 840 ms a 88 ms, PodDisruptionBudget y rollback ensayado.
- Observabilidad con Loki, Promtail, Grafana, Prometheus y cAdvisor, con alertas.
- Y el onboarding: clonar el repositorio y ejecutar un comando.
De quince pasos manuales a un comando. Ese es el trabajo de 47 lecciones.
- Autoevaluación
Marca con honestidad. Lo que no puedas explicar a otra persona, no lo dominas todavía.
| Competencia | Deberías poder... | Módulo |
|---|---|---|
| Fundamentos | Explicar contenedor vs. VM y qué es un namespace | 1, 5 |
| Imágenes | Escribir un Dockerfile multietapa que produzca <120 MB | 2, 5 |
| Caché de capas | Ordenar instrucciones para que la caché acierte | 2, 5 |
| Ejecución | Diagnosticar por qué un contenedor sale con código 137 o 139 | 3 |
| Redes | Explicar por qué localhost no es el host dentro del contenedor |
3, 5 |
| Volúmenes | Hacer y restaurar una copia de un volumen | 3, 5 |
| Compose | Montar una pila con depends_on condicional y overrides |
4 |
| Configuración | Sacar toda la configuración de la imagen y validarla al arrancar | 4, 6 |
| Seguridad | Ejecutar sin root, con cap_drop y sistema de ficheros de solo lectura |
5 |
| Cadena de suministro | Generar SBOM, firmar con Cosign y verificar la firma | 5, 6 |
| BuildKit | Usar --mount=type=cache, secretos de build y caché remota |
5 |
| Multiarquitectura | Publicar una imagen para amd64 y arm64 con un manifest list | 5 |
| Producción | Implementar apagado ordenado y las tres sondas | 6 |
| CI/CD | Montar un pipeline que pruebe, escanee, firme y publique | 6 |
| Kubernetes | Desplegar una app con estado y sin estado, y hacer rollback | 6 |
| Escalado | Configurar un HPA y encontrar el cuello de botella real | 6 |
| Decisión | Justificar Compose o Kubernetes con criterios, no con modas | 7 |
| Ecosistema | Ejecutar tu imagen en Podman y explicar por qué funciona | 7 |
Si dudas en tres o más filas, vuelve a esas lecciones y ejecuta los ejercicios. Leerlos no cuenta.
- Cómo seguir aprendiendo
Certificaciones que valen algo (por orden de utilidad práctica):
| Certificación | Qué acredita | Comentario |
|---|---|---|
| CKA (Certified Kubernetes Administrator) | Operar un clúster | Práctica, con terminal real; la más reconocida |
| CKAD (Application Developer) | Desplegar aplicaciones en K8s | La más cercana a lo que has hecho aquí |
| CKS (Security Specialist) | Seguridad en Kubernetes | Requiere CKA previo; muy valorada |
| DCA (Docker Certified Associate) | Docker | Menos relevante hoy que las de la CNCF |
Documentación de referencia, por orden de rentabilidad:
| Fuente | Por qué merece tu tiempo |
|---|---|
| Documentación oficial de Docker | La referencia del Dockerfile y de Compose, siempre actualizada |
| Las tres especificaciones de la OCI | Leer la Image Spec entera cuesta una tarde y aclara media carrera |
| Documentación de Kubernetes | Densa pero excelente; los «concepts» antes que los tutoriales |
| Referencia de BuildKit y Buildx | Donde está lo que la mayoría no usa: cachés, secretos, bake |
| Especificación de Compose | Es un estándar abierto, no un manual de producto |
Los CHANGELOG de tus herramientas |
La forma más barata de no quedarte atrás |
Proyectos de la CNCF que merecen tu atención, agrupados por el problema que resuelven:
| Problema | Proyectos |
|---|---|
| Ejecutar contenedores | containerd, CRI-O |
| Desplegar de forma declarativa | Argo CD, Flux (GitOps) |
| Observar | Prometheus, OpenTelemetry, Grafana |
| Seguridad en ejecución | Falco, Sigstore/Cosign |
| Red y políticas | Cilium (eBPF), Kyverno, OPA |
| Registro y artefactos | Harbor, Zot, ORAS |
| Sin servidor y plataformas | Knative, Backstage, Crossplane |
No los aprendas todos: elige por el problema que tengas delante. Un proyecto entendido a fondo vale más que diez conocidos de oídas.
Hábitos que valen más que cualquier curso: lee los CHANGELOG de las herramientas que usas; cuando algo falle, no pares al arreglarlo, entiende por qué falló; lee Dockerfiles de proyectos serios; y explica a un compañero lo que acabas de aprender, que es la prueba definitiva de si lo entendiste.
- Cuatro proyectos para consolidar
Lo que de verdad fija el conocimiento es aplicarlo a algo que te importe. Por orden de dificultad:
Proyecto 1 — Contenedoriza una aplicación tuya. Coge un proyecto propio, real, con sus manías. Escribe un Dockerfile multietapa que baje de 150 MB, saca toda la configuración a variables de entorno, añade las tres sondas y el apagado ordenado, y móntalo con Compose junto a su base de datos. Objetivo: que otra persona lo arranque con un comando.
Proyecto 2 — Un pipeline completo. Sobre lo anterior, monta CI que ejecute pruebas con Testcontainers, construya multiarquitectura con caché remota, escanee con Trivy y falle si hay críticas, genere SBOM, firme con Cosign y publique en ghcr.io. Objetivo: que un git push produzca una imagen firmada y verificable sin tocar nada.
Proyecto 3 — Despliega en un clúster gestionado. Lleva la aplicación a un Kubernetes gestionado con Kustomize y dos overlays, Ingress con TLS, HPA, PodDisruptionBudget y observabilidad. Haz una prueba de carga, encuentra el cuello de botella real y ensaya un rollback. Objetivo: romperlo a propósito y recuperarlo en menos de dos minutos.
Proyecto 4 — Contribuye. Elige una imagen oficial o un proyecto de la CNCF que uses y abre una contribución real: una mejora de documentación, un Dockerfile más pequeño, un hadolint que pase limpio, un test que falte. Objetivo: pasar de consumidor a participante, que es donde más se aprende.
Y un consejo sobre los cuatro: termínalos. Un proyecto acabado y desplegado enseña más que cinco a medias.
Errores Comunes y Consejos
- Reescribir algo porque salió una tecnología nueva. Ninguna tendencia de esta lección justifica reescribir una plataforma que funciona. Los cambios se hacen por problemas, no por titulares.
- Confundir «prometedor» con «listo». Wasm es técnicamente sólido y su ecosistema es joven. Llevarlo a producción hoy para una API convencional es cambiar problemas resueltos por problemas abiertos.
- Meter los pesos de un modelo en la imagen. Convierte cada despliegue en veinte minutos. Los pesos son datos, no código.
- Esperar a que la normativa obligue. Añadir SBOM, firma y procedencia a un pipeline que ya existe cuesta una tarde; hacerlo con un cliente preguntando y un plazo encima, semanas.
- Confiar en una plataforma interna sin entender lo que hay debajo. El día que la abstracción se rompa, alguien tendrá que mirar los Pods. Que ese alguien sepas ser tú es tu ventaja.
- Estudiar herramientas en vez de fundamentos. Las herramientas caducan; el modelo de capas, la inmutabilidad y el aislamiento por kernel, no.
- Consejo: dedica este trimestre a la cadena de suministro. Es la única fila de la tabla de madurez que ya tiene fecha.
- Consejo: cuando evalúes algo nuevo, escribe en tres líneas qué problema tuyo resuelve. Si no sabes escribirlas, no es para ti todavía.
- Consejo: relee el
compose.yamly el Dockerfile de Aurora Libros dentro de seis meses. Verás cosas que hoy no ves, y esa es la señal de que has crecido.
Ejercicios
Ejercicio 1 — Evalúa una tendencia con criterio. Elige una de las tendencias de esta lección (Wasm, bases mínimas tipo Wolfi, imágenes deterministas, plataformas internas o cargas de IA) y escribe un informe breve de decisión para Aurora Libros: qué problema real resolvería, qué madurez tiene, qué habría que cambiar en la plataforma actual, qué coste y qué riesgo tendría, y tu recomendación con un disparador concreto que la haría cambiar. Máximo una página.
Ejercicio 2 — Autoevaluación y plan. Recorre la tabla de §13 y marca cada fila como «lo explico a otra persona», «lo hago mirando la documentación» o «no lo domino». Para cada fila del tercer grupo, localiza la lección correspondiente, ejecuta sus ejercicios y anota qué te faltaba. Convierte el resultado en un plan de cuatro semanas con dos competencias por semana y una comprobación práctica de cada una.
Ejercicio 3 — El proyecto final. Ejecuta el Proyecto 1 de §15 sobre una aplicación tuya de verdad. Entregables: el Dockerfile multietapa con su tamaño final, el compose.yaml con la base de datos, la configuración por variables de entorno documentada, las tres sondas, el apagado ordenado y un README con las instrucciones de arranque. Criterio de éxito: que una persona ajena al proyecto lo levante siguiendo solo el README, sin preguntarte nada.
Soluciones
Solución 1. Ejemplo con bases mínimas tipo Wolfi/Chainguard, que es la de mejor relación beneficio/coste para Aurora Libros:
| Apartado | Análisis |
|---|---|
| Problema que resuelve | El goteo de CVE heredadas de node:22-alpine. Cada semana, Trivy encuentra vulnerabilidades de paquetes del sistema que la API ni siquiera usa, y cada una obliga a reconstruir y republicar |
| Madurez | Adoptable. Hay uso real en producción, imágenes de Node mantenidas y parches muy rápidos; el ecosistema es menor que el de Alpine y algunas variantes son de pago |
| Qué cambiaría | Una línea del FROM de la etapa final y su digest. La etapa de build puede seguir igual. Las sondas, el usuario sin privilegios y el read_only no se tocan |
| Coste | Medio día de pruebas: verificar que las dependencias nativas de la API compilan y arrancan, y revisar que el usuario y las rutas coinciden |
| Riesgo | Depender de un proveedor externo para la base; algunas imágenes sin shell complican la depuración (mitigable con docker debug o netshoot) |
| Recomendación | Probar en una rama, comparar el informe de Trivy y el tamaño frente a 2.0.0, y adoptar solo si reduce las vulnerabilidades altas y críticas a cero sin aumentar el tamaño |
Disparador de revisión: «si en dos meses seguimos republicando aurora-api más de una vez al mes solo por CVE de la imagen base, migramos; si no, la base actual fijada por digest es suficiente». Fíjate en la forma del disparador: es medible y tiene plazo, igual que el de la solución del ejercicio 3 de 07-02. Una recomendación tecnológica sin condición verificable es una opinión.
Solución 2. El plan sale del diagnóstico, así que no hay una respuesta única, pero sí una estructura que funciona:
| Semana | Competencias | Comprobación práctica |
|---|---|---|
| 1 | Fundamentos y ejecución | Explicar a alguien qué es un namespace; diagnosticar un 137 provocado a propósito con --memory 32m |
| 2 | Imágenes y caché | Bajar una imagen tuya por debajo de 120 MB y conseguir que un cambio en el código no invalide la capa de dependencias |
| 3 | Seguridad y cadena de suministro | Ejecutar sin root con cap_drop: [ALL], generar SBOM, firmar con Cosign y verificar la firma |
| 4 | Producción y decisión | Añadir las tres sondas y el apagado ordenado; escribir una página justificando Compose o Kubernetes para tu caso |
Tres reglas que hacen que el plan funcione: la comprobación siempre es hacer, nunca leer; se marca «lo domino» solo cuando puedes explicárselo a otra persona sin mirar; y si una semana se cae, se retrasa el plan, no se salta la comprobación. El error clásico es sustituir la práctica por la relectura: releer una lección de seguridad no te enseña a diagnosticar por qué falla readOnlyRootFilesystem, y provocar el fallo, sí.
Solución 3. Rúbrica de autoevaluación del entregable. Si algo no está, vuelve a la lección indicada:
| Requisito | Cumple si... | Lección |
|---|---|---|
| Dockerfile multietapa | La imagen final no contiene compiladores ni dependencias de build | 05-04 |
| Tamaño | Por debajo de 150 MB, verificado con docker images y dive |
05-04, 07-04 |
| Base fijada | FROM con etiqueta y digest, no latest |
02-06 |
| Sin root | USER no root y docker exec ... id lo confirma |
05-03 |
| Configuración fuera | Ningún valor de entorno escrito en la imagen; la app falla al arrancar si falta uno obligatorio | 04-05, 06-01 |
| Tres sondas | /salud/vivo, /salud/listo y arranque, con semánticas distintas |
06-01 |
| Apagado ordenado | SIGTERM cierra conexiones y termina peticiones en curso; docker stop no tarda 10 s |
03-02, 06-01 |
| Compose | Un up -d --wait levanta app y base de datos, con depends_on condicional |
04-04 |
| Persistencia | Volumen nombrado; los datos sobreviven a down y vuelven con up |
03-06 |
README |
Una persona ajena arranca el proyecto sin preguntar nada | 01-07 |
La última fila es la única que no puedes puntuarte tú: pídeselo de verdad a alguien y cronométralo. Si tiene que preguntarte algo, falta documentación o falta automatización, y en ambos casos el proyecto aún no está terminado. Ese criterio —que otro lo levante solo— es la medida más honesta de todo lo que has aprendido, y es exactamente el problema que Aurora Libros tenía en 01-07 con sus quince pasos manuales.
Conclusión
Has llegado al final de 47 lecciones. Empezaste sin saber qué era una imagen y terminas con una plataforma completa construida con tus manos: Aurora Libros, que pasó de quince pasos manuales de onboarding y un «en mi máquina funciona» a una imagen de 104 MB multiarquitectura, firmada, con SBOM y procedencia, ejecutándose sin privilegios, desplegada por un pipeline que construye en 41 segundos, escalando sola de 3 a 12 réplicas en un clúster, observada, con rollback ensayado y con un onboarding de un solo comando.
Por el camino has aprendido las dos cosas que importan. La primera son los fundamentos que no caducan: la imagen en capas direccionada por digest, la inmutabilidad de la que salen el rollback y la procedencia, la configuración por entorno que permite que la misma imagen viva en desarrollo y en producción, la separación entre construir y ejecutar, y el proceso aislado por namespaces y cgroups del kernel. Esos cinco puntos llevan una década estables y son la razón de que puedas moverte entre Docker, Podman, containerd o lo que venga leyendo la documentación una tarde.
La segunda es el criterio, que es lo que separa a quien ejecuta comandos de quien toma decisiones. Sabes cuándo Compose es la respuesta profesional y cuándo lo es Kubernetes, y sabes formular la pregunta que lo decide: si el clúster se rompe un sábado a las tres de la mañana, ¿quién lo arregla? Sabes que el host es superficie de ataque y que alguien con nombre y apellidos tiene que responder por él. Sabes evaluar una herramienta por su mantenimiento, su licencia, su procedencia y su coste de salida en lugar de por su popularidad. Sabes distinguir lo que está en producción de lo que es apuesta. Y sabes que las decisiones se escriben, con su fecha y su disparador de revisión, para que dentro de un año alguien —quizá tú— entienda por qué se tomaron.
También te llevas algo menos visible y más valioso: la costumbre de no quedarte en la superficie. Abriste el config.json de runc, miraste los siete namespaces, leíste el mediaType de tu propio índice multiarquitectura y comprobaste que tu imagen no era «de Docker» sino un artefacto OCI. Esa curiosidad es lo que hace que las tecnologías nuevas te resulten familiares en lugar de amenazantes, porque casi siempre son combinaciones distintas de las mismas piezas.
Docker cambiará. Kubernetes cambiará. Aparecerán runtimes, formatos y plataformas que hoy no existen, y algunos de los nombres de este curso sonarán antiguos dentro de cinco años, igual que hoy suena Docker Machine. No pasa nada: los contenedores son un estándar abierto, y tú no has aprendido un producto, has aprendido el modelo que hay debajo. Con eso, lo que venga se lee en una tarde.
Ahora coge algo tuyo —una aplicación real, con sus manías, esa que llevas tiempo queriendo poner en marcha— y contenedorízala. Escríbele el Dockerfile multietapa, sácale la configuración, ponle las tres sondas, móntale el pipeline y despliégala. Rómpela a propósito y arréglala. Ese es el último ejercicio del curso y el único que no tiene solución escrita, porque la solución la escribes tú.
Gracias por llegar hasta aquí. Que te funcione en producción.
Docker: De Principiante a Avanzado
Módulo 1: Introducción a Docker
- ¿Qué es Docker?
- Instalando Docker
- Arquitectura de Docker
- Comandos Básicos de Docker
- Entendiendo las Imágenes de Docker
- Creando tu Primer Contenedor Docker
- El Proyecto del Curso: la Plataforma Aurora Libros
Módulo 2: Trabajando con Imágenes Docker
- Docker Hub y Repositorios
- Construyendo Imágenes Docker
- Conceptos Básicos de Dockerfile
- Instrucciones Avanzadas del Dockerfile
- Gestionando Imágenes Docker
- Etiquetado y Publicación de Imágenes
Módulo 3: Contenedores Docker
- Ejecutando Contenedores
- Ciclo de Vida del Contenedor
- Gestionando Contenedores
- Inspección y Depuración de Contenedores
- Redes en Docker
- Persistencia de Datos con Volúmenes
- Límites de Recursos y Políticas de Reinicio
Módulo 4: Docker Compose
- Introducción a Docker Compose
- Definiendo Servicios en Docker Compose
- Comandos de Docker Compose
- Aplicaciones Multi-Contenedor
- Variables de Entorno en Docker Compose
- Perfiles, Overrides y Múltiples Entornos
- Desarrollo Local con Docker Compose
Módulo 5: Conceptos Avanzados de Docker
- Profundización en Redes Docker
- Opciones de Almacenamiento Docker
- Mejores Prácticas de Seguridad en Docker
- Optimizando Imágenes Docker
- Builds Avanzadas con BuildKit y Buildx
- Registro y Monitoreo en Docker
- El Runtime por Dentro: Namespaces, Cgroups y Capas
Módulo 6: Docker en Producción
- Preparar una Imagen para Producción
- CI/CD con Docker
- Orquestando Contenedores con Docker Swarm
- Introducción a Kubernetes
- Desplegando Contenedores Docker en Kubernetes
- Escalado y Balanceo de Carga
- Estrategias de Despliegue y Rollback
