Curso de Fundamentos de Docker y Kubernetes

Un curso intermedio estructurado sobre imágenes Docker, contenedores, volúmenes, redes, Compose, y cargas de trabajo, servicios, almacenamiento y solución de problemas de Kubernetes.

Nivel: Docker & Kubernetes Dificultad: intermediate 5 lecciones 90 min
Progreso del curso 0 / 5
Volver a los cursos

Qué aprenderás

  • Crear y optimizar imágenes Docker con Dockerfiles
  • Ejecutar e inspeccionar contenedores y persistir datos con volúmenes
  • Conectar contenedores con redes Docker y Compose
  • Desplegar cargas de trabajo principales de Kubernetes con ConfigMaps y Secrets
  • Exponer aplicaciones y solucionar problemas de clústeres Kubernetes

Antes de empezar

  • Experiencia básica con la línea de comandos de Linux
  • Familiaridad con HTTP, puertos y despliegue de aplicaciones
  • El banco de práctica Docker y Kubernetes es útil para autoevaluación

Lección 1 Imágenes Docker y Dockerfiles

Una imagen Docker es una plantilla de solo lectura que contiene una aplicación, su entorno de ejecución, bibliotecas y configuración. Las imágenes se construyen a partir de Dockerfiles mediante capas: cada instrucción como FROM, COPY, RUN o ENV crea una capa, y las capas sin cambios se almacenan en caché para acelerar las reconstrucciones. Las imágenes más pequeñas y seguras prefieren imágenes base mínimas, combinan comandos RUN relacionados y copian solo los archivos que la aplicación necesita.

La instrucción FROM selecciona la imagen base. COPY mueve archivos del contexto de construcción a la imagen, mientras que RUN ejecuta comandos durante la construcción. CMD proporciona el comando y los argumentos predeterminados que se usan cuando el contenedor se inicia, y ENTRYPOINT define el ejecutable que siempre se ejecuta. Cuando ambos están presentes, el entrypoint recibe los argumentos de línea de comandos como sus parámetros. Se pueden añadir una comprobación de salud o un usuario no root con HEALTHCHECK y USER.

Usa docker build -t myapp:latest . para construir una imagen y docker image ls para listarlas. Etiqueta las imágenes con números de versión significativos y evita usar solo latest en producción. El objetivo es una imagen determinista, pequeña y reproducible solo a partir del Dockerfile.

Consejo de práctica Imágenes Docker y Dockerfiles: Repasa esta lección en sesiones cortas cada día. Después de cada ejercicio, di la regla o el paso que usaste; si no puedes, revisa el tema antes de continuar. La constancia fija el contenido mejor que una sesión larga.

Ejemplo

Una aplicación Node.js solo necesita sus archivos de paquetes para instalar dependencias y su código fuente para ejecutarse. El Dockerfile comienza con FROM node:20-alpine, copia package.json primero, ejecuta npm ci, copia el código fuente, cambia a un usuario no root y define CMD ["node", "server.js"]. Copiar las dependencias antes que el código fuente permite que Docker reutilice la capa de dependencias hasta que cambien los archivos de paquetes.

Vuelve a leer la pregunta antes de terminar y confirma el significado de tu respuesta.

Lección 2 Ciclo de vida de contenedores y almacenamiento persistente

Un contenedor es una instancia en ejecución de una imagen. Docker crea, inicia, detiene, reinicia y elimina contenedores con comandos como docker create, docker start, docker stop y docker rm. El atajo habitual docker run crea e inicia un contenedor en un solo paso. Usa docker ps para los contenedores en ejecución, docker ps -a para incluir los detenidos y docker logs para inspeccionar la salida de la aplicación.

Los sistemas de archivos de los contenedores son efímeros: cuando se elimina un contenedor, los cambios escritos en su interior desaparecen. Los volúmenes y los bind mounts resuelven esto. Un volumen con nombre lo gestiona Docker y sobrevive a la eliminación del contenedor; un bind mount asigna un directorio del host dentro del contenedor. Las opciones -v y --mount adjuntan almacenamiento, y los contenedores pueden compartir el mismo volumen. Los montajes de solo lectura evitan modificaciones accidentales.

Para depurar, docker exec -it container bash abre un shell dentro de un contenedor en ejecución, y docker inspect muestra detalles de configuración y estado. Añade políticas --restart solo cuando la aplicación deba recuperarse automáticamente, y mantén los registros y datos fuera del contenedor cuando este sea reemplazable.

Consejo de práctica Ciclo de vida de contenedores y almacenamiento persistente: Repasa esta lección en sesiones cortas cada día. Después de cada ejercicio, di la regla o el paso que usaste; si no puedes, revisa el tema antes de continuar. La constancia fija el contenido mejor que una sesión larga.

Ejemplo

Un contenedor de base de datos se inicia con docker run -d --name postgres -v pgdata:/var/lib/postgresql/data -e POSTGRES_PASSWORD=secret postgres:16. El volumen con nombre pgdata conserva los archivos de la base de datos después de docker rm postgres, de modo que un contenedor de reemplazo que use el mismo volumen restaura los mismos datos.

Vuelve a leer la pregunta antes de terminar y confirma el significado de tu respuesta.

Lección 3 Redes Docker y Compose

Las redes Docker permiten que los contenedores se comuniquen por nombre o IP. La red bridge predeterminada ofrece DNS automático entre contenedores de la misma red, mientras que la red host comparte la pila de red del host y elimina el aislamiento. Se recomiendan las redes bridge definidas por el usuario porque admiten resolución DNS y pueden conectarse o desconectarse sin recrear contenedores. Publica un puerto del contenedor en el host con -p 8080:80; el lado izquierdo es el puerto del host y el derecho el del contenedor.

Docker Compose define aplicaciones de varios contenedores en un archivo YAML. Los servicios declaran imágenes, contextos de construcción, puertos, volúmenes, variables de entorno y redes. Ejecutar docker compose up -d crea la red e inicia los servicios juntos; docker compose down elimina los contenedores y la red predeterminada mientras conserva los volúmenes con nombre. Compose también admite dependencias, comprobaciones de salud y escalado de réplicas de servicios.

Depura la conectividad con docker network ls, docker network inspect y docker exec. Un fallo común es un contenedor web que no puede alcanzar una base de datos porque están en redes diferentes o porque la aplicación usa localhost en lugar del nombre del servicio. Usa nombres de servicios en Compose para que el DNS integrado resuelva al contenedor correcto.

Consejo de práctica Redes Docker y Compose: Repasa esta lección en sesiones cortas cada día. Después de cada ejercicio, di la regla o el paso que usaste; si no puedes, revisa el tema antes de continuar. La constancia fija el contenido mejor que una sesión larga.

Ejemplo

Un archivo compose define los servicios web y db. El servicio web asigna "8080:3000" y se conecta a la base de datos con el nombre de host db y el puerto 5432. El servicio de base de datos monta un volumen con nombre y establece una comprobación de salud al inicio. Al ejecutar docker compose up -d se inician ambos servicios en una red privada, y el navegador llega a la aplicación en http://localhost:8080.

Vuelve a leer la pregunta antes de terminar y confirma el significado de tu respuesta.

Lección 4 Cargas de trabajo principales de Kubernetes

Kubernetes ejecuta aplicaciones contenerizadas en un clúster de nodos. La unidad más pequeña que se puede desplegar es un Pod, que agrupa uno o más contenedores con almacenamiento, red y ciclo de vida compartidos. Los Pods suelen crearlos los controladores. Un Deployment gestiona réplicas sin estado con actualizaciones y retrocesos graduales; un StatefulSet proporciona identidades de red estables y escalado ordenado para aplicaciones con estado; un DaemonSet ejecuta exactamente un Pod en cada nodo seleccionado; un Job ejecuta una carga de trabajo hasta completarla; y un CronJob ejecuta Jobs según un programa.

La configuración se separa del código con ConfigMaps y Secrets. Un ConfigMap contiene datos no sensibles, como variables de entorno o archivos de configuración, mientras que un Secret almacena valores sensibles como contraseñas y tokens de API. Ambos pueden montarse como volúmenes o inyectarse como variables de entorno. Los Secrets están codificados en base64 en la API, pero aun así deben protegerse con RBAC y cifrado en reposo.

Los controladores reconcilian el estado deseado: declaras el número deseado de réplicas y Kubernetes crea o elimina Pods hasta que la realidad coincide. Las etiquetas y los selectores conectan controladores con Pods, así que usa etiquetas con significado como app y tier. Aplica manifiestos con kubectl apply -f e inspecciona el estado de las cargas de trabajo con kubectl get pods, kubectl describe deployment y kubectl rollout status.

Consejo de práctica Cargas de trabajo principales de Kubernetes: Repasa esta lección en sesiones cortas cada día. Después de cada ejercicio, di la regla o el paso que usaste; si no puedes, revisa el tema antes de continuar. La constancia fija el contenido mejor que una sesión larga.

Ejemplo

Un manifiesto de Deployment declara tres réplicas de un contenedor nginx con etiquetas app: web. Un ConfigMap proporciona el valor de APP_MODE y un Secret el de DB_PASSWORD. Si un nodo falla, el controlador crea Pods de reemplazo en nodos sanos y mantiene el recuento deseado en tres.

Vuelve a leer la pregunta antes de terminar y confirma el significado de tu respuesta.

Lección 5 Servicios, almacenamiento y solución de problemas de Kubernetes

Un Service proporciona un endpoint de red estable para un conjunto de Pods. ClusterIP expone el Service dentro del clúster, NodePort abre un puerto en cada nodo y LoadBalancer se integra con el proveedor de la nube para el tráfico externo. Un Ingress enruta el tráfico HTTP y HTTPS hacia los Services mediante hostnames y rutas, normalmente a través de un ingress controller. Los selectores del Service deben coincidir con las etiquetas de los Pods, y el targetPort del Service debe coincidir con el puerto del contenedor.

El almacenamiento persistente usa PersistentVolumeClaim (PVC) para solicitar almacenamiento, PersistentVolume (PV) para proporcionarlo y StorageClass para definir el comportamiento de aprovisionamiento. Un PVC vinculado a un PV puede montarse en un Pod; ReclaimPolicy controla si el volumen se conserva o se elimina cuando se libera el PVC. Las cargas de trabajo con estado, como las bases de datos, deben usar almacenamiento estable y entender cómo se asignan los reclamos de volúmenes a los Pods.

La resolución de problemas sigue un orden estructurado: kubectl get pods para ver el estado, kubectl describe pod para eventos y condiciones, kubectl logs para la salida de la aplicación y kubectl exec para inspección interactiva. Comprueba errores de extracción de imágenes, causas de CrashLoopBackOff, sondas de readiness, selectores de Services y políticas de red. Un flujo de repaso que construya imágenes, pruebe localmente, despliegue cambios pequeños y revierta rápido convierte la práctica de Kubernetes en una habilidad repetible.

Consejo de práctica Servicios, almacenamiento y solución de problemas de Kubernetes: Repasa esta lección en sesiones cortas cada día. Después de cada ejercicio, di la regla o el paso que usaste; si no puedes, revisa el tema antes de continuar. La constancia fija el contenido mejor que una sesión larga.

Ejemplo

Un Pod permanece en CrashLoopBackOff después de desplegar una nueva etiqueta de imagen. kubectl describe pod muestra el código de salida del contenedor, kubectl logs revela una variable de entorno que falta y el Deployment referencia un ConfigMap que no existe. Tras crear el ConfigMap y volver a desplegar, el Pod alcanza el estado Running y el Service vuelve a devolver tráfico.

Vuelve a leer la pregunta antes de terminar y confirma el significado de tu respuesta.