Construcción de imágenes de docker.

Si se fijaron, en las opciones que definimos para la aplicación de microservicios, para el perfil de ejecución desarrollo: “devDatabaseType” no tenemos una base de datos embebida H2, como fue el caso de la aplicación de Gateway.
Por ello, para poder iniciar la aplicación de microservicios necesitamos tener un servidor de mongo en nuestro ambiente de desarrollo.

El generador de jhipster cuando creamos una aplicación nos genera un dockerFile y un composeFile (Docker Composer) para contener la propia aplicación y para todos los servicios que necesita, para el caso de la aplicación de microservicio crea una definición de un contenedor con un servidor de mongo y un contenedor con el servidor de registro.

Los archivos generados son:

app.yml, mongodb.yml y jhipster-registry.yml. El principal, incluye a los otro que contienen los servicios de que dependen y la configuración central de SpringCloud.

version: '2'
services:
    microservice-app:
        image: microservice
        environment:
            - SPRING_PROFILES_ACTIVE=prod,swagger
            - EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE=http://admin:$${jhipster.registry.password}@jhipster-registry:8761/eureka
            - SPRING_CLOUD_CONFIG_URI=http://admin:$${jhipster.registry.password}@jhipster-registry:8761/config
            - SPRING_DATA_MONGODB_URI=mongodb://microservice-mongodb:27017
            - SPRING_DATA_MONGODB_DATABASE=microservice
            - JHIPSTER_SLEEP=30 # gives time for the JHipster Registry to boot before the application
    microservice-mongodb:
        extends:
            file: mongodb.yml
            service: microservice-mongodb
    jhipster-registry:
        extends:
            file: jhipster-registry.yml
            service: jhipster-registry
        environment:
            - SPRING_CLOUD_CONFIG_SERVER_NATIVE_SEARCH_LOCATIONS=file:./central-config/docker-config/

Si están trabajando sobre un ambiente operativo no-Windows necesitamos instalar el Docker Composer, para ello ir a su página web oficial: https://docs.docker.com/compose/install/ y seguir los pasos descritos allí.

Una vez tengamos instalado docker-compose.

composer check

Vamos a crear a e iniciar un contenedor con un servidor de mongo, un contenedor con nuestra aplicación de microservicios y un contenedor con el servidor de registro.

Si aún tienen ejecutándose la aplicación gateway y el servidor de registro con Maven, vamos a proceder a pararlos pues ahora vamos a ejecutar todo como contenedores Docker con perfil de producción.

Debemos ubicarnos en la carpeta de la aplicación de microservicios y ejecutar el siguiente comando:

docker-compose -f .\src\main\docker\app.yml up

docker microservice up

Y unos segundos después vamos a tener el servidor mongo, el servidor de registro y la aplicación de microservicios funcionando y esperando peticiones.

Vamos ahora a crear contenedores para la aplicación gateway.

De forma análoga a como hicimos con los microservicios vamos a ubicarnos en la carpeta de la aplicación gateway y ejecutamos el mismo comando.

docker-compose -f .\src\main\docker\app.yml up

gateway up

En esta ocasión debió generarse un contenedor para PostgreSQL, otro para un servidor de elasticSearch para indexado de logs y el contenedor de a aplicación gateway ya que el de registro fue iniciado por la aplicación de microservicios.

En estos momentos tenemos 6 contenedores en ejecución y podemos verificar que todo esté bien mediante el comando

docker ps

docker instances

Ya tenemos todos nuestros servicios principales funcionando, ahora nos queda iniciar los servicios de monitoreo ELK y crear una configuración de Docker central para todos las imágenes y contenedores creados.

Para ellos vamos a utilizar el sub-generador de Docker Composer de jhipster. Primero vamos a crear las imágenes de docker de la aplicación de microservicio y gateway usando el plugin de Spotify para maven mediante el siguiente comando ubicado en la carpeta raíz de ambas aplicaciones.

mvn verify -DskipTests -Pprod dockerfile:build

microservice img

Si al generar la la imagen de docker para la aplicación gateway arrojó un error simila a : “TypeError: First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.” es por un problema de versiones de webpack, para solucionarlo debemos editar el fichero:

package.json
y cambiar la versión del plugin:
workbox-webpack-plugin
a:
3.0.0-beta.1

y el fichero:

webpack.prod.js
la línea:
new WorkboxPlugin({ reemplazarla
por:
new WorkboxPlugin.GenerateSW({

Luego de esto solo pueden salir unos warnings y el procese termina correctamente.

gateway image

Con todas las imágenes necesarias existentes vamos a crear la configuración central de Docker. Ubicados en la carpeta contenedora de nuestras aplicaciones vamos a crear una carpeta llamada docker y ubicados en la misma ejecutaremos el siguiente comando.

jhipster docker-compose
  • Application type: Microservice application
  • Gateway type: JHipster Gateway based on Netflix Zuul
  • Root directory of your microservices: ../
  • Applications to include: microservice y gateway
  • Applications with clustered databases: None
  • Set up monitoring: JHipster Console with ELK
  • The admin password for the JHipster Registry: admin

docker-compose subgenerator

El subgenerador de jhipster creó un composeFile y ficheros de configuración por cada aplicación y servicio necesario. Para ello utilizó imágenes públicas por defecto para los servicios comunes y las imágenes de nuestras aplicaciones de microservicio y gateway creadas por nosotros. También creó la configuración y comunicación entre los contenedores usando spring cloud.

Para evitar tener contenedores huérfanos y recrear todos los contenedores que tenemos corriendo hasta el momento creados vamos a eliminar y luego iniciar toda nuestra configuración central de docker.

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker rmi $(docker images -a -q) --force

Luego de esos comandos deberíamos tener 0 contenedores e imágenes.

docker-compose up -d

Una vez que termine de iniciar todos los contenedores debería verse con el kitematic.

docker kitematic

y desde el portainer

docker portainer

De esta forma tenemos todas nuestras aplicaciones y servicios 100% contenizados con docker, lo que nos hará mucho más fácil la tarea de integración y entrega continua.

Deja un comentario

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

A %d blogueros les gusta esto: