Este curso de Docker reúne todas las lecciones necesarias para comenzar con contenedores y avanzar progresivamente hasta Docker Compose, seguridad, producción y CI/CD.
El curso de Docker está organizado como una ruta de aprendizaje práctica. Puedes seguir las lecciones en orden o acceder directamente al tema que necesites consultar.
🔍 ¿Por qué aprender Docker en 2026?
Docker es una herramienta fundamental para:
- Crear entornos de desarrollo reproducibles.
- Empaquetar y distribuir aplicaciones.
- Automatizar procesos de CI/CD.
- Trabajar con Kubernetes y OpenShift.
- Desplegar aplicaciones en servidores y plataformas cloud.
🎯 Características del curso de Docker
✅ 100 % gratuito
✅ Enfoque práctico
✅ Contenido actualizado para 2026
✅ Desde nivel principiante hasta avanzado
✅ Aprende a tu propio ritmo dentro de un curso de Docker ordenado por módulos.
📚 Temario del curso de Docker
Fundamentos de Docker
1. Introducción a Docker
- Qué problema resuelve Docker
- Qué es Docker
- Cómo funciona Docker
- Qué es un contenedor
- Qué es una imagen Docker
- Contenedores vs. máquinas virtuales
- Diferencias de Docker en Linux, Windows y macOS
- Flujo básico: Dockerfile → imagen → contenedor
- Docker Engine
- Docker Desktop
- Docker Engine vs Docker Desktop
2. Instalación de Docker
- Cómo instalar Docker en Linux
- Cómo instalar Docker en Windows
- Cómo instalar Docker en macOS
- Cómo verificar que Docker funciona
- Configuración inicial recomendada
- Docker Permission Denied
- Configuración inicial avanzada de Docker
Primeros pasos con contenedores
3. Crear y ejecutar contenedores
- Comandos Docker: guía práctica
- Creando tu primer contenedor
- Cómo ejecutar un contenedor
- Contenedores en modo interactivo
- Contenedores en segundo plano
- Cómo asignar un nombre a un contenedor
- Cómo ejecutar comandos dentro de un contenedor
4. Ciclo de vida de los contenedores
- Ciclo de vida de un contenedor
- Cómo listar contenedores
- Cómo iniciar contenedores
- Cómo detener contenedores
- Cómo reiniciar contenedores
- Cómo pausar y reanudar contenedores
- Cómo eliminar contenedores
- Qué ocurre cuando eliminamos un contenedor
- Diferencias entre imagen y contenedor
5. Logs, inspección y diagnóstico básico
- Cómo ver los logs de un contenedor
- Cómo inspeccionar un contenedor
- Cómo revisar los procesos de un contenedor
- Cómo revisar el consumo de recursos
- Cómo monitorizar contenedores
- Cómo copiar archivos desde y hacia un contenedor
- Cómo investigar un contenedor detenido
6. Recursos y comportamiento del contenedor
- Cómo limitar los recursos de un contenedor
- Cómo limitar procesos con PIDs
- Cómo configurar políticas de reinicio
- Cómo actualizar la configuración de un contenedor
- Qué ocurre cuando un contenedor consume demasiada memoria
- Qué es un OOM Kill
Imágenes Docker
7. Fundamentos de las imágenes
- Imágenes Docker: qué son y cómo funcionan
- Cómo funcionan las capas de una imagen
- Imagen vs contenedor
- Cómo descargar imágenes
- Cómo listar imágenes locales
- Cómo eliminar imágenes
- Cómo inspeccionar una imagen
- Cómo utilizar docker history
- Cómo elegir una buena imagen base
- Qué son las imágenes Alpine
- Cómo usar imágenes oficiales de forma segura
8. Tags, digests y versiones
- Qué son los tags de Docker
- Qué significa latest
- Cómo etiquetar una imagen
- Cómo versionar imágenes
- Qué es el digest de una imagen
- Diferencias entre tag y digest
- Cómo fijar una imagen mediante digest
- Por qué evitar depender de latest
- Estrategias de versionado de imágenes
9. Docker Hub y registries
- Qué es un Container Registry
- Qué es Docker Hub
- Cómo buscar imágenes
- Cómo iniciar sesión en Docker Hub
- Cómo etiquetar una imagen para un registry
- Cómo subir una imagen
- Cómo descargar imágenes
- Cómo eliminar imágenes de un repositorio
- Registries públicos vs privados
- GitHub Container Registry
- GitLab Container Registry
- AWS ECR
- Azure Container Registry
- Google Artifact Registry
10. Manifests y arquitecturas
- Qué es un manifest
- Qué es un manifest list
- Que es la arquitectura de una imagen
- Cómo funcionan las imágenes multiarquitectura
- Cómo inspeccionar un manifest
Dockerfile y creación de imágenes
11. Fundamentos de Dockerfile
- Qué es un Dockerfile
- Estructura básica de un Dockerfile
- Cómo construir una imagen Docker
- Cómo utilizar docker build
- Qué es el contexto de construcción
- Qué significa el punto en docker build .
- Cómo utilizar otros directorios como contexto
- Cómo utilizar contextos locales, Git y URL
- Contextos de construcción con nombre
- Cómo ejecutar una imagen propia
12. Instrucciones fundamentales de Dockerfile
- Instrucción FROM
- Instrucción RUN
- Instrucción COPY
- Instrucción WORKDIR
- Instrucción ENV
- Instrucción ARG
- Instrucción EXPOSE
- Instrucción USER
- Instrucción CMD
- Instrucción ENTRYPOINT
13. Instrucciones avanzadas de Dockerfile
- Instrucción LABEL
- Instrucción VOLUME
- Instrucción HEALTHCHECK
- Instrucción STOPSIGNAL
- Instrucción SHELL
- Instrucción ONBUILD
- Diferencias entre COPY y ADD
- Diferencias entre CMD y ENTRYPOINT
- Diferencias entre ARG y ENV
- Cómo crear un usuario dentro del contenedor
14. Procesos dentro de los contenedores
- Qué es el proceso principal de un contenedor
- Qué es PID 1
- Por qué un contenedor se detiene cuando termina su proceso
- Cómo funcionan las señales
- Qué ocurre cuando ejecutamos docker stop
- SIGTERM y SIGKILL
- Cómo realizar un apagado limpio
- Procesos zombie
- Cuándo utilizar –init
- Cómo funciona STOPSIGNAL
Optimización de imágenes
15. Caché, contexto y .dockerignore
- Cómo funciona la caché de construcción
- Qué invalida la caché
- Cómo ordenar correctamente un Dockerfile
- Cómo separar dependencias del código
- Qué es .dockerignore
- Cómo evitar copiar .git y secretos
- Cómo reducir el contexto de construcción
16. Dockerfile optimizado y multi-stage builds
- Cómo reducir el tamaño de una imagen
- Cómo instalar únicamente dependencias necesarias
- Cómo limpiar cachés de paquetes
- Cómo elegir imágenes base pequeñas
- Qué es un multi-stage build
- Cómo separar compilación y runtime
- Buenas prácticas y errores comunes al construir imágenes
Redes Docker
17. Fundamentos de networking
- Cómo funciona la red en Docker
- Interfaces de red de los contenedores
- Qué es una red bridge
- Bridge por defecto vs bridge personalizada
- Qué es una red host
- Qué es una red none
- Cómo listar redes
- Cómo crear una red Docker
- Cómo eliminar una red
- Cómo inspeccionar una red
18. Comunicación entre contenedores
- Cómo conectar contenedores entre sí
- Comunicación entre contenedores por nombre
- DNS interno de Docker
- Cómo conectar un contenedor a una red
- Cómo desconectar un contenedor
- Cómo conectar un contenedor a varias redes
- Aislamiento entre redes
- Cómo acceder al host desde un contenedor
- Errores comunes de red
19. Puertos en Docker
- Puerto del host vs puerto del contenedor
- Cómo publicar puertos con -p
- Diferencias entre EXPOSE y -p
- TCP vs UDP
- Cómo saber qué puertos publica un contenedor
- Qué hacer si un puerto está ocupado
- Cómo evitar exponer puertos innecesarios
Persistencia y almacenamiento
20. Almacenamiento en contenedores
- Qué ocurre con los datos de un contenedor
- Qué es la capa writable del contenedor
- Por qué no guardar datos importantes dentro del contenedor
- Qué es un mount
- Tipos de almacenamiento en Docker
21. Volúmenes Docker
- Qué es un volumen Docker
- Cómo crear volúmenes
- Cómo listar volúmenes
- Cómo inspeccionar volúmenes
- Cómo montar un volumen
- Cómo compartir un volumen entre contenedores
- Cómo eliminar volúmenes
- Volúmenes anónimos vs volúmenes nombrados
- Cómo eliminar volúmenes de forma segura
- Cómo hacer backup de un volumen
- Cómo restaurar un volumen
22. Bind mounts y tmpfs
- Qué es un bind mount
- Cómo montar directorios del host
- Cómo montar archivos individuales
- Qué es tmpfs
- Diferencias entre volumen y bind mount
- Diferencias entre volumen, bind mount y tmpfs
- Cuándo utilizar cada uno
- Problemas de permisos con bind mounts
- Cómo montar código local durante el desarrollo
Docker Compose
23. Fundamentos y configuración de Docker Compose
- Qué es Docker Compose
- Cuándo utilizar Docker Compose
- Estructura de un archivo Compose
- Servicios, image vs build y comandos básicos
- Puertos, redes y comunicación mediante nombre de servicio
- Volúmenes, bind mounts y almacenamiento compartido
- Variables de entorno, .env, environment y env_file
- depends_on, healthchecks, restart y logs
24. Docker Compose avanzado, desarrollo y producción
- Overrides, varios archivos Compose e include
- Profiles, secrets y configs
- docker compose config y Docker Compose Dry Run
- Escalado, recursos y entornos
- Compose en desarrollo: código local, hot reload y Compose Watch
- Frontend + backend + base de datos
- Compose en producción: imágenes, variables y secretos
- Límites de recursos, healthchecks y rotación de logs
- Nginx, HTTPS, estrategias de actualización y rollback
BuildKit y Buildx
25. BuildKit y Buildx esenciales
- Qué es BuildKit
- Diferencias con el builder clásico
- Cache mounts
- Secret mounts
- SSH mounts
- Qué es Docker Buildx
- docker build vs docker buildx build
- Qué es un builder
- Cómo crear e inspeccionar builders
26. Caché y secretos en builds
- Cómo utilizar –cache-from y –cache-to
- Caché local, registry y GitHub Actions
- Cómo compartir caché entre builds
- Cómo reutilizar caché en CI/CD
- Por qué no utilizar ARG para contraseñas
- BuildKit Secrets
- RUN –mount=type=secret
- Cómo evitar credenciales en las capas
Docker Engine por dentro
27. Arquitectura de Docker Engine
- Arquitectura Docker Engine
- Docker CLI
- Docker daemon
- Docker API
- containerd
- runc
28. dockerd
- Qué es dockerd
- Cómo funciona dockerd
- Qué responsabilidades tiene
- Cómo se comunica con containerd
- Cómo consultar el estado del daemon
- Logs de dockerd
29. Docker API
- Qué es Docker API
- Cómo funciona la API REST de Docker
- Docker CLI y Docker API
- Unix socket de Docker
- Cómo consultar la API
- Riesgos de seguridad de la API
30. containerd
- Qué es containerd
- Cómo funciona containerd
- Qué es un runtime de contenedores
- containerd y Docker
- containerd y Kubernetes
31. runc
- Qué es runc
- Cómo funciona runc
- OCI Runtime Specification
- Cómo crea runc un contenedor
- Relación Docker → containerd → runc
Administración de Docker Engine
32. Configuración y operación del daemon
- Qué es daemon.json
- Dónde guarda Docker sus datos
- Cómo cambiar data-root
- Cómo configurar DNS y proxy
- Registry mirrors e insecure registries
- Live restore
- Cómo reiniciar Docker correctamente
33. Logs, mantenimiento y administración remota
- Qué son los logging drivers
- Rotación de logs
- Cómo evitar llenar el disco con logs
- docker system df
- docker system prune
- Cómo limpiar Docker sin eliminar datos importantes
- Docker Contexts y administración remota mediante SSH
Seguridad en Docker
34. Seguridad esencial de Docker
- Buenas prácticas de seguridad
- Por qué no ejecutar aplicaciones como root
- Cómo utilizar USER
- Principio de mínimo privilegio
- Cómo gestionar secretos
- Cómo elegir imágenes seguras
- Cómo mantener imágenes actualizadas
- Cómo reducir la superficie de ataque
35. Hardening del Engine, aislamiento e imágenes
- Por qué el grupo docker equivale prácticamente a root
- Cómo proteger docker.sock
- Riesgos de montar /var/run/docker.sock
- Docker Rootless
- Linux capabilities, seccomp y AppArmor/SELinux
- Riesgos de –privileged
- Cómo escanear imágenes
- SBOM, firma, provenance y digests
Docker en CI/CD
36. Docker y CI/CD
- Qué papel tiene Docker en CI/CD
- Build → Test → Scan → Push → Deploy
- Cómo versionar imágenes automáticamente
- Tags basados en versiones
- Tags basados en commits
- Cómo autenticar contra un registry
- Cómo utilizar secretos del pipeline
Troubleshooting
37. Troubleshooting esencial de Docker
- Docker Permission Denied
- Un contenedor se apaga inmediatamente
- Cómo investigar un contenedor detenido
- Problemas de memoria y OOMKilled
- Puertos ocupados o que no responden
- Problemas de DNS o comunicación entre contenedores
- Problemas con volúmenes y bind mounts
- Errores comunes al construir imágenes
- Docker Engine no arranca
- Cómo depurar un stack completo con Docker Compose
Guarda esta página como índice principal del curso de Docker y vuelve a ella cada vez que quieras continuar con el siguiente bloque de aprendizaje.

