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
- Abrir navegador en
http://localhost:8080
- 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
- Pegar la contraseña en el campo
- Seleccionar "Install suggested plugins"
- Crear usuario administrador
- Configurar URL de Jenkins (mantener
http://localhost:8080
)
✅ Verificación de Instalación
Verificar Docker en Jenkins
- Ir a "Manage Jenkins" → "Script Console"
- 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
Verificación Final
- ✅ Jenkins accesible en
http://localhost:8080
- ✅ Blue Ocean disponible
- ✅ Docker CLI funcionando en Jenkins
- ✅ Conexión con Docker daemon establecida