Deploy de Spring Boot Apps utilizando Docker

2 noviembre
Gastón Iriarte – Sr. Java Developer DataArt
Deploy de Spring Boot Apps utilizando Docker
Parte 3 de 3: Deploy de los contenedores

Hemos llegado al final de nuestra serie de tres artículos referidos a la confección de una simple aplicación Spring Boot utilizando una base de datos MongoDB y su despliegue utilizando contenedores de Docker.

En esta edición vamos a utilizar código y conceptos desarrollados con mayor profundidad en los artículos anteriores. Les comparto debajo los links, en el caso de que necesiten referencias:

Parte 1

Parte 2

1. Creando contenedor para MongoDB

Como primer punto vamos a tratar de crear un contenedor en el que iniciaremos un servidor de MongoDB escuchando en el puerto 27017. Al finalizar este punto podremos iniciar nuestra aplicaciòn apuntando a este servidor para verificar que el mismo funciona correctamente.

1.1 Descarga de la imagen para la instancia de MongoDB

El sitio de Docker contiene un vasto repositorio de características que se pueden descargar e instalar localmente. Una de ellas es un contenedor para levantar una instancia de MongoDB sobre un servidor Linux Ubuntu de base. La misma se encuentra acá.

1.2 Análisis del contenido del Dockerfile

Realizando un rápido análisis del contenido del Dockerfile descargado vemos que el mismo consta de varias partes:

FROM: Indicamos la imagen base desde donde creamos nuestro contenedor.

RUN apt-key y todos los RUN que se encuentran a continuación: comandos propios de la instalación del mongoDB.

EXPOSE: puerto que va a exponerse al exterior desde nuestra instancia del contenedor.

1.3 Crear la imagen del contenedor

Una vez descargado el Dockerfile desde el link anterior, podemos crear nuestra imagen del contenedor. Para ello vamos a crearla asignándole un nombre.

docker build C:\DataArt\Docker\mongodb -t mongodb_image

Al finalizar la creación de la imagen debería verse un mensaje similar al siguiente en la consola:

Successfully built a04f58a47d06

Successfully tagged mongodb_image:latest

Podemos observar las nuevas imágenes creadas utilizando el comando docker image ls:

Como vemos se han creado 2 imágenes en nuestro repositorio local. La primera es la imagen base (ubuntu) y la otra nuestra mongodb_image.

Vamos a analizar el estado de los contenedores ahora, utilizando el comando docker container ls:

Aún no se han creado contenedores. En el siguiente punto veremos cómo crearlos y como se muestran en la consola.

1.4 Puesta en ejecución de la imagen

Repasando el artículo anterior sabemos que una imagen en ejecución toma la forma de un contenedor para docker. Con lo cual al ejecutar el comando run vamos a terminar interactuando con el ciclo de vida del contenedor (más allá de la imagen de donde el mismo provino).

En este caso vamos a indicar que nuestro contenedor escuche en el puerto 27017 (dado que es el puerto por default para todas las instancias de mongodb)

docker run -p 27017:27017 mongodb_image

Al observar el mensaje “waiting for connections on port 27017” vemos que el servidor mongodb pudo inicializar correctamente.

Podemos ahora chequear el estado de los contenedores con docker container ls:

2. Creando el contenedor para nuestra aplicación spring

Volvemos ahora a la aplicación creada en la parte 1 para crear un contenedor en donde podamos arrancala. Para ello necesitamos hacer lo siguiente:

2.1 Exportar la aplicación como jar ejecutable

En primer lugar, debemos asegurarnos de que contamos con este plugin en nuestra configuración de maven:

A continuación, sencillamente corremos “mvn clean install”

El resultado debería ser un .jar que se encuentra en la carpeta target.

2.2 Creación del Dockerfile

Necesitamos crear una nueva carpeta en donde colocaremos el Dockerfile para nuestro contenedor con la aplicación springboot. Yo lo llamare “bootdocker”.

Copiamos el jar hacia ese directorio y creamos un archivo Dockerfile con el siguiente contenido:

3. Creando el docker-compose

La idea detrás de dockerCompose es proveer una herramienta que permita agrupar varios contenedores y reutilizarlos. En este ejemplo vamos a ver cómo se puede crear una composición entre el Dockerfile creado anteriormente y el contendor que contiene el mongodb. La idea es finalizar con nuestra aplicación spring levantada correctamente y utilizando la base de datos que se encuentra en el otro contenedor.

En primer lugar, debemos dirigirnos a la carpeta en que tenemos el Dockerfile con la aplicación springboot.

Luego crearemos un archivo docker-compose.yml en el cual vamos a colocar el siguiente contenido:

Finalmente, una vez guardado el archivo el contenido de nuestro directorio tendrá algo así:

Analizando el archivo docker-compose.yml puede verse que lo que estamos intentando hacer es:

  • Crear un nuevo contenedor llamado “bootdockercontainer” en el puerto 8080. Para esto docker va a realizar una búsqueda en el directorio en que estamos parados del Dockerfile.
  • Declaramos que nuestro contenedor bootdockercontainer tiene una dependencia con el contenedor que también se va a crear partiendo de la imagen “mongodb_image”. El nombre de este otro contenedor en ejecución será “mongodbcontainer”. Observar que este mismo nombre fue el que sobre escribimos en la ejecución del “java jar” dentro del Dockerfile. Esto quiere decir que una vez que el mongodb_image entre en ejecución tomará el nombre “mongodbcontainer” y el mismo también podrá ser referenciado como hostname.

4. Iniciando y probando la aplicación

Una vez definido el archivo docker-compose.yml dentro de la carpeta bootdocker vamos a poder iniciar los contenedores, para ello ejecutamos el siguiente comando:

Docker-compose up

Una vez terminado de levantar los contenedores podemos chequear el estado de los mismos:

La ejecución de docker container ls nos muestra los dos contenedores en ejecución y los puertos en los que están escuchando ambos.

Podemos realizar una prueba de algunos requerimientos http (en mi caso utilizo postman):

Conclusión

Así damos por finalizada esta serie de artículos relacionada al empaquetado y despliegue de aplicaciones utilizando contenedores docker. El ejemplo en sí fue bastante básico pero esta estructura puede escalar horizontalmente y ser utilizada con la cantidad de instancias que uno desea. Esa es otra de las bondades que provee Docker y sus contenedores.