Featured image of post Configuración de un entorno de desarrollo local con DockerFeatured image of post Configuración de un entorno de desarrollo local con Docker

Configuración de un entorno de desarrollo local con Docker

Configura un entorno de desarrollo local confiable con Docker. Reduce las discrepancias de entorno y optimiza tu flujo de trabajo.

“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:/app sincronizan 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_modules evita 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.yml y Dockerfile a Git.
  • Agrega .env (secretos) a .gitignore e incluye .env.example en el repositorio.
  • Proporciona comandos envolventes en un Makefile o npm scripts para 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 -v para 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.