Docker & Kubernetes
Curso orientado a entender contenedores y orquestación desde una perspectiva operativa. El alumno aprende a construir imágenes con Docker, ejecutar servicios con persistencia y red local, y desplegar aplicaciones en Kubernetes con conceptos como pods, deployments, services, ingress, configuración, observabilidad y seguridad.
Docker y Kubernetes suelen estudiarse juntos, pero resuelven problemas diferentes. Docker se centra en empaquetar y ejecutar aplicaciones en contenedores; Kubernetes coordina contenedores a escala, gestiona estado deseado, exposición, configuración, tolerancia a fallo y despliegues controlados. El curso une ambas capas para que el alumno entienda el recorrido completo desde `Dockerfile` hasta pipeline y clúster.
Modulo 01. Introduccion a contenedores y Docker
Objetivo del modulo
Comprender que resuelve la contenedorizacion y como Docker separa imagen, contenedor y runtime para ofrecer portabilidad, reproducibilidad y aislamiento.
Resultados esperados
- Distinguir imagen de contenedor.
- Explicar por que un contenedor no es una maquina virtual pequena.
- Entender el ciclo basico de build, pull, run y stop.
- Ejecutar un contenedor basico desde linea de comandos.
Desarrollo teorico
Los contenedores encapsulan aplicacion y dependencias en una unidad portable y repetible. A diferencia de una VM, no replican un sistema operativo completo sino que comparten kernel del host y aislan procesos, red y sistema de archivos mediante mecanismos del sistema operativo (namespaces y cgroups en Linux). Docker popularizo este modelo simplificando build, distribucion y ejecucion de contenedores hasta hacerlos accesibles a cualquier equipo de desarrollo u operaciones.
Contenedor vs. VM. Una maquina virtual incluye un sistema operativo completo sobre un hypervisor. Un contenedor comparte el kernel del host y solo contiene la aplicacion y sus dependencias. Esto tiene consecuencias practicas directas:
| Aspecto | VM | Contenedor |
|---|---|---|
| Arranque | Minutos | Segundos o milisegundos |
| Tamano tipico | GBs (SO completo) | MBs a cientos de MBs |
| Aislamiento | Hardware virtual (fuerte) | Kernel compartido (mas ligero) |
| Portabilidad | Limitada por hypervisor | Alta (imagen estandar OCI) |
| Densidad | Decenas por host | Cientos por host |
Esto no significa que los contenedores sean "mejores" que las VMs. Son herramientas diferentes. Las VMs ofrecen aislamiento mas fuerte (kernel propio) y son adecuadas cuando se necesitan sistemas operativos distintos o aislamiento estricto. Los contenedores son ideales para aplicaciones microservicio, pipelines de CI/CD y despliegues rapidos con alta densidad.
Imagen, contenedor y runtime. Estos tres conceptos son la base de Docker y fuente de confusion frecuente:
- Imagen: Plantilla inmutable compuesta por capas. Contiene SO base, dependencias, codigo de la aplicacion y configuracion. Se construye con un Dockerfile y se almacena en un registro.
- Contenedor: Instancia en ejecucion de una imagen. Tiene estado de proceso, red asignada y sistema de archivos efimero. Si se elimina el contenedor, los datos no persistidos se pierden.
- Runtime: Capa que crea y gestiona contenedores. Docker Engine es el runtime mas conocido, pero existen otros como containerd, CRI-O o Podman.
Si confundes imagen y contenedor, aparecen errores frecuentes: creer que modificar un contenedor cambia automaticamente la imagen, asumir que el estado vive dentro del contenedor para siempre o pensar que reiniciar un contenedor equivale a "reiniciar un servidor". El proceso principal del contenedor (PID 1) define su vida: si termina, el contenedor termina.
El ciclo basico de Docker. Los comandos fundamentales son:
# Descargar una imagen desde un registro
docker pull nginx:1.25-alpine
# Ejecutar un contenedor desde la imagen
docker run -d --name web -p 8080:80 nginx:1.25-alpine
# Verificar contenedores en ejecucion
docker ps
# Ver logs del contenedor
docker logs web
# Detener el contenedor
docker stop web
# Eliminar el contenedor
docker rm web
# Listar imagenes locales
docker images
Desglose de docker run -d --name web -p 8080:80 nginx:1.25-alpine:
-d: Ejecutar en segundo plano (detached).--name web: Asignar nombre al contenedor.-p 8080:80: Mapear puerto 8080 del host al puerto 80 del contenedor.nginx:1.25-alpine: Imagen y tag a usar.
Persistencia y volumenes. Por defecto, los datos dentro de un contenedor son efimeros. Si el contenedor se elimina, los datos desaparecen. Para datos que deben persistir (bases de datos, uploads, configuraciones), Docker ofrece volumenes:
# Crear un volumen
docker volume create datos-app
# Ejecutar contenedor con volumen montado
docker run -d --name db -v datos-app:/var/lib/postgresql/data postgres:16-alpine
El volumen datos-app sobrevive al contenedor: si eliminas y recreas db, los datos siguen ahi.
Redes. Docker crea redes virtuales para conectar contenedores. Por defecto existe la red bridge. Para que dos contenedores se comuniquen por nombre, se crea una red personalizada:
docker network create mi-red
docker run -d --name api --network mi-red node-api:1.0
docker run -d --name db --network mi-red postgres:16-alpine
# Desde el contenedor 'api', se puede resolver 'db' como hostname
Registros. Las imagenes se almacenan en registros: Docker Hub (publico por defecto), GitHub Container Registry (ghcr.io), Amazon ECR, Azure ACR, Google Artifact Registry. En entornos corporativos se usan registros privados para controlar que imagenes se despliegan.
Por que Docker importa para operaciones y plataforma. Docker resuelve el clasico problema de "en mi maquina funciona". Al encapsular aplicacion y dependencias en una imagen, el entorno de ejecucion es identico en desarrollo, CI, staging y produccion. Esto reduce drasticamente los bugs de entorno y simplifica el despliegue. Ademas, las imagenes son la base de Kubernetes, que orquesta contenedores a escala.
Contenido ampliado
| Concepto | Definicion | Ejemplo practico |
|---|---|---|
| Imagen | Plantilla inmutable con aplicacion y dependencias | nginx:1.25-alpine |
| Contenedor | Instancia en ejecucion de una imagen | docker run nginx |
| Runtime | Capa que crea y gestiona contenedores | Docker Engine, containerd, Podman |
| Registro | Repositorio para publicar y descargar imagenes | Docker Hub, ECR, ACR |
| Volumen | Almacenamiento persistente fuera del contenedor | docker volume create datos |
| Red | Conectividad entre contenedores | docker network create mi-red |
Puntos clave
- Contenedor no es sinonimo de VM; comparten kernel y aislan por namespaces.
- La imagen se construye (build); el contenedor se ejecuta (run).
- El proceso principal (PID 1) gobierna el ciclo de vida del contenedor.
- Los datos efimeros desaparecen al eliminar el contenedor; los volumenes persisten.
- Las imagenes son la base de Docker, Kubernetes y los pipelines de CI/CD modernos.
- Docker resuelve problemas de paridad de entorno entre desarrollo y produccion.
Checklist operativa
- Identificar que parte es build (imagen) y cual es runtime (contenedor).
- Confirmar que datos deben persistir fuera del contenedor mediante volumenes.
- Entender como se distribuye la imagen entre entornos via registros.
- Verificar que el proceso principal es el adecuado para el servicio.
- Usar tags especificos, no
latest, para reproducibilidad. - Configurar redes para comunicacion entre contenedores.
Errores frecuentes
- Guardar estado importante dentro del contenedor sin volumen.
- Depender de cambios manuales sobre contenedores corriendo en vez de reconstruir la imagen.
- No entender que proceso mantiene vivo el contenedor.
- Confundir contenedor con VM y esperar comportamiento identico.
- Usar
latestcomo tag y perder reproducibilidad. - No limpiar imagenes y contenedores antiguos y llenar el disco.
Practica sugerida
Ejecuta los siguientes pasos en tu entorno: (1) descarga la imagen nginx:1.25-alpine, (2)
lanza un contenedor mapeando el puerto 8080, (3) accede desde el navegador, (4) inspecciona
los logs, (5) detente y elimina el contenedor, (6) verifica que la imagen sigue disponible
localmente. Bonus: lanza un segundo contenedor con un volumen montado y verifica que los datos
persisten tras eliminar y recrear el contenedor.
Preguntas de autoevaluacion
- Que diferencia fundamental hay entre imagen y contenedor.
- Por que un contenedor no se comporta igual que una VM y que implicaciones tiene.
- Que ocurre si el proceso principal (PID 1) del contenedor termina.
- Cuando necesitas un volumen y que pasa si no lo usas.
- Por que Docker facilita la paridad entre desarrollo y produccion.
Cierre
Entender bien imagen, contenedor y runtime es el fundamento sobre el que se construye todo lo demas: Dockerfiles, Docker Compose, Kubernetes y los pipelines modernos de entrega de software.
Modulo 02. Imagenes, Dockerfiles y registro
Objetivo del modulo
Aprender a construir imagenes reproducibles, pequenas y trazables mediante Dockerfiles bien disenados y a gestionarlas en registros de contenedores.
Resultados esperados
- Redactar un Dockerfile basico con buen orden de capas.
- Entender cache de build y multi-stage builds.
- Versionar y publicar imagenes en un registro.
- Aplicar buenas practicas de seguridad y tamano en la construccion de imagenes.
Desarrollo teorico
El Dockerfile es el plano de construccion de una imagen Docker. Cada instruccion genera una capa que se apila sobre la anterior. Entender este modelo de capas es fundamental porque afecta a tres dimensiones operativas: tamano de la imagen final, velocidad de build (gracias a la cache) y seguridad (por la superficie de ataque incluida en cada capa).
Anatomia de un Dockerfile. Las instrucciones basicas son FROM (imagen base), RUN (ejecutar comandos), COPY y ADD (copiar ficheros al contexto), WORKDIR (directorio de trabajo), ENV (variables de entorno), EXPOSE (puertos documentados), CMD y ENTRYPOINT (comando de arranque). Un Dockerfile minimo para una aplicacion Node.js se veria asi:
FROM node:20-alpine
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
El orden importa. Primero se copian los ficheros de dependencias (package.json) y se instalan. Solo despues se copia el codigo fuente. Esto aprovecha la cache de Docker: si las dependencias no cambian, esa capa se reutiliza y el build es mucho mas rapido. Si copiaras todo el codigo primero, cualquier cambio en un archivo fuente invalidaria la cache de instalacion de dependencias.
Cache de build. Docker cachea cada capa. Si una instruccion y los ficheros que referencia no han cambiado, Docker reutiliza la capa cacheada. La invalidacion es secuencial: si la capa 3 cambia, las capas 4, 5 y siguientes se reconstruyen. Por eso la regla practica es: instrucciones que cambian poco arriba, instrucciones que cambian mucho abajo.
Multi-stage builds. En aplicaciones compiladas (Go, Java, TypeScript que transpila), el entorno de compilacion incluye herramientas que no hacen falta en runtime. Un multi-stage build usa varias instrucciones FROM para separar etapas:
# Etapa de build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build
# Etapa de runtime
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/server.js"]
La imagen final solo contiene el artefacto compilado y las dependencias de runtime. El resultado es una imagen mas pequena, con menos paquetes instalados y menor superficie de ataque. En imagenes de Go es incluso mas dramatico: se puede compilar en una etapa con el SDK completo y copiar el binario a una imagen scratch o distroless de pocos megabytes.
El fichero .dockerignore. Funciona como .gitignore pero para el contexto de build. Todo lo que no necesite estar dentro de la imagen debe excluirse: .git, node_modules locales, ficheros de test, documentacion, .env con secretos. Olvidar el .dockerignore es una de las causas mas frecuentes de imagenes innecesariamente grandes y de filtracion accidental de secretos.
# .dockerignore
.git
node_modules
*.md
.env
tests/
coverage/
Versionado y tags. Cada imagen debe etiquetarse con una version explicita. Depender de latest es peligroso en produccion porque no garantiza reproducibilidad: hoy latest puede ser la version 2.3.1 y manana la 2.4.0 con cambios incompatibles. Una politica sana usa tags semanticos (v1.2.3), el SHA del commit o una combinacion de ambos. Los digests (sha256:...) proporcionan la maxima trazabilidad y son inmutables.
Registros de contenedores. Las imagenes se publican en registros: Docker Hub, GitHub Container Registry (ghcr.io), Amazon ECR, Azure Container Registry, Google Artifact Registry o registros privados como Harbor. El registro es parte de la cadena de suministro del software. Una imagen descargada de un registro no confiable o sin verificacion de firma puede introducir vulnerabilidades o codigo malicioso. En entornos corporativos se recomienda usar registros privados con escaneo de vulnerabilidades integrado.
Buenas practicas de seguridad. No ejecutar como root dentro del contenedor (usar USER para cambiar a un usuario no privilegiado), no incluir secretos en capas de imagen, usar imagenes base minimas (alpine, distroless), escanear vulnerabilidades con herramientas como Trivy o Snyk y firmar imagenes cuando la cadena de suministro lo requiera.
Contenido ampliado
| Buena practica | Motivo | Ejemplo |
|---|---|---|
| Usar imagen base adecuada | Reducir tamano y superficie de ataque | node:20-alpine vs node:20 |
Aplicar .dockerignore |
Evitar copiar secretos o ficheros innecesarios | Excluir .git, .env, node_modules |
| Multi-stage build | Separar compilacion y runtime | Build con SDK, runtime con binario |
| Tag versionado | Mejorar trazabilidad y rollback | myapp:v1.2.3 en lugar de myapp:latest |
| Usuario no root | Reducir impacto de un compromiso | USER node en Dockerfile |
| Escaneo de vulnerabilidades | Detectar CVEs en dependencias de imagen | Trivy, Snyk, Docker Scout |
Puntos clave
- Un Dockerfile mal disenado penaliza build, seguridad y operacion.
- El orden de instrucciones determina la eficiencia de la cache.
- Multi-stage builds separan herramientas de compilacion del runtime final.
latestes comodo pero peligroso para reproducibilidad en produccion.- El registro forma parte de la cadena de suministro y debe ser confiable.
- Los secretos nunca deben incluirse en capas de imagen.
Checklist operativa
- Revisar imagen base y tamano final de la imagen construida.
- Verificar que existe
.dockerignorey que excluye secretos y ficheros innecesarios. - Confirmar que las instrucciones estan ordenadas de menos a mas cambiante.
- Etiquetar la imagen con version explicita, no solo
latest. - Publicar en un registro autorizado con escaneo de vulnerabilidades.
- Verificar que el contenedor no ejecuta como root.
Errores frecuentes
- Imagenes enormes con toolchains, documentacion y tests innecesarios.
- Copiar secretos o
.enval contexto de build. - Reutilizar tags ambiguos sin politica de versionado clara.
- No usar multi-stage builds para aplicaciones compiladas.
- Invalidar la cache copiando todo el codigo antes de las dependencias.
- Ejecutar el proceso dentro del contenedor como root.
Practica sugerida
Escribe un Dockerfile multi-stage para una aplicacion web Node.js con TypeScript. La primera
etapa debe instalar dependencias y transpilar. La segunda etapa debe contener solo el codigo
compilado y las dependencias de produccion. Incluye .dockerignore, usuario no root y tag
versionado. Justifica el orden de cada instruccion.
Preguntas de autoevaluacion
- Por que importa el orden de instrucciones en un Dockerfile y como afecta a la cache.
- Que problema resuelve multi-stage build y en que tipo de aplicaciones es mas relevante.
- Que riesgo tiene publicar siempre con
latesten un entorno de produccion. - Por que los secretos no deben incluirse en ninguna capa de imagen.
- Que diferencia hay entre
CMDyENTRYPOINTy cuando usar cada uno.
Cierre
Una buena imagen empieza en un buen Dockerfile. La calidad del build se refleja despues en seguridad, velocidad de despliegue y mantenibilidad a largo plazo.
Registrate gratis para acceder a los 8 modulos restantes, examenes y certificados.
Crear cuenta gratisResultados de aprendizaje
- Construir imágenes eficientes y seguras con Docker.
- Ejecutar servicios con redes, volúmenes y composición local reproducible.
- Explicar la arquitectura base de Kubernetes y el papel de sus recursos principales.
- Desplegar, configurar, exponer y observar aplicaciones contenedorizadas.
- Aplicar principios básicos de seguridad y pipeline para contenedores.
Publico objetivo
- Desarrolladores y DevOps que empiezan con contenedores. - Administradores que necesitan entender despliegues modernos. - Equipos de plataforma que quieren una base seria antes de profundizar.
Requisitos previos
Ayuda conocer Linux básico, redes, procesos, ficheros de configuración y conceptos de despliegue de aplicaciones. No es imprescindible experiencia previa con contenedores.
Guia de estudio
Guia de estudio - Docker & Kubernetes
Ritmo sugerido
- Estudiar 1 modulo por sesion, prestando atencion a definiciones, comparativas y errores frecuentes.
- Tomar notas propias y resumir cada modulo en 5-10 ideas accionables.
- Dejar para el final de la sesion la practica sugerida y las preguntas de autoevaluacion.
Plan de avance
- Bloque 1: Introduccion a contenedores y docker.
- Bloque intermedio: Imagenes dockerfiles y registro y siguientes para consolidar criterio.
- Bloque final: Pipeline de despliegue con contenedores y repaso transversal del resto del itinerario.
Metodo recomendado
Leer primero el objetivo del modulo, despues el desarrollo teorico, y solo entonces pasar a tabla, checklist, errores y practica. Ese orden ayuda a construir criterio antes de memorizar detalles.
Evidencias de aprendizaje
- Capacidad para explicar el modulo sin leerlo.
- Capacidad para distinguir conceptos proximos sin confundirlos.
- Capacidad para trasladar el contenido a un escenario de trabajo real.
Examen disponible
Este curso incluye un examen de 18 preguntas. Registrate gratis para acceder al examen y obtener tu certificado digital.
Crear cuenta gratisGlosario - Docker & Kubernetes
IAM
Control de identidades, roles y permisos.
Region
Ubicacion geografica donde se despliegan servicios.
Availability Zone
Dominio de aislamiento dentro de una region.
Object Storage
Almacenamiento orientado a objetos.
Managed Service
Servicio donde el proveedor asume parte de la operacion.
Shared Responsibility
Modelo de reparto de responsabilidades entre cliente y proveedor.
Laboratorio / Taller
Laboratorio o taller - Docker & Kubernetes
Taller orientado a aplicar Docker & Kubernetes en un escenario controlado, convirtiendo teoria en una secuencia de trabajo observable.
Pasos
- Leer el escenario y delimitar objetivo, actores y restricciones.
- Usar como apoyo los modulos: Introduccion a contenedores y docker, Imagenes dockerfiles y registro, Redes volumenes y composicion local, Fundamentos de kubernetes y arquitectura.
- Diseñar una respuesta, configuracion, flujo o decision justificada.
- Validar riesgos, dependencias y evidencias de exito.
- Documentar que pantallas, comandos, politicas o componentes se tocariam en una implantacion real.
Evidencias esperadas
- Artefacto final usable.
- Razonamiento tecnico de las decisiones tomadas.
- Checklist de validacion o criterios de salida.
Caso practico integrador
Caso practico integrador - Docker & Kubernetes
Una organizacion necesita mejorar o implantar capacidades relacionadas con Docker & Kubernetes. Tiene restricciones de tiempo, riesgos operativos y multiples actores implicados, por lo que no basta con listar conceptos: hay que convertirlos en decisiones, artefactos y prioridades.
Entregables
- Mapa del problema y contexto.
- Propuesta de enfoque o arquitectura.
- Riesgos, dependencias y decisiones clave.
- Plan de validacion o seguimiento.
Criterios de calidad
- Coherencia tecnica con el contenido del curso.
- Claridad para priorizar y justificar decisiones.
- Aterrizaje realista en entregables y seguimiento.
Modulos especialmente utiles
- Introduccion a contenedores y docker
- Imagenes dockerfiles y registro
- Redes volumenes y composicion local
- Fundamentos de kubernetes y arquitectura
Recursos - Docker & Kubernetes
Referencias oficiales y recomendadas
- https://docs.docker.com/
- https://docs.docker.com/build/
- https://kubernetes.io/docs/home/
- https://kubernetes.io/docs/concepts/
Estrategia de uso de bibliografia y documentacion
Empieza por la documentacion oficial del fabricante o framework, usa despues el material del curso para consolidar el modelo mental y consulta la referencia tecnica cuando necesites comandos, configuracion o detalles operativos concretos.
Evaluacion
Evaluacion - Docker & Kubernetes
Preguntas abiertas de repaso
- Explica con un ejemplo por que 'Introduccion a contenedores y docker' importa dentro del curso.
- Explica con un ejemplo por que 'Imagenes dockerfiles y registro' importa dentro del curso.
- Explica con un ejemplo por que 'Redes volumenes y composicion local' importa dentro del curso.
- Explica con un ejemplo por que 'Fundamentos de kubernetes y arquitectura' importa dentro del curso.
- Explica con un ejemplo por que 'Pods deployments y services' importa dentro del curso.
Actividades de validacion
- Comparar dos conceptos proximos del curso y justificar cuando usar cada uno.
- Redactar un mini runbook, checklist o decision memo basado en un modulo.
- Explicar a otra persona una decision tecnica o de gobierno derivada del curso.