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.
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
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
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
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
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.
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
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.
y desde el 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.