Instalación de Jenkins - Eziuz/Proyecto-POLI-Generador-de-Claves GitHub Wiki

📋 Instalación de Jenkins con Docker

Esta guía te llevará paso a paso para instalar Jenkins con soporte completo para Docker, necesario para nuestro pipeline de CI/CD.

🎯 ¿Por qué Jenkins con Docker?

Nuestro pipeline necesita Docker dentro de Jenkins para:

  • 🏗️ Construir imágenes Docker de la aplicación
  • Verificar las imágenes creadas
  • 📦 Publicar en Docker Hub
  • 🧹 Limpiar recursos automáticamente

🏗️ Arquitectura de la Instalación

graph TB
    A[🌐 Red Jenkins] --> B[🐳 Docker-in-Docker Container]
    A --> C[🤖 Jenkins Controller]
    B --> D[📦 Construcción de Imágenes]
    C --> E[🔄 Pipeline Execution]
    E --> D
    
    F[📁 jenkins-data Volume] --> C
    G[🔐 jenkins-docker-certs Volume] --> B
    G --> C
    
    style A fill:#e3f2fd
    style B fill:#f3e5f5
    style C fill:#e8f5e8

📋 Prerrequisitos

Antes de comenzar, asegúrate de tener:

  • Docker Desktop instalado y ejecutándose
  • 8GB RAM mínimo disponible
  • 10GB de espacio en disco
  • Puertos 8080 y 50000 disponibles
  • Permisos de administrador en tu sistema

Verificar Docker

# Verificar que Docker está funcionando
docker --version
docker ps

# Deberías ver algo como:
# Docker version 24.0.x, build xxxxx

🚀 Instalación Paso a Paso

Paso 1: Crear Red de Jenkins

docker network create jenkins

¿Qué hace este comando?

  • 🌐 Crea una red Docker personalizada llamada jenkins
  • 🔗 Permite comunicación entre contenedores Jenkins y Docker
  • 🛡️ Aísla el tráfico de otros contenedores del sistema
  • 📡 Habilita resolución DNS automática entre contenedores

¿Por qué es importante?

  • Jenkins necesita comunicarse con el daemon Docker para construir imágenes
  • La red personalizada proporciona mejor seguridad y control
  • Permite usar nombres de contenedor como hostnames

Paso 2: Ejecutar Docker-in-Docker (DinD)

docker run \
  --name jenkins-docker \
  --rm \
  --detach \
  --privileged \
  --network jenkins \
  --network-alias docker \
  --env DOCKER_TLS_CERTDIR=/certs \
  --volume jenkins-docker-certs:/certs/client \
  --volume jenkins-data:/var/jenkins_home \
  --publish 2376:2376 \
  docker:dind \
  --storage-driver overlay2

Análisis detallado de cada parámetro:

Parámetro Propósito ¿Por qué es necesario?
--name jenkins-docker Nombre del contenedor Identificación fácil y referencia
--rm Auto-eliminar al parar Limpieza automática
--detach Ejecutar en background No bloquea la terminal
--privileged Permisos elevados Docker necesita acceso al kernel
--network jenkins Conectar a red Jenkins Comunicación con Jenkins
--network-alias docker Alias de red Jenkins puede conectar via docker:2376
--env DOCKER_TLS_CERTDIR=/certs Habilitar TLS Comunicación segura
--volume jenkins-docker-certs:/certs/client Certificados TLS Compartir certificados con Jenkins
--volume jenkins-data:/var/jenkins_home Datos de Jenkins Persistencia de configuración
--publish 2376:2376 Puerto Docker daemon Acceso externo al daemon
--storage-driver overlay2 Driver de almacenamiento Mejor rendimiento

⚠️ Nota de Seguridad: El flag --privileged otorga acceso completo al host. En producción, considera alternativas más seguras como Docker socket mounting.

Paso 3: Crear Dockerfile Personalizado de Jenkins

Crea un archivo llamado Dockerfile con el siguiente contenido:

FROM jenkins/jenkins:2.504.2-jdk21
USER root
RUN apt-get update && apt-get install -y lsb-release ca-certificates curl && \
    install -m 0755 -d /etc/apt/keyrings && \
    curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc && \
    chmod a+r /etc/apt/keyrings/docker.asc && \
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
    https://download.docker.com/linux/debian $(. /etc/os-release && echo \"$VERSION_CODENAME\") stable" \
    | tee /etc/apt/sources.list.d/docker.list > /dev/null && \
    apt-get update && apt-get install -y docker-ce-cli && \
    apt-get clean && rm -rf /var/lib/apt/lists/*
USER jenkins
RUN jenkins-plugin-cli --plugins "blueocean docker-workflow json-path-api"

¿Qué hace cada sección?

Base Image

FROM jenkins/jenkins:2.504.2-jdk21
  • 📦 Imagen oficial de Jenkins con Java 21
  • 🔒 Versión específica para reproducibilidad
  • LTS (Long Term Support) para estabilidad

Instalación de Docker CLI

USER root
RUN apt-get update && apt-get install -y lsb-release ca-certificates curl && \
    # ... instalación de Docker CLI
  • 🔧 Instala Docker CLI dentro de Jenkins
  • 🔐 Configura repositorio oficial de Docker
  • 🧹 Limpia caché para reducir tamaño de imagen

Plugins Esenciales

USER jenkins
RUN jenkins-plugin-cli --plugins "blueocean docker-workflow json-path-api"
Plugin Propósito
blueocean 🎨 Interfaz moderna y visual para pipelines
docker-workflow 🐳 Soporte para Docker en pipelines
json-path-api 📊 Procesamiento de JSON en pipelines

Paso 4: Construir Imagen Personalizada

docker build -t myjenkins-blueocean:2.504.2-1 .

¿Qué sucede aquí?

  • 🏗️ Construye la imagen con Docker CLI y plugins
  • 🏷️ Etiqueta la imagen con versión específica
  • 📦 Optimiza capas para mejor rendimiento
  • ⏱️ Tiempo estimado: 3-5 minutos

Paso 5: Ejecutar Jenkins Controller

docker run \
  --name jenkins-blueocean \
  --restart=on-failure \
  --detach \
  --network jenkins \
  --env DOCKER_HOST=tcp://docker:2376 \
  --env DOCKER_CERT_PATH=/certs/client \
  --env DOCKER_TLS_VERIFY=1 \
  --publish 8080:8080 \
  --publish 50000:50000 \
  --volume jenkins-data:/var/jenkins_home \
  --volume jenkins-docker-certs:/certs/client:ro \
  myjenkins-blueocean:2.504.2-1

Configuración detallada:

Configuración Valor Propósito
--restart=on-failure Auto-restart Recuperación automática de fallos
DOCKER_HOST tcp://docker:2376 Conexión al daemon Docker
DOCKER_CERT_PATH /certs/client Ubicación de certificados TLS
DOCKER_TLS_VERIFY 1 Verificación TLS habilitada
--publish 8080:8080 Puerto web Interfaz web de Jenkins
--publish 50000:50000 Puerto agentes Conexión de agentes Jenkins

🔓 Configuración Inicial

Paso 6: Acceder a Jenkins

  1. Abrir navegador en http://localhost:8080
  2. Esperar a que aparezca la página de desbloqueo

Paso 7: Obtener Contraseña Inicial

# Obtener la contraseña desde los logs
docker logs jenkins-blueocean

Busca una sección como esta:

*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and 
a password generated.
Please use the following password to proceed to installation:

a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

Paso 8: Completar Configuración

  1. Pegar la contraseña en el campo
  2. Seleccionar "Install suggested plugins"
  3. Crear usuario administrador
  4. Configurar URL de Jenkins (mantener http://localhost:8080)

✅ Verificación de Instalación

Verificar Docker en Jenkins

  1. Ir a "Manage Jenkins" → "Script Console"
  2. Ejecutar este script:
def sout = new StringBuilder(), serr = new StringBuilder()
def proc = 'docker --version'.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println "out> $sout err> $serr"

Resultado esperado:

out> Docker version 24.0.x, build xxxxx err>

Verificar Plugins

Ir a "Manage Jenkins" → "Manage Plugins" → "Installed"

Verificar que estén instalados:

  • ✅ Blue Ocean
  • ✅ Docker Pipeline
  • ✅ JSON Path API

🔧 Comandos Útiles

Gestión de Contenedores

# Ver estado de contenedores
docker ps

# Ver logs de Jenkins
docker logs jenkins-blueocean

# Ver logs de Docker daemon
docker logs jenkins-docker

# Reiniciar Jenkins
docker restart jenkins-blueocean

# Parar todo
docker stop jenkins-blueocean jenkins-docker

Gestión de Volúmenes

# Ver volúmenes
docker volume ls

# Backup de datos de Jenkins
docker run --rm -v jenkins-data:/data -v $(pwd):/backup alpine tar czf /backup/jenkins-backup.tar.gz -C /data .

# Restaurar backup
docker run --rm -v jenkins-data:/data -v $(pwd):/backup alpine tar xzf /backup/jenkins-backup.tar.gz -C /data

🚨 Troubleshooting

Problema: Puerto 8080 ocupado

# Verificar qué usa el puerto
lsof -i :8080

# Usar puerto alternativo
docker run ... --publish 8081:8080 ... myjenkins-blueocean:2.504.2-1

Problema: Docker daemon no accesible

# Verificar que jenkins-docker esté ejecutándose
docker ps | grep jenkins-docker

# Verificar conectividad de red
docker network inspect jenkins

Problema: Permisos de volumen

# En Linux/Mac, ajustar permisos
sudo chown -R 1000:1000 /var/lib/docker/volumes/jenkins-data/_data

📊 Recursos del Sistema

Uso Esperado

Recurso Uso Normal Uso Intensivo
RAM 2-4 GB 6-8 GB
CPU 10-20% 50-80%
Disco 5-10 GB 20-50 GB
Red Bajo Medio-Alto

Optimización

# Limitar memoria de Jenkins
docker run ... --memory=4g --memory-swap=4g ... myjenkins-blueocean:2.504.2-1

# Limitar CPU
docker run ... --cpus="2.0" ... myjenkins-blueocean:2.504.2-1

🎉 ¡Instalación Completada!

Si has llegado hasta aquí, ¡felicidades! Tienes Jenkins funcionando con soporte completo para Docker.

Próximos Pasos

  1. 🔐 Configurar Credenciales →
  2. ⚙️ Crear tu Primer Pipeline →

Verificación Final

  • ✅ Jenkins accesible en http://localhost:8080
  • ✅ Blue Ocean disponible
  • ✅ Docker CLI funcionando en Jenkins
  • ✅ Conexión con Docker daemon establecida

📚 Referencias