Si llevas un tiempo en el mundo del desarrollo web, seguramente has escuchado hablar de Docker. Pero si nunca lo has usado, probablemente te ha parecido algo complicado o solo para devops. En esta guía te demuestro que no es así.
Docker es una herramienta que todo desarrollador web debería conocer. No porque sea obligatorio, sino porque una vez que la usas, no entiendes cómo vivías sin ella.
En este artículo:
- ¿Qué es Docker y por qué lo necesitas?
- Conceptos clave: imagen, contenedor y volumen
- Cómo instalar Docker
- Tu primer contenedor en 5 minutos
- Crear tu propio Dockerfile
- Docker Compose para proyectos reales
- Comandos esenciales que usarás cada día
- Errores comunes al empezar
¿Qué es Docker y por qué lo necesitas?
Docker es una plataforma que permite empaquetar una aplicación y todas sus dependencias en un contenedor. Un contenedor es un entorno aislado y reproducible que funciona exactamente igual en cualquier máquina: en tu portátil, en el servidor de producción, en el ordenador de tu compañero de trabajo.
El problema que resuelve Docker es el clásico «en mi máquina funciona». Con Docker, si funciona en tu contenedor, funciona en cualquier sitio.
Como desarrollador web, Docker te permite:
- Levantar un entorno de desarrollo completo (base de datos, backend, frontend) con un solo comando.
- Evitar conflictos entre versiones de Node.js, Java, Python, etc. en tu máquina.
- Compartir el entorno de desarrollo con tu equipo sin que nadie tenga que configurar nada manualmente.
- Desplegar aplicaciones a producción de forma consistente y predecible.
Conceptos clave: imagen, contenedor y volumen
Antes de empezar con comandos, hay tres conceptos que tienes que entender bien:
Imagen: una plantilla de solo lectura que define todo lo que contiene un contenedor. Es como una fotografía del sistema de archivos y la configuración. Las imágenes se construyen a partir de un Dockerfile y se pueden guardar en registros como Docker Hub.
Contenedor: una instancia en ejecución de una imagen. Puedes crear varios contenedores a partir de la misma imagen. Son ligeros, aislados y efímeros: cuando lo eliminas, desaparece todo lo que había dentro (a menos que uses volúmenes).
Volumen: un mecanismo para persistir datos fuera del contenedor. Si tienes una base de datos en un contenedor, los datos se guardan en un volumen para que no desaparezcan al eliminar el contenedor.
Cómo instalar Docker
La forma más sencilla de instalar Docker en tu máquina de desarrollo es mediante Docker Desktop, disponible para Windows, Mac y Linux. Incluye Docker Engine, Docker CLI y Docker Compose.
Descárgalo desde docker.com/products/docker-desktop e instálalo como cualquier otra aplicación. Una vez instalado, verifica que funciona correctamente:
# Verifica la versión de Docker
docker --version
# Verifica que Docker está corriendo
docker ps
# Descarga y ejecuta un contenedor de prueba
docker run hello-world
Tu primer contenedor en 5 minutos
Vamos a crear un contenedor con Nginx para ver cómo funciona todo en la práctica:
docker run -d -p 8080:80 --name mi-nginx nginx
Ahora abre http://localhost:8080 en tu navegador. Verás la página de bienvenida de Nginx. Con un solo comando tienes un servidor web funcionando.
Crear tu propio Dockerfile
Un Dockerfile es un archivo de texto con las instrucciones para construir una imagen personalizada. Vamos a crear una imagen para una aplicación Node.js:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Docker Compose para proyectos reales
Cuando tu proyecto tiene varios servicios (API + base de datos + frontend), Docker Compose te permite definir y orquestar todos en un único archivo docker-compose.yml:
version: '3.8'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: miapp
volumes:
- mysql_data:/var/lib/mysql
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
volumes:
mysql_data:
Con este archivo, levantar todo el stack es tan sencillo como: docker compose up -d
Comandos esenciales que usarás cada día
docker ps # Contenedores en ejecución
docker ps -a # Todos los contenedores
docker images # Listar imágenes
docker build -t mi-app . # Construir imagen
docker run -d -p 8080:80 nginx # Crear contenedor
docker stop mi-contenedor # Detener contenedor
docker rm mi-contenedor # Eliminar contenedor
docker exec -it mi-contenedor sh # Entrar en el contenedor
docker system prune # Limpiar recursos sin usar
Errores comunes al empezar
No usar .dockerignore: sin él, copiarás node_modules y archivos sensibles en la imagen. Crea siempre un .dockerignore con al menos node_modules y .env.
Copiar todo antes de instalar dependencias: el orden en el Dockerfile importa para la caché. Copia primero package.json, ejecuta npm install, y luego copia el resto del código.
Guardar datos dentro del contenedor: los contenedores son efímeros. Todo lo escrito dentro sin volúmenes se pierde al eliminarlo. Usa volúmenes para bases de datos y cualquier dato que necesites persistir.