codigo0/docs/consolidado/DEPLOYMENT_DOCKER.md

7.2 KiB

🐳 Guía de Despliegue con Docker

Proyecto: EMERGES TES - Protocolo Rápido
Fecha: 2025-12-23
Puerto: 8607


📋 Requisitos Previos

  • Docker 20.10+ instalado
  • Docker Compose 2.0+ instalado
  • Git instalado
  • Puerto 8607 disponible

🚀 Despliegue Rápido

Opción 1: Script de Deploy Automático (Recomendado)

# Ejecutar script de deploy con Docker
./docker.sh

Este script:

  1. Actualiza código desde GitHub
  2. Construye imagen Docker
  3. Inicia contenedores
  4. Verifica que todo funciona

Opción 2: Comandos Manuales

Desarrollo

# Construir e iniciar contenedores
docker-compose up --build

# O en modo detached (background)
docker-compose up -d --build

# Ver logs
docker-compose logs -f

# Detener
docker-compose down

Producción

# Usar archivo de producción
docker-compose -f docker-compose.prod.yml up -d --build

# Ver logs
docker-compose -f docker-compose.prod.yml logs -f

# Detener
docker-compose -f docker-compose.prod.yml down

📁 Archivos Docker

Dockerfile

Ubicación: Dockerfile

Características:

  • Multi-stage build (optimizado)
  • Node.js 18 Alpine (imagen ligera)
  • Build de producción con Vite
  • Servidor serve en puerto 8607
  • Healthcheck configurado

Etapas:

  1. Dependencies: Instala dependencias npm
  2. Build: Construye aplicación con Vite
  3. Production: Imagen final con solo archivos necesarios

docker-compose.yml (Desarrollo)

Ubicación: docker-compose.yml

Servicios:

  • emerges-tes: Aplicación principal
    • Puerto: 8607:8607
    • Volúmenes: Código fuente montado (hot reload)
    • Red: emerges-network

Uso:

docker-compose up --build

docker-compose.prod.yml (Producción)

Ubicación: docker-compose.prod.yml

Características:

  • Sin volúmenes (imagen optimizada)
  • Restart policy: always
  • Healthcheck activado
  • Logs configurados

Uso:

docker-compose -f docker-compose.prod.yml up -d --build

🔧 Configuración

Variables de Entorno

Crear archivo .env (opcional):

NODE_ENV=production
PORT=8607

O usar variables en docker-compose.yml:

environment:
  - NODE_ENV=production
  - PORT=8607

📊 Comandos Útiles

Gestión de Contenedores

# Ver contenedores corriendo
docker ps

# Ver logs en tiempo real
docker-compose logs -f emerges-tes

# Ver logs de las últimas 100 líneas
docker-compose logs --tail=100 emerges-tes

# Reiniciar contenedor
docker-compose restart emerges-tes

# Detener y eliminar contenedores
docker-compose down

# Detener y eliminar contenedores + volúmenes
docker-compose down -v

# Eliminar imágenes también
docker-compose down --rmi all

Build y Rebuild

# Rebuild sin caché
docker-compose build --no-cache

# Rebuild solo un servicio
docker-compose build emerges-tes

# Ver tamaño de imágenes
docker images | grep emerges-tes

Inspección

# Ver configuración del servicio
docker-compose config

# Ver procesos dentro del contenedor
docker-compose exec emerges-tes ps aux

# Entrar al contenedor (shell)
docker-compose exec emerges-tes sh

# Ver uso de recursos
docker stats emerges-tes

🔄 Auto-Deploy desde GitHub

Opción 1: GitHub Actions con Docker

Actualizar .github/workflows/deploy.yml:

name: Auto Deploy Docker

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Setup Docker Buildx
        uses: docker/setup-buildx-action@v3
      
      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: false
          tags: emerges-tes:latest
      
      - name: Deploy to server
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SERVER_SSH_KEY }}
          script: |
            cd ${{ secrets.APP_PATH }}
            ./docker.sh            

Opción 2: Webhook con Docker

Actualizar webhook-deploy.sh:

#!/bin/bash
cd /ruta/a/tu/app
./docker.sh

🐛 Solución de Problemas

Error: "Port 8607 is already in use"

# Ver qué proceso usa el puerto
sudo lsof -i :8607
# O
sudo netstat -tlnp | grep 8607

# Detener contenedor Docker
docker-compose down

# O cambiar puerto en docker-compose.yml
ports:
  - "8608:8607"  # Puerto externo diferente

Error: "Cannot connect to Docker daemon"

# Verificar que Docker está corriendo
sudo systemctl status docker

# Iniciar Docker
sudo systemctl start docker

# Añadir usuario al grupo docker (si es necesario)
sudo usermod -aG docker $USER
# Luego cerrar sesión y volver a entrar

Error: "Build failed"

# Rebuild sin caché
docker-compose build --no-cache

# Ver logs detallados
docker-compose build --progress=plain

# Verificar Dockerfile
docker build -t test-image .

Contenedor se detiene inmediatamente

# Ver logs del contenedor
docker-compose logs emerges-tes

# Verificar healthcheck
docker inspect emerges-tes | grep -A 10 Health

# Ejecutar comando manualmente
docker-compose run --rm emerges-tes sh

📈 Optimización

Tamaño de Imagen

Estrategias:

  • Multi-stage build (ya implementado)
  • Alpine Linux (imagen base ligera)
  • Solo archivos necesarios en imagen final
  • .dockerignore configurado

Verificar tamaño:

docker images | grep emerges-tes

Caché de Build

Docker usa caché automáticamente. Para forzar rebuild completo:

docker-compose build --no-cache

🔒 Seguridad

Buenas Prácticas

  1. No exponer credenciales en Dockerfile
  2. Usar variables de entorno para secrets
  3. Usar usuario no-root en contenedor (si es posible)
  4. Mantener imágenes actualizadas
  5. Escanear imágenes con docker scan

Escanear Vulnerabilidades

docker scan emerges-tes:latest

📝 Checklist de Despliegue

  • Docker y Docker Compose instalados
  • Puerto 8607 disponible
  • Archivo .env configurado (opcional)
  • docker-compose.yml revisado
  • Build exitoso: docker-compose build
  • Contenedor inicia: docker-compose up -d
  • App accesible: http://localhost:8607
  • Logs sin errores: docker-compose logs
  • Healthcheck OK: docker inspect
  • Auto-deploy configurado (opcional)

🆚 Comparación: Docker vs PM2

Característica Docker PM2
Aislamiento Completo No
Portabilidad Alta ⚠️ Media
Gestión docker-compose PM2
Recursos ⚠️ Más uso Menos uso
Escalabilidad Fácil ⚠️ Manual
Dependencias Incluidas Requiere Node

Recomendación: Usar Docker para producción, PM2 para desarrollo rápido.


📞 Soporte

Si tienes problemas:

  1. Revisar logs: docker-compose logs -f
  2. Verificar configuración: docker-compose config
  3. Rebuild sin caché: docker-compose build --no-cache
  4. Verificar puerto: netstat -tlnp | grep 8607

Última actualización: 2025-12-23