Heroku + Docker + Spring Boot

Lo siguiente se centrará en mi experiencia al ejecutar la aplicación Spring Boot dockerizada en las máquinas virtuales gratuitas del servicio en la nube de Heroku . Una de las principales ventajas de este proveedor es que permite crear máquinas virtuales gratuitas con una restricción en las horas de operación, y para esto, solo el registro es suficiente. No es necesario confirmar los detalles de pago, aunque si los confirma puede obtener bonos adicionales. Puedes leer más sobre su precio aquí . Desde mi punto de vista, su política con respecto a los recursos gratuitos casi no tiene análogos.

Y así, después de haber creado una aplicación en Heroku, hay varias formas de implementar su código en ella

  • comprometerse en el repositorio heroku git
  • enlazar la aplicación al repositorio de github
  • usando el contenedor acoplable

A continuación, consideraremos el último de estos métodos. Para continuar, necesitaremos las siguientes aplicaciones


La última de estas herramientas nos dará la oportunidad de realizar todas las operaciones para trabajar con la nube desde la línea de comandos.

Comenzamos creando una aplicación Spring Boot a través de Spring Initializr . Como dependencias agregue Spring Web Starter. Debería ser suficiente.

En el mismo paquete en el que se encuentra la clase principal de la aplicación, agregamos la clase más simple del controlador REST para que la aplicación de alguna manera muestre signos de vida.

@RestController public class DemoController { @GetMapping("/check") public String check() { return "Application is alive"; } } 

Agregar al archivo application.properties

 server.port=${PORT:8080} 

Esta configuración es crítica para ejecutar el contenedor en Heroku. El hecho es que en la red interna del servicio, la aplicación se inicia en algún puerto libre en el momento del lanzamiento, cuyo número se transmite a través de la variable de entorno PORT. Además, la aplicación debe tener tiempo para conectarse a este puerto dentro de los primeros 60 segundos después del inicio; de lo contrario, se detendrá.

En la sección de complementos del archivo pom.xml, agregue el dockerfile-plugin de Spotify, que nos ayudará con el ensamblaje de la imagen de docker de nuestra aplicación.

 <plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.6</version> <executions> <execution> <id>default</id> <goals> <goal>build</goal> <goal>push</goal> </goals> </execution> </executions> <configuration> <repository>registry.heroku.com/${project.artifactId}/web</repository> <tag>latest</tag> <buildArgs> <JAR_FILE>${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin> 

Dicha configuración de complemento comenzará a construir la imagen como parte del objetivo de instalación, y empujará la imagen al repositorio de Docker de Heroku como parte del objetivo de implementación. Por cierto, para poder ejecutar la implementación de Maven, debe deshabilitar la implementación del archivo jar ensamblado (no necesitamos cargarlo en ningún lugar). Puede hacerlo utilizando la opción maven.deploy.skip en la sección de propiedades del archivo pom.xml.

 <properties> <java.version>1.8</java.version> <maven.deploy.skip>true</maven.deploy.skip> </properties> 

A continuación, cree un Dockerfile en la carpeta raíz del proyecto (junto a pom.xml)

 FROM openjdk:8-jdk-alpine ARG JAR_FILE RUN mkdir -p /apps COPY ./target/${JAR_FILE} /apps/app.jar COPY ./entrypoint.sh /apps/entrypoint.sh RUN chmod +x /apps/entrypoint.sh CMD ["/apps/entrypoint.sh"] 

Como puede ver, pasamos el nombre del archivo jar ensamblado aquí como argumento para el ensamblaje (ARG JAR_FILE). El valor de este argumento se establece en la configuración del complemento maven.

El script entrypoint.sh también se colocará en la raíz del proyecto y será muy simple.

 #!/usr/bin/env sh /usr/bin/java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -Xmx256m -Xss512k -XX:MetaspaceSize=100m -jar /apps/app.jar 

Preste atención a los parámetros JVM que limitan la memoria, y especialmente a los dos primeros parámetros. Incluyen un modo especial de administración de memoria, que es necesario cuando se inicia una aplicación Java dentro del contenedor Docker. La memoria disponible para la aplicación en máquinas Heroku gratuitas está limitada a 512 MB. Exceder este límite finalizará la aplicación. Si desea utilizar Java 9+, las dos primeras opciones deben reemplazarse con una -XX: + UseContainerSupport . Puedes leer más aquí . También parece que el soporte de contenedores ha dejado de ser una característica experimental en Java 8. Detalles aquí.

Después de completar estos pasos, intente comenzar
 mvnw clean install 

Si todo se hace correctamente, la aplicación y la imagen de la ventana acoplable deberían compilarse. Puede verificar si la imagen se creó con el comando
 docker images 

Ahora configuremos la nube y usemos la CLI de Heroku ya mencionada para esto. Por supuesto, para completar estos pasos, deberá registrar una cuenta en Heroku.

Antes que nada, necesitamos iniciar sesión. Para hacer esto, ejecuta el comando
 heroku login 
y siga las instrucciones a continuación.

Después de eso, debe iniciar sesión en el repositorio de Docker de heroku. Para hacer esto, ejecuta el comando
 heroku container:login 
sin esto, no podemos impulsar nuestra imagen acoplable.

Luego, creamos la aplicación usando el comando
 heroku apps:create <app-name> 

Tenga en cuenta que el nombre de la aplicación debe coincidir con el nombre del artefacto que se especifica en pom.xml . Quizás aquí tendrá que pasar algún tiempo seleccionando el nombre de la aplicación, que todavía no está ocupada por nadie.

Después de crear la aplicación, ejecute
 mvnw clean deploy 

y espere a que se construya la aplicación y presione la imagen de la ventana acoplable para que suceda. Tenga en cuenta que la inserción solo es posible si el nombre de la imagen coincide con el registro.heroku.com/<app-name>/web template y se creó una aplicación con el nombre <app-name>. Si observa la configuración del complemento Maven, verá que todo se hace exactamente así.

El último paso para desplegar y lanzar la imagen es el comando
 heroku container:release web --app=<app-name> 

Después de eso, siga el enlace https: // <app-name> .herokuapp.com / check y después de un tiempo verá el texto que mostrará el controlador del controlador.

Otra forma de abrir una aplicación en ejecución en un navegador es usar el comando
 heroku open --app=<app-name> 

Si algo no funciona, los registros se pueden ver en la interfaz web de Heroku o con el comando
 heroku logs 

Eso es todo! ¡Espero que esta guía haya sido útil!

Algunos enlaces útiles


1. Documentación de la CLI de Heroku devcenter.heroku.com/categories/command-line
2. Acerca de las características de la gestión de memoria en el Java devcenter.heroku.com/articles/java-memory-issues dockerizado
3. devcenter.heroku.com/categories/deploying-with-docker
4. Un ejemplo de aplicación Java de Heroku. Hay un método de implementación diferente, pero es útil mirar github.com/heroku/java-getting-started
5. La guía de Heroku para lanzar una aplicación Java (no a través de Docker) devcenter.heroku.com/articles/getting-started-with-java?singlepage=true
6. Buen material sobre el uso de Java en Docker habr.com/en/company/hh/blog/450954
7. Acerca de las opciones para iniciar Java en contenedores Docker www.oracle.com/technetwork/java/javase/8u191-relnotes-5032181.html#JDK-8146115

Source: https://habr.com/ru/post/459472/


All Articles