Docker y Contenedores
Containeriza tu aplicación para desarrollo y producción.
Dockerfile
dockerfile
# DockerfileFROM node:20-alpine AS base WORKDIR /appCOPY package*.json ./ # DesarrolloFROM base AS developmentRUN npm installCOPY . .CMD ["npm", "run", "dev"] # BuildFROM base AS buildRUN npm ciCOPY . .RUN npm run buildRUN npm prune --production # ProducciónFROM node:20-alpine AS productionWORKDIR /app COPY --from=build /app/dist ./distCOPY --from=build /app/node_modules ./node_modulesCOPY --from=build /app/package.json ./ USER nodeEXPOSE 3000CMD ["node", "dist/server.js"]Docker Compose para Desarrollo
yaml
# docker-compose.ymlversion: '3.8' services: api: build: context: . target: development ports: - "3000:3000" volumes: - .:/app - /app/node_modules environment: - NODE_ENV=development - DATABASE_URL=postgresql://postgres:postgres@db:5432/ecommerce - REDIS_URL=redis://redis:6379 depends_on: - db - redis db: image: postgres:15-alpine ports: - "5432:5432" environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: ecommerce volumes: - postgres_data:/var/lib/postgresql/data redis: image: redis:7-alpine ports: - "6379:6379" volumes: - redis_data:/data adminer: image: adminer ports: - "8080:8080" volumes: postgres_data: redis_data:Docker Compose para Producción
yaml
# docker-compose.prod.ymlversion: '3.8' services: api: build: context: . target: production ports: - "3000:3000" environment: - NODE_ENV=production - DATABASE_URL=${DATABASE_URL} - REDIS_URL=${REDIS_URL} - JWT_SECRET=${JWT_SECRET} restart: unless-stopped healthcheck: test: ["CMD", "wget", "-qO-", "http://localhost:3000/health"] interval: 30s timeout: 10s retries: 3 nginx: image: nginx:alpine ports: - "80:80" - "443:443" volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ./ssl:/etc/nginx/ssl depends_on: - api.dockerignore
node_modules
dist
.git
.env*
*.log
coverage
.nyc_output
Comandos Útiles
bash
# Desarrollodocker-compose up -ddocker-compose logs -f api # Ejecutar migracionesdocker-compose exec api npx prisma migrate deploy # Build de produccióndocker build -t ecommerce-api:latest --target production . # Correr en produccióndocker-compose -f docker-compose.prod.yml up -dHealth Check Endpoint
typescript
// src/routes/health.routes.tsrouter.get('/health', async (req, res) => { try { await prisma.$queryRaw`SELECT 1`; await redis.ping(); res.json({ status: 'healthy', timestamp: new Date().toISOString(), services: { database: 'connected', redis: 'connected', }, }); } catch (error) { res.status(503).json({ status: 'unhealthy', error: error.message, }); }});Resumen
- ✅ Multi-stage Dockerfile
- ✅ Docker Compose para dev
- ✅ Compose para producción
- ✅ Health checks
Próxima clase: Deploy en Producción! 🚀