Docker Compose – Configuremos Jenkins!

Si estás leyendo esto seguro que ya configuraste una imagen en docker y estás corriendo un contenedor (tranquilo, si no lo haces aún puedes revisar esto).

Y quizá este escenario se te hace conocido. Tienes que ejecutar un contenedor en diferentes puertos, diferentes stages, etc etc…

Y de seguro que tienes un bloc de notas con algo parecido a esto:

docker volume create dev-data

docker run -d \
  --name app-dev \
  -p 8081:80 \
  -e ENV=development \
  -v dev-data:/data \
  leocorp/test

Es un dolor de cabeza! Lo bueno es que tiene solución, con docker-compose pasamos de tener todas nuestras configuraciones en un bloc de notas a un archivo .yaml.

Paso a Paso

Para esta guía vamos a desplegar Jenkins, esta herramienta de CD/CI nos permite poder ejecutar pipelines!

Primera línea de nuestro archivo docker-compose.yaml:

version: '3.9'

El file format 3 está orientado a su uso en Docker Swarm y entornos modernos de docker, pero eso no lo cubriremos acá aún. Recuerda que a partir de docker compose v1.27.0 esta línea no es obligatoria.

Servicios

En nuestro archivo, siguiendo la indentación de version definiremos nuestros servicios:

services:
  jenkins:
    image: jenkins/jenkins:lts
    ports:
      - "8080:8080"
      - "50000:50000"
    restart: unless-stopped

En este bloque estamos definiendo el uso de Jenkins, específicamente la versión LTS (no es recomendable esto en aplicaciones de producción, deberías usar una versión fija). Además, especificamos los puertos, esta imagen trabaja con los puertos 8080 y 50000.

Y estamos dándole la característica a este contenedor de que se reinicie y busque estar siempre activo al menos que lo hayamos detenido manualmente.

Volúmenes

Recuerda que Jenkins trabaja con archivos para su configuración, todo esto se guarda dentro de /var/jenkins_home en nuestro contenedor.

Si queremos mantener nuestras configuraciones persistentes (y no perder todo en cada reinicio) debemos guardar esto fuera del contenedor.

¿Cómo lo hacemos? En nuestro archivo, siguiendo la indentación de services:

volumes:
  jenkins_home:

En nuestra configuración definimos el acceso a través de jenkins_home, esto crea, en caso no exista, el volumen y lo habilita para nuestros servicios.

¿Cómo lo uso en mis servicios?

Debemos modificar nuestro servicio de la siguiente manera:

services:
  jenkins:
    ...
    volumes:
      - jenkins_home:/var/jenkins_home
    ...

La relación es la siguiente:

  • jenkins_home: el nombre del volumen Docker que tenemos declarado líneas a bajo
  • /var/jenkins_home: la carpeta dentro del contenedor donde Jenkins guarda su configuración, jobs, plugins, etc.

Levantemos nuestros servicios!

Es muy sencillo, en la carpeta donde tienes el archivo docker-compose.yaml abre una terminal y ejecuta el siguiente comando:

docker compose up -d

Deberías ver lo siguiente:

Nos muestra el nombre del volumen, red y contenedor creado. Esto está con el prefijo de la carpeta donde tenemos alojado el archivo docker-compose.yaml.

Una vez iniciados los servicios puedes acceder a tu portal de Jenkins desde localhost:8080

En el primer uso de Jenkins debemos colocar una contraseña, esta contraseña la encontrarás ejecutando el siguiente comando:

 docker logs dc-jenkins-jenkins-1

o

docker compose logs -f

Y busca la siguiente línea en la consola, esa es tu contraseña!

Escribiré una entrada detallando las configuraciones propias de Jenkins, te recomiendo sumergirte en esta nueva plataforma haciendo uso de la documentación oficial

Posibles errores

Si te da un error de conexión con el daemon, probablemente tu servicio de docker no se encuentra en ejecución

Puedes comprobar tus servicios de docker con

docker ps

¿Cómo debería verse?

Conclusiones

¿Por qué deberíamos usar hojas de configuración y no guardar los comandos en un bloc de notas?

Docker Compose nos brinda lo siguiente:

  • Agrupación de servicios, todos los contenedores en un solo archivo.
  • Ejecución simple, up y detached.
  • Mismo entorno, tenemos toda nuestra configuración en un archivo YAML fácil de versionar.

Ahora solo te queda empaquetar todo! Puedes practicar migrando a docker compose tus bases de datos, aplicaciones, volúmenes, etc!. Suerte 😉