Como desplegar Jenkins en un contenedor en Docker

En la entrada de hoy vais a aprender a desplegar una instancia de Jenkins en un contenedor de Docker.

Requisitos

Para poder seguir esté tutorial debéis tener en cuenta lo siguiente:

  • Este tutorial se ha realizado sobre Ubuntu por lo que si utilizas otras distribución de Linux es probable que algunos comandos cambien y tengas que adaptarlos.
  • Es necesario disponer de Docker instalado (sino sabes como hacerlo te dejo esta entrada donde explico el proceso de instalación). En el momento de realizar este tutorial he utilizado la versión de Docker 20.10.17

Desplegar Jenkins en un contenedor Docker

Jenkins requiere almacenamiento persistente así que el primer paso que vamos a realizar es crear un directorio donde se guardará la información de nuestro contenedor con Jenkins.

sergioportillo@ubuntuserver:/home# sudo mkdir /var/jenkins
sergioportillo@ubuntuserver:/home# sudo chown -R 1000:1000 /var/jenkins

Una vez hemos creado la carpeta donde guardaremos la información de Jenkins, el siguiente paso será desplegar un nuevo contenedor con Jenkins. Para ello utilizaremos el siguiente comando el cual paso a explicaros en detalle cada uno de los parámetros que vamos a utilizar:

  • Parámetro -d: Este parámetro nos servirá para que el contenedor se ejecute en background y no nos bloquee la terminal a la hora de iniciar el contenedor.
  • -p 8062:8062: En este parámetro le estamos indicando a docker que vamos a utilizar el puerto 8062 tanto en nuestro host como dentro del contenedor (ustedes podéis utilizar el que prefiráis) para la consulta de logs de Jenkins.
  • -p 8063:8063: Este será el puerto que utilizaremos para acceder a la interfaz web de Jenkins.
  • -e JENKINS_OPTS=»–httpPort=8063″: Aquí le estamos informando a Jenkins el cambio de puerto ya que Jenkins por defecto utiliza el puerto 8080 pero nosotros como hemos visto en el parámetro anterior queremos utilizar el puerto 8063.
  • -v /var/jenkins:/var/jenkins_home: Mediante este parámetro estamos mapeando el contenido de la carpeta local /var/jenkins que hemos creado anteriormente con la ruta /var/jenkins_home existente dentro del contenedor.
  • –name jenkins-server: Nombre personalizado que tendrá nuestro contenedor una vez se cree.
  • jenkins/jenkins:lts-jdk11: Imagen oficial de Jenkins que utilizaremos para la creación del contenedor.
sergioportillo@ubuntuserver:/home# docker run -d -p 8062:8062 -p 8063:8063 -e JENKINS_OPTS="--httpPort=8063" -v /var/jenkins:/var/jenkins_home --name jenkins-server jenkins/jenkins:lts-jdk11

Nota: En el caso que tengas algún firewall activo en tu máquina Ubuntu deberás abrir los puertos que hayas utilizado a la hora de crear el contenedor.

Esperamos unos segundos y ya sólo nos quedará abrir un navegador apuntando a la dirección IP de nuestro servidor y el puerto definido para comenzar con el asistente de configuración de Jenkins.

Ejecutar el contenedor de Jenkins como un servicio

Hasta ahora os he explicado como podéis desplegar Jenkins en un contenedor de Docker pero claro esto tiene el problema que cada vez que reinicies vuestro servidor Linux tenéis que acordaros de levantar el contenedor de Jenkins para que este vuelva a funcionar así que para solucionar este inconveniente voy a explicaros como crear un servicio el cual se encargará de levantar el contenedor de Jenkins junto con el inicio del sistema operativo.

Creacion de usuario y grupo

Lo primero que vamos a hacer es crear un usuario que se encargará de administrar el servicio que vamos a crear así como un grupo de sistema para este usuario.

sergioportillo@ubuntuserver:/var/jenkins# sudo groupadd --system jenkins
sergioportillo@ubuntuserver:/var/jenkins# sudo useradd -s /sbin/nologin --system -g jenkins jenkins

A continuación vamos a agregar al nuevo usuario que hemos creado dentro del grupo de docker para que así éste pueda interactuar con Docker.

sergioportillo@ubuntuserver:/var/jenkins# sudo usermod -aG docker jenkins

Creación del servicio

Una vez hemos creado el usuario que vamos a utilizar el siguiente paso será crear nuestro servicio que se encargará de levantar el contenedor de Jenkins junto con el inicio del sistema.

Con nuestro editor de texto favorito, yo voy a utilizar nano, creamos el siguiente archivo:

sergioportillo@ubuntuserver:/var/jenkins# sudo nano /etc/systemd/system/jenkins-docker.service

Copiamos y pegamos lo siguiente.

Nota: Modificar el comando de ejecución del contenedor con vuestros parámetros (puertos utilizados, nombre del contenedor, etc…)

[Unit]
Description=Servidor Jenkins
After=docker.service
Requires=docker.service

[Service]
Type=simple
User=jenkins
Group=jenkins
TimeoutStartSec=0
Restart=on-failure
RestartSec=30s
ExecStartPre=-/usr/bin/docker kill jenkins-server
ExecStartPre=-/usr/bin/docker rm jenkins-server
ExecStartPre=/usr/bin/docker pull jenkins/jenkins:lts-jdk11
ExecStart=/usr/bin/docker run -p 8062:8062 -p 8063:8063 -e JENKINS_OPTS="--httpPort=8063" -v /var/jenkins:/var/jenkins_home --name jenkins-server jenkins/jenkins:lts-jdk11
SyslogIdentifier=jenkins
ExecStop=/usr/bin/docker stop jenkins-server

[Install]
WantedBy=multi-user.target

Refrescamos los servicios existentes en el sistema, iniciamos nuestro servicio y le indicamos a Linux que inicie junto con el sistema.

sergioportillo@ubuntuserver:/var/jenkins# sudo systemctl daemon-reload
sergioportillo@ubuntuserver:/var/jenkins# sudo systemctl start jenkins-docker
sergioportillo@ubuntuserver:/var/jenkins# sudo systemctl enable jenkins-docker

Y listo de esta forma tan sencilla podéis iniciar vuestro contenedor de Jenkins como si fuera un servicio y lo que es más importante a partir de ahora se iniciará el contenedor junto con el arranque del sistema operativo.

Como siempre espero que os haya sido de utilidad.

Entradas relacionadas

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.