Instalar Jenkins en Docker
Tags: docker, sysadmin, spanish
Published: 2024-03-27 22:33:47

En este post vamos a dar una revisada de como instalar Jenkins dentro de un contenedor de Docker. Jenkins es una herramienta Open Source y es una de las herramientas más utilizadas para la automatización de tareas o generación de pipelines.

Prerequisitos:
- Tener instalado Docker
- Jalar la imagen de Docker in Docker de Docker Hub por medio del siguiente comando: docker pull docker:dind


Antes de comenzar lo que necesitamos es crear una red con Docker en este ejemplo la llamaremos jenkins.

```
docker network create jenkins
```

Posteriormente lo que necesitamos es instalar un contenedor con Docker para que tenga acceso al de Jenkins y se puede ocupar los comandos de Docker dentro de Jenkins, para ello ejecutamos la siguiente instrucción en nuestra línea de comandos.

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

Lo vamos a ir desglosando paso a paso para que sepamos que estamos haciendo con la anterior instrucción.
1. Se especifica el nombre del contenedor.
2. Se corre el contenedor en segundo plano y no se quede atado a la terminal en la que estamos ejecutando el comando.
3. Para ejecutar Docker in Docker se necesita de privilegios para ser ejecutado, es por ello que esta línea es requerida.
4. Queremos que se conecte a la red que creamos en el paso anterior.
5. Se genera una variable de entorno en donde se administrarán los certificados TLS de Docker.
6. Se crea un volumen persistente con el directorio de jenkins-docker-certs para la administración de los certificados TLS.
7. Se crea un volumen persistente con el directorio jenkins-data, este volumen ayuda a que el contenedor de Docker pueda tener acceso a Jenkins.
8. Como parte de docker run tambien queremos que ejecute la imagen de Docker in Docker pero con una pequeña configuración el driver de almacenamiento sea overlay2.

Una vez que tenemos el contenedor de Docker configurado vamos a personalizar la imagen de Jenkins para que Docker pueda autenticar los paquetes del mismo e instala dos plugings.

```
FROM jenkins/jenkins:2.440.2-jdk17
USER root
RUN apt-get update && apt-get install -y lsb-release
RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \
  https://download.docker.com/linux/debian/gpg
RUN echo "deb [arch=$(dpkg --print-architecture) \
  signed-by=/usr/share/keyrings/docker-archive-keyring.asc] \
  https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
RUN apt-get update && apt-get install -y docker-ce-cli
USER jenkins
RUN jenkins-plugin-cli --plugins "blueocean docker-workflow"
```

Ahora construimos la imagen de Jenkins de la siguiente manera:

```
docker build -t myjenkins-blueocean:2.440.2-1 .
```

Una vez creada la imagen de Jenkins la tenemos que correr son los siguientes parámetros.

```
docker run \
  --name jenkins-blueocean \
  --restart=always\
  --detach \
  --network jenkins \
  --env DOCKER_HOST=tcp://docker:2376 \
  --env DOCKER_CERT_PATH=/certs/client \
  --env DOCKER_TLS_VERIFY=1 \
  --publish 8080:8080 \
  --volume jenkins-data:/var/jenkins_home \
  --volume jenkins-docker-certs:/certs/client:ro \
  myjenkins-blueocean:2.440.2-1
```
Lo vamos a desglosar paso a paso para que entendamos que hace cada parámetro.

1. Se especifica el nombre del contenedor.
2. En caso de que el contenedor se pare se tiene que volver a levantar.
3. Se corre el contenedor en segundo plano y no se quede atado a la terminal en la que estamos ejecutando el comando.
4. Queremos que se conecte a la red que creamos en el paso anterior.
5. Se configuran las variables que son usadas por docker y docker-compose para conectar con las herramientas de Docker ya configuradas.
6. Se expone el puerto 8080 para entrar al contenedor de Jenkins a través del portal web.
7. Se generan los volúmenes tanto jenkins-data como jenkins-docker-cert

Una vez corriendo el contenedor de Jenkins se puede acceder por medio de la IP del servidor en el puerto 8080, se desplegará una pantalla como la siguiente:


![Pantalla de configuración de Jenkins](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kn18ksdj8tkz332n8x73.png)

Nos solicita que ingresemos la contraseña del administrador que la podemos obtener de la siguiente manera estando dentro del contenedor.

```
cat /var/jenkins_home/secrets/initialAdminPassword
```
Copiamos y pegamos la clave como se muestra en la imagen.


![Ejemplo de clave de administrador](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4alqvprzoqv05vva71xl.png)

De esta manera ya tendrías corriendo Jenkins.