Dockerizzare le app Java utilizzando Jib

1. Panoramica

In questo tutorial, daremo uno sguardo a Jib e a come semplifica la containerizzazione delle applicazioni Java.

Prenderemo una semplice applicazione Spring Boot e costruiremo la sua immagine Docker usando Jib. E poi pubblicheremo anche l'immagine in un registro remoto.

E assicurati anche di fare riferimento al nostro tutorial sulla dockerizzazione delle applicazioni Spring Boot utilizzando dockerfile e lo strumento d ocker .

2. Introduzione a Jib

Jib è uno strumento Java open source gestito da Google per la creazione di immagini Docker di applicazioni Java. Semplifica la containerizzazione poiché con essa non è necessario scrivere un dockerfile.

E in realtà, non è nemmeno necessario installare docker per creare e pubblicare noi stessi le immagini docker.

Google pubblica Jib sia come plug-in Maven che come plug-in Gradle. Questo è utile perché significa che Jib rileverà tutte le modifiche apportate alla nostra applicazione ogni volta che costruiamo. Ciò consente di risparmiare comandi di build / push docker separati e semplifica l'aggiunta a una pipeline CI.

Ci sono anche un paio di altri strumenti là fuori, come i plug-in docker-maven-plug di Spotify e dockerfile-maven, sebbene il primo sia ora deprecato e il secondo richieda un dockerfile .

3. Una semplice app di auguri

Prendiamo una semplice applicazione di avvio a molla e la dockerize utilizzando Jib. Esporrà un semplice endpoint GET:

//localhost:8080/greeting

Cosa che possiamo fare semplicemente con un controller 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. Preparazione della distribuzione

Dovremo anche configurarci localmente per autenticarci con il repository Docker in cui vogliamo eseguire la distribuzione.

Per questo esempio, forniremo le nostre credenziali DockerHub a .m2 / settings.xml :

  registry.hub.docker.com    

Esistono anche altri modi per fornire le credenziali. Il modo consigliato da Google è utilizzare strumenti di supporto, che possono memorizzare le credenziali in un formato crittografato nel file system. In questo esempio, avremmo potuto utilizzare docker-credential-helper invece di memorizzare credenziali in testo normale in settings.xml , che è molto più sicuro, anche se semplicemente fuori dall'ambito di questo tutorial.

5. Distribuzione su Docker Hub con Jib

Ora possiamo usare jib-maven-plugin , o l'equivalente Gradle, per containerizzare la nostra applicazione con un semplice comando :

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

dove IMAGE_PATH è il percorso di destinazione nel registro contenitori.

Ad esempio, per caricare l'immagine baeldungjib / spring-jib-app su DockerHub , dovremmo:

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

E questo è tutto! Questo creerà l'immagine docker della nostra applicazione e la invierà a DockerHub .

Possiamo, ovviamente, caricare l'immagine su Google Container Registry o Amazon Elastic Container Registry in modo simile .

6. Semplificare il comando Maven

Inoltre, possiamo abbreviare il nostro comando iniziale configurando il plugin nel nostro pom , come qualsiasi altro plugin Maven.

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

Con questa modifica, possiamo semplificare il nostro comando Maven:

mvn compile jib:build

7. Personalizzazione degli aspetti Docker

Per impostazione predefinita, Jib fa una serie di ipotesi ragionevoli su ciò che vogliamo , come FROM e ENTRYPOINT.

Facciamo un paio di modifiche alla nostra applicazione che sono più specifiche per le nostre esigenze.

Innanzitutto, Spring Boot espone la porta 8080 per impostazione predefinita.

Ma, diciamo, vogliamo far girare la nostra applicazione sulla porta 8082 e renderla esponibile attraverso un contenitore.

Ovviamente, apporteremo le modifiche appropriate in Boot. E, dopo, possiamo usare Jib per renderlo esponibile nell'immagine:

 ...   8082   

Oppure, supponiamo di aver bisogno di un FROM diverso. Per impostazione predefinita, Jib utilizza l'immagine java senza distro .

Se vogliamo eseguire la nostra applicazione su un'immagine di base diversa, come alpine-java, possiamo configurarla in modo simile:

 ...  openjdk:alpine  ... 

Configuriamo tag, volumi e molte altre direttive Docker nello stesso modo.

8. Personalizzazione degli aspetti Java

E, per associazione, Jib supporta anche numerose configurazioni di runtime Java:

  • jvmFlags serve per indicare quali flag di avvio passare alla JVM.
  • mainClass serve per indicare la classe principale, che Jib tenterà di dedurre automaticamente per impostazione predefinita.
  • args è dove dovremmo specificare gli argomenti del programma passati al metodo principale .

Ovviamente, assicurati di controllare la documentazione di Jib per vedere tutte le proprietà di configurazione disponibili.

9. Conclusione

In questo tutorial, abbiamo visto come creare e pubblicare immagini Docker utilizzando Jib di Google, incluso come accedere alle direttive Docker e alle configurazioni di runtime Java tramite Maven.

Come sempre, il codice sorgente per questo esempio è disponibile su Github.