Dockerizar aplicaciones Java con Jib

1. Información general

En este tutorial, veremos Jib y cómo simplifica la contenedorización de aplicaciones Java.

Tomaremos una aplicación Spring Boot simple y crearemos su imagen de Docker usando Jib. Y luego también publicaremos la imagen en un registro remoto.

Y asegúrese también de consultar nuestro tutorial sobre cómo dockerizar aplicaciones Spring Boot usando dockerfile y la herramienta d ocker .

2. Introducción a Jib

Jib es una herramienta Java de código abierto mantenida por Google para crear imágenes Docker de aplicaciones Java. Simplifica la contenedorización ya que con él no es necesario escribir un dockerfile.

Y, de hecho, ni siquiera necesitamos tener la ventana acoplable instalada para crear y publicar las imágenes de la ventana acoplable nosotros mismos.

Google publica Jib como complemento de Maven y Gradle. Esto es bueno porque significa que Jib detectará cualquier cambio que hagamos en nuestra aplicación cada vez que compilemos. Esto nos ahorra comandos de construcción / inserción de Docker separados y simplifica la adición de esto a una canalización de CI.

También hay un par de otras herramientas, como los complementos docker-maven-plugin y dockerfile-maven de Spotify, aunque la primera ahora está en desuso y la última requiere un dockerfile .

3. Una aplicación de saludo simple

Tomemos una aplicación simple de arranque de primavera y la acoplamos usando Jib. Expondrá un punto final GET simple:

//localhost:8080/greeting

Lo que podemos hacer de manera bastante simple con un controlador Spring MVC:

@RestController public class GreetingController { private static final String template = "Hello Docker, %s!"; private final AtomicLong counter = new AtomicLong(); @GetMapping("/greeting") public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) { return new Greeting(counter.incrementAndGet(), String.format(template, name)); } } 

4. Preparación de la implementación

También necesitaremos configurarnos localmente para autenticarnos con el repositorio de Docker en el que queremos implementar.

Para este ejemplo, proporcionaremos nuestras credenciales de DockerHub a .m2 / settings.xml :

  registry.hub.docker.com    

También hay otras formas de proporcionar las credenciales. La forma recomendada por Google es utilizar herramientas auxiliares, que pueden almacenar las credenciales en un formato cifrado en el sistema de archivos. En este ejemplo, podríamos haber usado docker-credential-helpers en lugar de almacenar credenciales de texto sin formato en settings.xml , que es mucho más seguro, aunque simplemente fuera del alcance de este tutorial.

5. Implementación en Docker Hub con Jib

Ahora, podemos usar jib-maven-plugin , o el equivalente de Gradle, para contener nuestra aplicación con un simple comando :

mvn compile com.google.cloud.tools:jib-maven-plugin:2.5.0:build -Dimage=$IMAGE_PATH

donde IMAGE_PATH es la ruta de destino en el registro del contenedor.

Por ejemplo, para subir la imagen baeldungjib / spring-jib-app a DockerHub , haríamos:

export IMAGE_PATH=registry.hub.docker.com/baeldungjib/spring-jib-app

¡Y eso es! Esto creará la imagen de la ventana acoplable de nuestra aplicación y la enviará al DockerHub .

Por supuesto, podemos subir la imagen a Google Container Registry o Amazon Elastic Container Registry de forma similar .

6. Simplificación del comando Maven

Además, podemos acortar nuestro comando inicial configurando el complemento en nuestro pom , como cualquier otro complemento de Maven.

 ...   ...  com.google.cloud.tools jib-maven-plugin 2.5.0   ${image.path}    ...   ... 

Con este cambio, podemos simplificar nuestro comando maven:

mvn compile jib:build

7. Personalización de los aspectos de Docker

De forma predeterminada, Jib hace una serie de conjeturas razonables sobre lo que queremos , como FROM y ENTRYPOINT.

Hagamos un par de cambios en nuestra aplicación que sean más específicos para nuestras necesidades.

Primero, Spring Boot expone el puerto 8080 de forma predeterminada.

Pero, digamos, queremos que nuestra aplicación se ejecute en el puerto 8082 y que se pueda exponer a través de un contenedor.

Por supuesto, haremos los cambios apropiados en Boot. Y, después de eso, podemos usar Jib para hacerlo exponible en la imagen:

 ...   8082   

O digamos que necesitamos un FROM diferente. De forma predeterminada, Jib utiliza la imagen de Java sin distribución .

Si queremos ejecutar nuestra aplicación en una imagen base diferente, como alpine-java, podemos configurarla de forma similar:

 ...  openjdk:alpine  ... 

Configuramos etiquetas, volúmenes y varias otras directivas de Docker de la misma manera.

8. Personalización de aspectos de Java

Y, por asociación, Jib también admite numerosas configuraciones de tiempo de ejecución de Java:

  • jvmFlags sirve para indicar qué indicadores de inicio pasar a la JVM.
  • mainClass es para indicar la clase principal, que Jib intentará inferir automáticamente de forma predeterminada.
  • args es donde especificaríamos los argumentos del programa pasados ​​al método principal .

Por supuesto, asegúrese de consultar la documentación de Jib para ver todas las propiedades de configuración disponibles.

9. Conclusión

En este tutorial, vimos cómo crear y publicar imágenes de la ventana acoplable utilizando Jib de Google, incluido cómo acceder a las directivas de la ventana acoplable y las configuraciones de tiempo de ejecución de Java a través de Maven.

Como siempre, el código fuente de este ejemplo está disponible en Github.