Sådan dockeriseres en spring-boot-app med Googles Jib

Billede 1: Friktionsløse java-docker-billeder med Jib!

Hej! Mens jeg arbejdede på en forårsbaseret platform for nylig, overvejede jeg, hvilken vej man kunne gå til at dockerisere en mikroservice. Så jeg stødte på Jib, en ret ny tilgang til sagen, udviklet af Google.

Dette indlæg handler om at bruge Jib, og mere specifikt jib-maven-plugin, til at opbygge en containeriseret spring boot-applikation.

Demoprojektet, der bruges i dette indlæg, kan findes her:

Hvad Jib er

Hvad Jib bringer til bordet er, at det giver dig mulighed for at oprette en container ved blot at tilføje et plugin til det valgte værktøj (Maven eller Gradle). Ingen ekstra filer, bare et par konfigurationslinjer, og det håndterer alle trin til at pakke din applikation i et containerbillede.

Med Google cloud-teamets egne ord:

Jib er en open source Java-container fra Google, der lader Java-udviklere bygge containere ved hjælp af de Java-værktøjer, de kender. Det kræver ikke, at du skriver en Dockerfile eller har docker installeret, og det er direkte integreret i Maven og Gradle.

I den "traditionelle" Java til Docker-billedopbygningsstrøm har vi brug for en Dockerfile og docker-dæmonen installeret, som vist nedenfor:

Billede 2: De traditionelle trin til at oprette et dockerbillede fra en Java-app.

Som diagrammet viser, i Jib build flow har du bare brug for plugin projektets build-fil:

Billede 3: Jib-måden til at oprette et docker-billede fra en Java-app.

Opsætning

Det er ikke inden for dette indlæg at oprette et Java-udviklingsmiljø, men lad os give det et skud!

  1. Sørg for, at du har Java 8+ installeret.
  2. Vi bruger maven, så hvis ikke til stede, skal du installere maven 3.5+.
  3. Sørg for, at du har installeret docker, og hvis du bruger Linux, har din bruger docker-adgang.
  4. Få din yndlings-IDE installeret (formørkelse eller idé).

Opret en grundlæggende spring boot-applikation

Dette kan gøres enten via spring initializr eller via din foretrukne IDE. Hvis du brugte forår initialiseringen, bliver du nødt til at importere det nyoprettede maven-projekt til din IDE (formørkelse / idé).

Føj jib-maven-plugin til din pom.xml

For et meget grundlæggende lokalt gemt billede af din app skal du konfigurere jib-maven-plugin i din pom.xml som følger:

Kompiler appen, og opbyg billedet

Nu kan vi opbygge applikationen og kontrollere, om billedet er oprettet i vores lokale dockerlager.

Gå til projektets rodmappe via en terminal, og udfør:

mvn compile jib: dockerBuild

Maven build-logfiler skal indeholde linjer som følgende:

[INFO] - - jib-maven-plugin: 0.10.1: dockerBuild (default-cli) @ spring-boot-jib - -
[INFO]
[INFO] Indeholder applikation til Docker-dæmonen som springbootjib ...
[ADVARSEL] Basisbillede ‘gcr.io/distroless/java’ bruger ikke en bestemt billedfordøjelse - build er muligvis ikke reproducerbar
[INFO] Hent basisbillede gcr.io/distroless/java…
[INFO] Bygningsafhængighedslag…
[INFO] Bygning af ressourcelag ...
[INFO] Bygning af klasser lag…
[INFO] Afslutter ...
[INFO]
[INFO] Containerindgangspunkt indstillet til [java, -cp, / app / ressourcer: / app / klasser: / app / libs / *, com.jibdemo.SpringBootJibApplication]
[INFO] Indlæser til Docker-dæmonen ...
[INFO]
[INFO] Bygget billede til Docker-dæmonen som springbootjib

Så længe der ikke er nogen fejl, og vi ser, at maven “Bygget billede til Docker-dæmonen som springbootjib” er vi alle klar.

Kør docker-billedet

På dette tidspunkt skulle vi have det nye dockerbillede i vores lokale arkiv. Vi kan kontrollere ved at udføre docker-billede ls, og vi skal se et billede, der ligner dette:

springbootjib seneste eb4bea693650 3 timer siden 135MB

Bemærk den meget lille (135 mb) billedstørrelse, som skyldes gcr.io/distroless/java-billedet, som Jib bruger som standard (vi ser, hvordan vi kan ændre det senere).

Så nu kan vi køre billedet som sædvanligt ved at skrive docker-kør-det springbootjib og verificere, at appen kører som forventet.

Konfiguration af Jib-plugin til finjustering af vores Docker-billede

Vi kan grave dybere og konfigurere Jib-pluginet yderligere, så de passer til flere almindelige scenarier, såsom login til et dockerlager, udsættelse af porte, vælg et specifikt basisbillede osv.

For eksempel i følgende konfiguration billedet:

  • Er bygget fra en base af openjdk: alpin (trukket fra Docker Hub)
  • Skubbes til localhost: 5000 / springbootjib: 0.0.1-SNAPSHOT, localhost: 5000 / springbootjib: alpin og localhost: 5000 / springbootjib: seneste
  • Kører ved at kalde java -Xms256m -Xdebug -cp app / libs / *: app / resources: app / classes com.jibdemo.SpringBootJibApplication nogle args
  • Eksponerer port 8001 for tcp (standard) og porte 8002 og 8003 for udp
  • Har en etiket (navn: springbootjib)
  • Er bygget som OCI-format

Nu kan du bygge billedet igen og se forskellen i maven logfiler:

[INFO] --- jib-maven-plugin: 0.10.1: dockerBuild (default-cli) @ spring-boot-jib ---
[INFO]
[INFO] Indeholder applikation til Docker-dæmonen som localhost: 5000 / springbootjib: 0.0.1-SNAPSHOT, localhost: 5000 / springbootjib: alpin, localhost: 5000 / springbootjib ...
[INFO] Hent basisbillede openjdk: alpint ...
[INFO] Bygningsafhængighedslag ...
[INFO] Bygning af ressourcelag ...
[INFO] Bygning af klasser lag ...
[INFO] Basebilledet kræver autorisation. Forsøger igen for openjdk: alpin ...
[INFO] Henter registeroplysninger for registry.hub.docker.com ...
[INFO] Afslutter ...
[INFO]
[INFO] Containerindgangspunkt indstillet til [java, -Xms256m, -Xdebug, -cp, / app / ressourcer: / app / klasser: / app / libs / *, com.jibdemo.SpringBootJibApplication]
[INFO] Indlæser til Docker-dæmonen ...
[INFO]
[INFO] Bygget billede til Docker-dæmonen som localhost: 5000 / springbootjib: 0.0.1-SNAPSHOT, localhost: 5000 / springbootjib: alpin, localhost: 5000 / springbootjib

Bemærk i logsegmentet ovenfor, at plugin trak billedet openjdk: alpint fra Docker Hub, bygget billedet til tre forskellige mærkede versioner og lagrede dem i vores lokale arkiv.

Hvorfor jeg tog et skud med Jib

  • Du behøver ikke at vedligeholde en Dockerfile, køre en Docker-dæmon eller endda bekymre dig om at skabe en fed JAR med alle dens afhængigheder.
  • Udnytter billedlayering og caching af registreringsdatabasen for at opnå hurtige, inkrementelle builds.
  • Kan konfigureres til at oprette reproducerbare build-billeder, så længe dine input forbliver de samme.

Konklusion

Efter at have brugt andre maven-plugins som dem fra spotify og fabric8 til at oprette docker-billeder til java-apps, glæder jeg mig over Googles tag på sagen. Det har brug for mindre filer end fabric8s plugin, og (efter min ydmyke mening) føles lettere at konfigurere end spotifys plugin. Jeg vil bestemt anbefale at prøve det!

Ansvarsfraskrivelse: Dette er ikke en sammenligningsartikel, bare mit synspunkt på sagen støttet af personlig erfaring.

Du kan altid læse mere om Jibs github-repo, som har grundige oplysninger om alle konfigurationsparametre. Tak, fordi du læste så langt! Jeg håber du nød det! Du er velkommen til at give din feedback her.

Om mig

Hej tak, fordi du kom forbi. Jeg er en uafhængig fuld stakingeniør, der understreger i bagenden og devOps. Jeg er interesseret i at oprette prototyper / MVP'er og udvikle platforme, der skalerer i skyen, og vælger at skabe forretningsværdi.

Du kan læse mere om mig og min historie her. Hvis du vil diskutere forretning eller bare komme i kontakt, så send mig en e-mail: [email protected]