- Un contenedor es una caja ligera y aislada que ejecuta tu aplicación.
- Una imagen es la receta. Un contenedor es una copia en ejecución de ella.
- Un Dockerfile describe cómo construir una imagen.
- Los volúmenes protegen los datos. Compose ejecuta muchos contenedores juntos.
Construyes una aplicación en tu portátil. Funciona bien. Tu compañero la ejecuta y le salen errores, porque tiene otra versión de Python, falta una biblioteca u otra configuración. Pasan horas buscando la diferencia.
Docker elimina este problema. La misma caja se ejecuta igual en tu portátil, en tu servidor y en tu pipeline de CI.
¿Qué es Docker?
Docker es una herramienta para construir y ejecutar contenedores. Un contenedor contiene tu aplicación más las herramientas y bibliotecas exactas que necesita. Usa el núcleo del sistema operativo del equipo anfitrión, así que arranca en segundos y usa mucha menos memoria que una máquina virtual completa.
| Punto | Contenedor | Máquina virtual |
|---|---|---|
| Tamaño | Normalmente megabytes | Normalmente gigabytes |
| Tiempo de arranque | Segundos | Minutos |
| Aislamiento | A nivel de proceso | Sistema operativo completo |
| Ideal para | Aplicaciones y servicios | Ejecutar distintos sistemas operativos |
Conceptos clave
- Imagen: una plantilla de solo lectura. Contiene tu aplicación y su configuración.
- Contenedor: una instancia en ejecución de una imagen.
- Dockerfile: un archivo de texto con los pasos para construir una imagen.
- Registro: un lugar donde almacenar imágenes, como Docker Hub.
- Volumen: almacenamiento que vive fuera del contenedor.
- Red: una forma de que los contenedores hablen entre sí.
Piensa en una imagen como la receta de una tarta con sus ingredientes, y en un contenedor como una tarta que has horneado con ella. Puedes hornear muchas tartas con una sola receta.
Instala Docker y comprueba que funciona
Instala Docker Desktop en Windows o macOS, o Docker Engine en Linux, desde el sitio web oficial de Docker. Luego abre una terminal y ejecuta:
docker --version
docker run hello-world
Si ves un mensaje “Hello from Docker!”, todo está configurado.
Ejecuta tu primer contenedor real
Vamos a ejecutar un servidor web llamado nginx:
docker run -d -p 8080:80 --name my-web nginx
-dlo ejecuta en segundo plano.-p 8080:80asigna el puerto 8080 de tu ordenador al puerto 80 dentro del contenedor.--name my-weble da un nombre amigable.
Abre http://localhost:8080 en tu navegador. Deberías ver la página de bienvenida de nginx. Docker descargó la imagen por ti la primera vez.
Comandos esenciales de Docker
| Comando | Qué hace |
|---|---|
docker ps |
Lista los contenedores en ejecución (añade -a para todos) |
docker images |
Lista las imágenes de tu máquina |
docker logs my-web |
Muestra los registros de un contenedor |
docker exec -it my-web sh |
Abre una shell dentro de un contenedor |
docker stop my-web |
Detiene un contenedor |
docker rm my-web |
Elimina un contenedor detenido |
docker rmi nginx |
Elimina una imagen |
docker system prune |
Limpia datos sin usar (lee antes el aviso) |
Escribe un Dockerfile
Ahora empaqueta tu propia aplicación. Supón que tienes una pequeña aplicación de Node.js con package.json y server.js. Crea un archivo llamado Dockerfile:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Qué hace cada línea:
FROMelige la imagen base. Las versiones Alpine son pequeñas.WORKDIRdefine la carpeta de trabajo dentro de la imagen.COPY package*.jsonyRUN npm ciinstalan primero las dependencias. Docker guarda en caché esta capa, así que las reconstrucciones son más rápidas cuando solo cambia tu código.COPY . .añade el resto de tu código.CMDes el comando que inicia la aplicación.
Añade un archivo .dockerignore con node_modules y .git para no copiarlos a la imagen. Luego construye y ejecuta:
docker build -t my-app:1.0 .
docker run -d -p 3000:3000 my-app:1.0
Conserva los datos con volúmenes
Cuando eliminas un contenedor, sus datos desaparecen. Para los datos que quieres conservar, como una base de datos, usa un volumen:
docker volume create pgdata
docker run -d --name db -e POSTGRES_PASSWORD=change-me \
-v pgdata:/var/lib/postgresql/data postgres:16
Ahora puedes borrar y volver a crear el contenedor, y los datos se quedan. Si estás aprendiendo bases de datos, nuestro tutorial de SQL para principiantes combina muy bien con esto.
Conecta contenedores con redes
Los contenedores de la misma red definida por el usuario pueden alcanzarse por su nombre:
docker network create app-net
docker run -d --network app-net --name db postgres:16
docker run -d --network app-net --name api my-app:1.0
Dentro de api, ya puedes conectarte a la base de datos con el nombre de host db.
Ejecuta muchos contenedores con Docker Compose
Escribir comandos largos cansa. Docker Compose te permite describir todos los servicios en un único archivo, compose.yaml:
services:
api:
build: .
ports:
- "3000:3000"
environment:
DATABASE_URL: postgres://postgres:change-me@db:5432/app
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: change-me
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
Inicia todo con un comando y deténlo con otro:
docker compose up -d
docker compose down
Buenas prácticas
- Usa imágenes base pequeñas y oficiales y fija una versión, no
latest. - No ejecutes como root dentro del contenedor cuando puedas evitarlo.
- No pongas nunca secretos en la imagen ni en el Dockerfile. Pásalos en tiempo de ejecución.
- Un proceso principal por contenedor.
- Analiza las imágenes en busca de problemas conocidos antes de lanzarlas.
- Usa CI para construir y probar las imágenes automáticamente. Consulta nuestra guía de GitHub Actions.
Consejo: ejecuta también tus pruebas dentro de un contenedor. Da el mismo resultado en cada máquina y hace más estables las pruebas end-to-end.
Preguntas frecuentes
¿Para qué se usa Docker?
Docker empaqueta las aplicaciones con sus dependencias para que se ejecuten igual en todas partes. Se usa para el desarrollo, las pruebas, el despliegue y para ejecutar muchos servicios juntos.
¿Cuál es la diferencia entre una imagen y un contenedor?
Una imagen es una plantilla fija. Un contenedor es una copia en ejecución creada a partir de esa imagen.
¿Es Docker lo mismo que una máquina virtual?
No. Los contenedores comparten el núcleo del anfitrión y son mucho más ligeros. Una máquina virtual ejecuta un sistema operativo invitado completo.
¿Necesito Docker Compose?
No lo necesitas para un solo contenedor, pero hace mucho más fácil iniciar y compartir aplicaciones con varias partes, como una API y una base de datos.
¿Es gratis aprender Docker?
Sí. Docker Engine es de código abierto y Docker Desktop tiene opciones para el aprendizaje personal. Consulta el sitio de Docker para ver las condiciones de licencia actuales para empresas.
Sigue aprendiendo
¿Necesitas ayuda con testing, WordPress o SEO?
Ayudamos a los equipos a lanzar mejor software y a hacer crecer sus sitios. Cuéntanos en qué trabajas y te sugeriremos un siguiente paso claro.
Más guías sobre testing, IA y desarrollo moderno
¿Te gustó este artículo? Elige otro tutorial y sigue aprendiendo.
RAG vs fine-tuning vs prompt engineering: ¿cómo deben elegir los desarrolladores?
¿Debes usar RAG, fine-tuning o prompt engineering? Aprende qué hace cada uno, cuánto cuesta y una guía de decisión sencilla para tu próximo proyecto de IA.
Leer artículo →Desarrollo de softwareTutorial de JavaScript para principiantes: guía completa de JavaScript
Aprende JavaScript desde cero. Entiende las variables, las funciones, los arrays, los objetos, el DOM, los eventos, las promesas y async/await, y construye un pequeño proyecto interactivo.
Leer artículo →Desarrollo de softwareTutorial de Python para principiantes: guía completa de programación en Python
Aprende Python desde cero. Cubre variables, tipos de datos, bucles, funciones, listas, diccionarios, archivos, clases y API, y crea un pequeño proyecto para practicar.
Leer artículo →