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
- Comandos básicos para la gestión de contenedores en Docker
- Creación de imágenes personalizadas en Docker
- Visualización en tiempo real del estado de un Clúster en Docker
- Que son y como se configuran los servicios en Docker
- Como crear un Clúster en Docker
- Instalar Docker en CentOS 8
- Instalar Docker en Windows Server 2019
- Instalar Docker en Windows 10
- Redes en Docker
Me dedico a la Administración de Sistemas y he creado este blog para compartir mis conocimientos con toda la comunidad y así aportar mi granito de arena y ayudar a todo el que lo necesite.