“En mi máquina funciona” es una frase que todo desarrollador conoce muy bien. Docker resuelve esto empaquetando tu aplicación y sus dependencias en contenedores portátiles. Este artículo explica cómo configurar un entorno de desarrollo local con Docker.
Los tres conceptos fundamentales
- Dockerfile: Un plano para tu contenedor — qué imagen base usar y qué instalar.
- docker-compose.yml: Un archivo de configuración para gestionar múltiples contenedores (servidor web, base de datos, caché, etc.) juntos.
- Montaje de volumen: Permite que el contenedor haga referencia a archivos en tu máquina host. Esencial para la recarga en caliente.
Configuración de múltiples servicios con docker-compose
Una configuración típica de frontend + backend + base de datos se puede definir en un solo docker-compose.yml:
version: "3.9"
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
volumes:
- ./frontend:/app
- /app/node_modules
command: npm run dev
backend:
build: ./backend
ports:
- "8000:8000"
volumes:
- ./backend:/app
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/app
db:
image: postgres:16
ports:
- "5432:5432"
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: app
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
Puntos clave
- Montajes de volumen como
./frontend:/appsincronizan el código fuente del host en el contenedor. Los cambios en el host se reflejan instantáneamente dentro del contenedor, manteniendo la recarga en caliente. - Volumen anónimo para
node_modules: La entrada/app/node_modulesevita la sincronización con el host, evitando problemas de compatibilidad de módulos nativos entre Windows y Linux. - Variables de entorno: Pasa configuración como cadenas de conexión de base de datos a través del bloque
environment.
Dockerfile amigable para desarrollo
Es práctica común mantener un Dockerfile separado para desarrollo:
FROM node:20-alpine
WORKDIR /app
# Instalar dependencias primero (aprovechar el caché de capas)
COPY package*.json ./
RUN npm install
# El código fuente se monta por volumen, no se necesita COPY
CMD ["npm", "run", "dev"]
El truco es no usar COPY para el código fuente en la imagen. En su lugar, monta el directorio host a través de volumes en docker-compose.yml. De esta manera, los cambios en el código surten efecto inmediatamente sin reconstruir el contenedor.
Consistencia en el equipo
El verdadero valor de Docker en el desarrollo local es que todos ejecutan el mismo entorno. Algunas reglas de equipo son muy útiles:
- Haz commit de
docker-compose.ymlyDockerfilea Git. - Agrega
.env(secretos) a.gitignoree incluye.env.exampleen el repositorio. - Proporciona comandos envolventes en un
Makefileonpm scriptspara que los miembros del equipo no familiarizados con Docker puedan empezar fácilmente.
up:
docker compose up -d
down:
docker compose down
build:
docker compose build
logs:
docker compose logs -f
Problemas comunes
- Rendimiento: Los montajes de archivos pueden ser lentos en Windows, especialmente sin WSL2. Ejecuta Docker Desktop en WSL2 o considera herramientas de sincronización como Mutagen.
- Conflictos de puertos: Si múltiples proyectos usan el mismo puerto (ej., 3000), cambia el puerto del lado host en la configuración
ports(ej.,"3001:3000"). - Limpieza de volúmenes: Los volúmenes obsoletos se acumulan con el tiempo. Ejecuta
docker compose down -vpara limpiarlos.
Resumen
La mayor ventaja de Docker para el desarrollo local es la reproducibilidad y la consistencia del equipo. Usar docker-compose para gestionar múltiples servicios juntos mientras se mantiene la recarga en caliente a través de montajes de volumen te da lo mejor de ambos mundos. Pruébalo en un proyecto pequeño primero, luego expande al flujo de trabajo completo de tu equipo.

