Contenido
Tutorial de Docker: aprende contenedores, imágenes y Compose desde cero
Docker es una herramienta que empaqueta una aplicación junto con todo lo que necesita (entorno de ejecución, bibliotecas y configuración). El paquete se llama imagen, y al ejecutarlo se convierte en un contenedor. La misma imagen funciona igual en tu portátil, en el ordenador de un compañero o en un servidor en la nube.
- Desarrollador
- Docker, Inc.
- Primera versión
- 2013
- Lenguaje
- Go
- Licencia
- Docker Engine es software de código abierto (Apache License 2.0); Docker Desktop es software comercial, gratuito para particulares y pequeñas empresas
- Sitio oficial
- www.docker.com
- Documentación oficial
- docs.docker.com
Este tutorial de Docker empieza por lo básico y te lleva hasta escribir tus propios Dockerfiles, gestionar varios servicios con Docker Compose y desplegar un sitio web en un servidor en la nube.
Recursos oficiales
| Recurso | URL | Para qué sirve |
|---|---|---|
| Sitio oficial | www.docker.com | Información del producto, descarga de Docker Desktop y planes de precios |
| Documentación oficial | docs.docker.com | Referencia completa de comandos y configuración |
| Instrucciones de instalación | Get Docker | Pasos oficiales de instalación para cada sistema operativo |
| Docker Hub | hub.docker.com | Buscar y descargar imágenes, y subir las tuyas |
| Código fuente de Docker Engine | github.com/moby/moby | Proyecto de código abierto de Docker Engine (Moby) |
| Código fuente de Docker CLI | github.com/docker/cli | Código fuente del comando docker |
| Código fuente de Docker Compose | github.com/docker/compose | Código fuente y versiones de docker compose |
| Notas de versión | Engine, Desktop | Novedades y cambios de cada versión |
Docker y el logotipo de la ballena son marcas comerciales de Docker, Inc. Este tutorial es un recurso de aprendizaje no oficial y no está afiliado a Docker, Inc.
Versiones usadas en este tutorial
Todos los comandos de este tutorial se ejecutaron en octubre de 2026. Los bloques de terminal con fondo negro muestran la salida real de los comandos (solo se quitó contenido irrelevante, como el progreso de las descargas). Valores como los ID de contenedor, las horas o los tamaños de archivo serán distintos en tu salida, y es normal.
| Software | Versión probada en este tutorial | Requisitos mínimos y notas |
|---|---|---|
| Docker Engine | 29.9.0 | Se recomienda la versión 25 o posterior. La mayoría de los comandos funcionan en versiones anteriores, pero algunos formatos de salida cambian |
| Docker Compose | v5.6.0 | Se usa docker compose (la versión de plugin). La versión 2.20 o posterior puede ejecutar los compose.yaml de este tutorial; el antiguo docker-compose (v1) ya no se mantiene |
| Docker Buildx | v0.38.0 | Desde la versión 23, Docker Engine usa BuildKit por defecto para compilar; sintaxis como RUN --mount requiere BuildKit |
| Docker Desktop (Windows, macOS) | 4.95 | Incluye Docker Engine y Compose; consulta los requisitos del sistema más abajo |
La numeración de Compose salta directamente de v2 a v5 (se omitieron v3 y v4 para no confundirlas con los antiguos formatos de archivo de Compose "version 2 / 3"). Los comandos funcionan igual que en v2.
Requisitos del sistema
| Sistema | Requisitos |
|---|---|
| Windows | Windows 10 22H2 (compilación 19045) o Windows 11 23H2 (compilación 22631) o posterior, de 64 bits; WSL 2.1.5 o posterior y la virtualización activada en la BIOS; al menos 8 GB de memoria |
| macOS | Una de las tres últimas versiones principales de macOS; Apple Silicon o Intel; al menos 4 GB de memoria |
| Linux | Este tutorial usa Ubuntu (24.04 / 26.04), x86_64 o arm64; Docker Engine también se puede instalar en las demás distribuciones principales |
Versiones de las imágenes de los ejemplos
| Imagen | Versión | Uso |
|---|---|---|
nginx | 1.30 (stable) | Servidor web, proxy inverso |
node | 24 (LTS) | Ejemplos de Node.js |
python | 3.14 | Ejemplos de Python |
postgres | 18 | Base de datos PostgreSQL |
mysql | 8.4 (LTS) | MySQL, WordPress |
redis | 8 | Caché Redis |
wordpress | 7 | Proyectos de WordPress |
alpine / ubuntu | 3.23 / 26.04 | Imágenes base para los ejercicios |
caddy | 2 | Proxy inverso con HTTPS automático, despliegue |
golang + distroless/static-debian13 | 1.27 | Compilaciones multietapa, imágenes multiplataforma |
registry | 3 | Registry local (ejercicios de push) |
phpmyadmin / adminer | latest | Interfaces de administración de bases de datos |
Los ejemplos usan versiones fijas siempre que es posible (por ejemplo, postgres:18), así que al seguirlos obtendrás los mismos resultados que en el tutorial.
Qué aprenderás
- Qué relación hay entre Docker, las imágenes y los contenedores
- Cómo instalar Docker en Windows, macOS y Linux
- Cómo ejecutar contenedores con
docker runy gestionar su ciclo de vida - Cómo escribir un Dockerfile y empaquetar tu propia aplicación como imagen
- Cómo conservar datos con volúmenes y conectar contenedores en red
- Cómo iniciar varios servicios a la vez con Docker Compose
- Cómo ejecutar Python, Node.js, Nginx, MySQL, PostgreSQL, Redis y WordPress con Docker
- Cómo liberar espacio, configurar la seguridad, usar Rootless y Podman y trabajar con imágenes multiplataforma
- Cómo usar GitHub Actions para compilar automáticamente y desplegar en un servidor en la nube
- Cómo funciona Docker por dentro (namespace, cgroup, overlayfs)
- Cómo encontrar la causa de un error con la guía de mensajes de error comunes; las opciones completas de los comandos habituales están en "Referencia de comandos"
Para quién es
- Desarrolladores que prueban Docker por primera vez
- Equipos que se topan a menudo con el problema de "en mi máquina funciona"
- Quien quiera desplegar un proyecto en la nube sin configurar un servidor a mano
Si sabes escribir comandos en una terminal (línea de comandos), puedes empezar. No necesitas saber Linux ni administración de servidores.
Cómo leer este tutorial
- Los bloques de código con fondo blanco contienen comandos que debes escribir o contenido de archivos. Haz clic en "Copiar", en la esquina superior derecha, para copiarlos.
- Los bloques con fondo negro marcados como Terminal muestran la salida de los comandos. La línea que empieza por
$es el comando que escribiste, seguida de su salida; "Copiar" copia solo el comando. - En los comandos con pestañas Linux / macOS, Windows PowerShell y Windows CMD, elige tu sistema operativo. Toda la página cambiará a la sintaxis correspondiente.
- Cada capítulo empieza con el tiempo estimado, los capítulos previos y los objetivos de aprendizaje. Al final encontrarás un Resumen, Ejercicios con sus respuestas y Preguntas frecuentes.
- Las páginas web de las capturas se capturaron después de ejecutar los ejemplos. Algunas capturas de las interfaces de Docker Desktop y Docker Hub proceden de la documentación oficial de Docker (Apache License 2.0); el pie de imagen lo indica.
Inicio rápido
Después de instalar Docker, escribe esto en una terminal:
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
4f55086f7dd0: Pull complete
Digest: sha256:5e23090353324d887c48ad5e5c56d294eab81588df9605b07d1afe895f9cc8f8
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
Si ves Hello from Docker!, todo funciona. A continuación, empieza por ¿Qué es Docker?.
Preguntas frecuentes
¿Este tutorial sirve si nunca he usado Docker?
Sí. Empieza por la instalación y el primer contenedor, e incluye la salida real de cada paso para que puedas seguirlo y obtener los mismos resultados.
¿Puedo usar los comandos de este tutorial en Windows?
Sí. Cuando la sintaxis cambia (por ejemplo, la ruta $(pwd)), hay pestañas para Linux/macOS, PowerShell y CMD. En WSL también puedes usar directamente la sintaxis de Linux.
¿Puedo descargar el código de ejemplo?
El enlace "Código de ejemplo" al principio de cada capítulo abre el proyecto completo de ese capítulo.
Primeros pasos
- ¿Qué es Docker?
Descubre qué es Docker, por qué se usa y cómo funcionan las imágenes, los contenedores, los registros y la arquitectura de Docker. Compara contenedores y máquinas virtuales.
- Instalar Docker
Instala Docker paso a paso en Windows (WSL 2), macOS y Linux (Ubuntu 26.04 / 24.04), comprueba la virtualización y WSL, y verifica la instalación con docker version y hello-world.
- Guía de la interfaz de Docker Desktop
Recorre la interfaz de Docker Desktop: menú lateral, contenedores, registros, archivos, proyectos Compose, imágenes, búsqueda, barra de estado y los comandos docker equivalentes.
- Primer contenedor
Ejecuta tu primer contenedor Docker con nginx: descarga una imagen con docker run, abre la web en el navegador y administra el contenedor con ps, logs, exec, stop, start y rm, también desde Docker Desktop.
- Imágenes (Image)
Aprende a nombrar imágenes Docker con registry, repository, tag y digest, y a usar pull, images, tag, rmi, history, inspect y save / load. Compara slim y alpine y descubre el formato de Docker 29.
- Ciclo de vida de los contenedores
Con salidas reales, conoce los estados de los contenedores Docker, por qué se detienen al iniciarse, stop frente a kill, los 10 segundos de espera, los códigos de salida y las políticas --restart.
- Opciones de docker run
Guía de las opciones más usadas de docker run: -d, -it, -p, -v, -e, --name, --rm, --network, --restart, --memory, --cpus, --user, --entrypoint y --read-only, con comandos y resultados reales.
- Ver registros y depurar
¿Qué hacer cuando un contenedor falla? Aprende a revisar registros con docker logs, entrar con docker exec, inspeccionar ajustes, copiar archivos y diagnosticar problemas habituales.
Imágenes y Dockerfile
- Introducción a Dockerfile
Aprende a escribir un Dockerfile con un ejemplo de Node.js. Entiende FROM, WORKDIR, COPY, RUN y CMD, la caché de compilación y cómo .dockerignore reduce el contexto de 30 MB a menos de 1 KB.
- Generación automática con docker init
Genera Dockerfile, compose.yaml, .dockerignore y README.Docker.md con docker init. Revisa el proceso, los archivos generados y sus advertencias.
- Guía completa de instrucciones de Dockerfile
Aprende las instrucciones más usadas de Dockerfile y compara CMD con ENTRYPOINT, COPY con ADD y ARG con ENV con experimentos prácticos.
- Caché de compilación y optimización
Aprende cómo funciona la caché de compilación de Docker y cuándo se invalida, cómo ordenar las instrucciones, reducir el tamaño de las imágenes y usar o borrar la caché.
- Compilaciones multietapa
Separa las herramientas de compilación del entorno de ejecución con compilaciones multietapa. Compara imágenes Go de 1,43 GB y 20,2 MB, con ejemplos para Node.js, Java y `--target`.
- Publicar en Docker Hub
Aprende a usar docker login, docker tag y docker push para publicar imágenes en Docker Hub y GitHub Container Registry, y practica con un registro privado local.
Datos y redes
- Volúmenes y persistencia de datos
¿Desaparecen los datos al eliminar un contenedor? Aprende a persistirlos con volúmenes y bind mounts, y a hacer copias de seguridad y restauraciones.
- Redes y comunicación entre contenedores
Aprende Docker networking con ejemplos: DNS en redes personalizadas, comunicación entre contenedores, alias de red, conexión con la máquina host y problemas habituales.
- Variables de entorno y .env
Aprende con ejemplos reales a usar -e, --env-file, ENV de Dockerfile y environment, env_file y sustitución de variables en Compose; descubre cómo se tratan las comillas y cómo pasar secretos de forma segura.
Docker Compose
- Introducción a Docker Compose
Introducción a Docker Compose: inicia un sitio web, PostgreSQL y Adminer con un solo compose.yaml. Incluye salidas reales y capturas del inicio, la administración y el efecto de down y down -v sobre los datos.
- Sintaxis de compose.yaml
Guía completa de la sintaxis de compose.yaml: services, image, build, ports, volumes, variables de entorno, dependencias, perfiles y configuración final.
- comandos de Docker Compose
Guía práctica de comandos de Docker Compose con sus resultados: up, down, ps, ls, images, top, logs, exec, run, pull, config y port; comprueba por qué restart no aplica cambios y cuándo usar up -d.
- Ejemplo práctico: crear un sitio con WordPress
Crea paso a paso WordPress 7 + MySQL 8.4 con Docker Compose. Incluye comprobaciones de estado, copias de seguridad, restauración y actualizaciones.
Ejemplos prácticos
- Aplicaciones Python
Empaqueta sitios Python en imágenes Docker con ejemplos de compilación y ejecución: Flask y gunicorn, recarga en caliente, FastAPI y uvicorn, Django, uv y comparación de tamaños.
- Aplicaciones Node.js
Cómo escribir un Dockerfile para Node.js: npm ci, dependencias de producción, PID 1 y SIGTERM, compilaciones multietapa con TypeScript, Next.js standalone y recarga en desarrollo.
- Nginx y proxy inverso
Sirve sitios estáticos con Nginx en Docker y configura SPA, caché y gzip. Comprueba la sintaxis, usa plantillas y variables de entorno, y configura un proxy inverso.
- MySQL
Inicia MySQL 8.4 con Docker y consulta resultados reales: variables de entorno, SQL de inicialización, utf8mb4, conexiones desde el contenedor, el host y otros contenedores, diferencias entre localhost y 127.0.0.1, errores de healthcheck en Compose, copias con mysqldump y por qué cambiar la variable de contraseña no surte efecto.
- PostgreSQL
Inicia PostgreSQL 18 con Docker con resultados reales: el nuevo directorio de datos de la versión 18, configuración de Compose, la trampa de la comprobación de estado con pg_isready, comandos habituales de psql, acceso sin contraseña dentro del contenedor, copias y restauración con pg_dump y una actualización probada de la versión 16 a la 18.
- Redis
Ejecuta Redis 8 en Docker y aprende los comandos básicos de redis-cli, las contraseñas, la persistencia RDB y AOF, maxmemory, Compose y las comprobaciones de estado.
Operación y temas avanzados
- Limpiar espacio en disco
¿Docker ocupa demasiado espacio? Averigua qué lo consume con docker system df y límpialo con prune. Incluye pruebas en Docker 29 y límites para los registros.
- Buenas prácticas de seguridad
Aprende a proteger contenedores Docker con usuarios no root, versiones fijadas, secretos de BuildKit, límites de recursos y análisis de vulnerabilidades con Trivy.
- Rootless y Podman
Descubre por qué Docker equivale a tener permisos de root, cómo funciona el modo Rootless y cómo Podman ejecuta contenedores sin un daemon permanente.
- Imágenes multiplataforma
¿La imagen que compilaste en un Mac con Apple Silicon falla con exec format error en el servidor? Aprende sobre arquitecturas de CPU e imágenes multiplataforma, compila linux/amd64 y linux/arm64 con docker buildx y compilación cruzada de Go, inspecciona el manifiesto y descubre cuándo necesitas QEMU.
- Compilación automática con GitHub Actions
Construye automáticamente imágenes de Docker multiplataforma, publícalas en GitHub Container Registry y despliégalas en un servidor por SSH. Incluye un workflow completo, reglas de etiquetas, caché de compilación y validación con actionlint.
- Despliegue en un servidor en la nube
Despliega desde cero una aplicación Docker en un servidor Linux en la nube. Incluye compilación y publicación de imágenes, Compose, Caddy con HTTPS, Node.js, PostgreSQL 18, actualizaciones, reversión, copias de seguridad y una lista de comprobación.
- Fundamentos internos
¿Qué es realmente un contenedor? Observa un host Docker: un proceso Linux aislado por namespaces, limitado por cgroups y con overlayfs como sistema de archivos.
- Mensajes de error comunes
Encuentra la causa de errores de Docker como fallos de conexión con el daemon, permission denied, puertos ocupados, archivos que faltan, health checks de Compose y problemas de PowerShell, con salida real y soluciones.
- Guía rápida de comandos de Docker
Comandos de Docker más usados en una sola página: contenedores, imágenes, compilación, Volume, redes, Compose, limpieza e información del sistema.
Referencia de comandos
- docker build
Guía completa de las opciones de docker build (-t, -f, --build-arg, --target, --no-cache, --pull, --platform, --progress, --secret, --check, -q y más), con ejemplos en Docker 29: nombrar imágenes, pasar argumentos, elegir Dockerfile, construir hasta una etapa y ver la salida completa.
- docker exec
Aprende todas las opciones de docker exec, como -it, -u, -w, -e, -d, --env-file y --privileged. Con ejemplos de shells, usuarios, directorios, variables de entorno, tareas en segundo plano y contenedores detenidos.
- docker ps
Aprende las opciones de docker ps: listar todos los contenedores, filtrar por estado, nombre o etiqueta, personalizar la salida, ver tamaños y eliminar contenedores detenidos. Con ejemplos en Docker 29.
- docker logs
Guía completa de las opciones de docker logs (-f, -n/--tail, -t, --since, --until, --details), con ejemplos en Docker 29 para filtrar, añadir marcas de tiempo, separar stdout y stderr, usar grep y seguir los registros nuevos.
- docker cp
Aprende la sintaxis de docker cp para copiar archivos y carpetas entre contenedores y el host, qué pasa cuando falta un archivo y cómo hacer copias de seguridad de bases de datos en Windows.
- docker inspect
Aprende las opciones de docker inspect y las plantillas de Go con ejemplos reales en Docker 29: estado del contenedor, IP, variables de entorno, detalles de imágenes, volúmenes, redes y el campo IPAddress eliminado.
- docker volume
Guía completa de docker volume create, ls, inspect, rm y prune, con ejemplos prácticos en Docker 29: escribir datos, encontrar volúmenes anónimos huérfanos, etiquetas y la diferencia entre prune y prune -a.
- docker network
Guía completa de los comandos docker network create, ls, inspect, connect, disconnect, rm y prune, con ejemplos probados en Docker 29.
- docker compose up
Aprende las opciones de `docker compose up`, como `--build`, `--wait`, `--scale` y `--exit-code-from`, con ejemplos prácticos en Docker Compose v5.
- docker compose down
Aprende las opciones de docker compose down, como -v, --rmi, --remove-orphans y --timeout, con ejemplos y las diferencias entre down, stop y rm.
Actualizado 14 de octubre de 2026