TechLead
DevOps
8 de febrero de 202610 min de lectura

Configurando CI/CD con Docker y GitHub Actions: Guía 2026

Aprende a construir un pipeline CI/CD completo usando Docker y GitHub Actions. Desde builds multi-etapa hasta despliegues automatizados, esta guía cubre todo lo necesario para flujos de trabajo listos para producción.

Por TechLead
Docker
CI/CD
GitHub Actions
DevOps
Despliegue

Un pipeline CI/CD bien diseñado es la columna vertebral de la entrega moderna de software. Al combinar Docker para entornos consistentes con GitHub Actions para automatización, puedes construir, probar y desplegar con confianza.

1. ¿Por Qué Docker + GitHub Actions?

  • Reproducibilidad: Docker asegura que tu app se construya y ejecute de la misma manera en todas partes — tu laptop, servidor CI y producción.
  • Velocidad: Los builds multi-etapa y el caché de capas reducen drásticamente los tiempos de construcción.
  • Tier gratuito: GitHub Actions ofrece 2,000 minutos/mes gratis en repos públicos.

2. Escribiendo un Dockerfile de Producción

Usa builds multi-etapa para mantener tu imagen final ligera. Este patrón típicamente reduce el tamaño de la imagen en un 60-80%.

3. Workflow de GitHub Actions

Crea .github/workflows/deploy.yml con jobs para build, test y deploy.

4. Optimizaciones Clave

  • Caché de capas: Docker solo construye capas modificadas. Ordena tu Dockerfile de menos a más frecuentemente cambiado.
  • BuildKit: Habilita BuildKit por defecto, dándote builds paralelos y mejor caché.
  • .dockerignore: Excluye node_modules, .git, y archivos de test para acelerar el contexto de build.

5. Health Checks y Monitoreo

Agrega un health check a tu Dockerfile para que los orquestadores sepan cuándo tu app está lista.

6. Mejores Prácticas de Seguridad

  • Nunca almacenes secretos en imágenes Docker. Usa GitHub Actions secrets e inyéctalos en tiempo de ejecución.
  • Ejecuta contenedores como usuario no-root: USER node
  • Escanea imágenes por vulnerabilidades: docker scout cves myapp:latest
  • Fija versiones de imágenes base en lugar de usar :latest