Saltar al contenidoPedro Farbo
Lección 21 / 2555 min

Docker y Contenedores

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 -d

Health 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! 🚀

¿Te gustó el contenido? ¡Tu contribución ayuda a mantener todo online y gratuito!

PIX:0737160d-e98f-4a65-8392-5dba70e7ff3e