Vytváranie Docker obrázkov pomocou Spring Boot

1. Úvod

S rastom počtu organizácií smerujúcich k kontajnerom a virtuálnym serverom sa Docker stáva významnejšou súčasťou pracovných postupov vývoja softvéru. Za týmto účelom je jednou z vynikajúcich nových funkcií Spring Boot 2.3 schopnosť ľahko vytvárať obrázky Docker pre aplikácie Spring Boot.

V tomto tutoriáli sa pozrieme na to, ako vytvoriť obrázky Dockera pre aplikáciu Spring Boot.

2. Tradičné Docker Builds

Tradičným spôsobom vytvárania obrázkov Dockeru pomocou nástroja Spring Boot je použitie súboru Docker. Nasleduje jednoduchý príklad:

FROM openjdk: 8-jdk-alpine EXPOSE 8080 ARG JAR_FILE = target / demo-app-1.0.0.jar ADD $ {JAR_FILE} app.jar ENTRYPOINT ["java", "- jar", "/ app.jar"]

Potom by sme mohli použiť docker build príkaz na vytvorenie obrazu Dockeru. To funguje dobre pre väčšinu aplikácií, ale má niekoľko nevýhod.

Najskôr používame nádobu na tuky vytvorenú programom Spring Boot. To môže mať vplyv na čas spustenia, najmä v kontajnerovanom prostredí. Čas spustenia môžeme ušetriť tak, že namiesto toho pridáme rozložený obsah súboru jar.

Po druhé, obrázky Dockeru sú zostavené vo vrstvách. Povaha tukových nádob Spring Boot spôsobuje, že všetky aplikačné kódy a knižnice tretích strán sú spojené do jednej vrstvy. To znamená, že aj keď sa zmení iba jeden riadok kódu, musí sa znova vytvoriť celá vrstva.

Explodovaním nádoby pred zostavením získa aplikačný kód a knižnice tretích strán svoju vlastnú vrstvu. To nám umožňuje využívať výhody Dockerovho vyrovnávacieho mechanizmu. Teraz, keď sa zmení jeden riadok kódu, je potrebné znova vytvoriť iba príslušnú vrstvu.

V tejto súvislosti sa pozrime na to, ako program Spring Boot vylepšil proces vytvárania obrázkov Docker.

3. Buildpacky

Balíky Buildpacks sú nástrojom, ktorý poskytuje závislosti na architektúre a aplikáciách.

Napríklad, vzhľadom na tukovú nádobu Spring Boot, buildpack by nám poskytol runtime Java. To nám umožňuje preskočiť súbor Docker a automaticky získať rozumný obraz Dockeru.

Spring Boot obsahuje podporu pre buildpacky od Maven aj Gradle. Napríklad pri budovaní s Mavenom by sme spustili príkaz:

./mvnw spring-boot: build-image

Pozrime sa na niektoré z relevantných výstupov, aby sme zistili, čo sa deje:

[INFO] Stavebná nádoba: target / demo-0.0.1-SNAPSHOT.jar ... [INFO] Vytvorenie obrázka 'docker.io/library/demo:0.0.1-SNAPSHOT' ... [INFO]> Vytiahnutie obrázka staviteľa 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 100% ... [INFO] [tvorca] ===> DETEKCIA [INFO] [tvorca] 5 z 15 zúčastnených buildpackov [INFO] [ tvorca] paketo-buildpacks / bellsoft-liberica 2.8.1 [INFO] [tvorca] paketo-buildpacks / spustiteľný súbor 1.2.8 [INFO] [tvorca] paketo-buildpacks / apache-tomcat 1.3.1 [INFO] [tvorca] paketo-buildpacks / dist-zip 1.3.6 [INFO] [tvorca] paketo-buildpacks / spring-boot 1.9.1 ... [INFO] Úspešne vytvorený obrázok 'docker.io/library/demo:0.0.1-SNAPSHOT' [INFO] Celkový čas: 44 796 s

Prvý riadok ukazuje, že sme postavili našu štandardnú nádobu na tuky, rovnako ako každé typické balenie maven.

Ďalším riadkom sa začína zostavovanie obrazu Dockeru. Hneď potom uvidíme zostavenie, ktoré sa stiahne do nástroja Packeto builder.

Packeto je implementácia cloudových natívnych buildpackov. Robí to analýzu nášho projektu a stanovenie požadovaných rámcov a knižníc. V našom prípade to určí, že máme projekt Spring Boot, a pridá požadované balíky build.

Nakoniec vidíme vygenerovaný obraz Dockeru a celkový čas zostavenia. Všimnite si, ako pri prvom budovaní trávime pomerne veľa času sťahovaním balíkov buildpack a vytváraním rôznych vrstiev.

Jednou z vynikajúcich vlastností balíkov buildpack je, že obraz Dockeru má viac vrstiev. Takže ak zmeníme iba náš aplikačný kód, následné zostavenia budú oveľa rýchlejšie:

... [INFO] [tvorca] Opätovné použitie vrstvy 'paketo-buildpacks / executable-jar: class-path' [INFO] [tvorca] Opätovné použitie vrstvy 'paketo-buildpacks / spring-boot: web-application-type' ... [INFO] Úspešne vytvorený obrázok 'docker.io/library/demo:0.0.1-SNAPSHOT' ... [INFO] Celkový čas: 10 591 s

4. Vrstvené dózy

V niektorých prípadoch môžeme radšej nepoužívať balíčky buildpacks - možno je naša infraštruktúra už viazaná na iný nástroj, alebo už máme vlastné súbory Docker, ktoré chceme znova použiť.

Z týchto dôvodov Spring Boot podporuje aj vytváranie Docker obrázkov pomocou vrstvených pohárov. Aby sme pochopili, ako to funguje, pozrime sa na typické rozloženie tukových nádob Spring Boot:

org / springframework / boot / loader / ... BOOT-INF / classes / ... lib / ...

Nádoba na tuky sa skladá z 3 hlavných oblastí:

  • Na spustenie aplikácie Spring sú potrebné triedy bootstrap
  • Kód žiadosti
  • Knižnice tretích strán

Pri vrstvených dózach vyzerá štruktúra podobne, dostávame však nový vrstvy.idx súbor, ktorý mapuje každý adresár v tučnej nádobe na vrstvu:

- "dependencies": - "BOOT-INF / lib /" - "spring-boot-loader": - "org /" - "snapshot-dependencies": - "aplikácia": - "BOOT-INF / triedy /" - „BOOT-INF / classpath.idx“ - „BOOT-INF / layers.idx“ - „META-INF /“

Po vybalení má Spring Boot štyri vrstvy:

  • závislosti: typické závislosti od tretích strán
  • závislosti na snímkach: závislosti na snímkach od tretích strán
  • zdrojov: statické zdroje
  • žiadosť: kód aplikácie a zdroje

Cieľom je umiestniť aplikačný kód a knižnice tretích strán do vrstiev, ktoré odrážajú to, ako často sa menia.

Napríklad aplikačný kód je pravdepodobne to, čo sa mení najčastejšie, takže získa svoju vlastnú vrstvu. Ďalej sa môže každá vrstva vyvíjať sama od seba a iba v prípade, že dôjde k zmene vrstvy, bude znovu vytvorená pre Dockerov obraz.

Teraz, keď chápeme novú štruktúru vrstvených nádob, pozrime sa, ako ju môžeme využiť na vytváranie obrázkov Dockeru.

4.1. Vytváranie vrstvených pohárov

Najskôr musíme nastaviť náš projekt na vytvorenie vrstvenej nádoby. V prípade Maven to znamená pridanie novej konfigurácie do časti Spring Boot plugin nášho POM:

 org.springframework.boot spring-boot-maven-plugin true 

S touto konfiguráciou je Maven balíček príkaz (spolu s ktorýmkoľvek z jeho závislých príkazov) vygeneruje nový vrstvený džbán pomocou štyroch predvolených vrstiev uvedených vyššie.

4.2. Prezeranie a extrahovanie vrstiev

Ďalej musíme vrstvy extrahovať z nádoby, aby mal obrázok Dockeru správne vrstvy.

Na preskúmanie vrstiev ľubovoľnej vrstvenej nádoby môžeme spustiť príkaz:

java -Djarmode = layertools -jar demo-0.0.1.jar zoznam

Potom by sme ich extrahovali, spustili by sme:

java -Djarmode = layertools -jar demo-0.0.1.jar extrakt

4.3. Vytváranie Docker Image

Najjednoduchší spôsob, ako začleniť tieto vrstvy do obrazu Dockera, je použitie súboru Dockerfile:

FROM adopttopenjdk: 11-jre-hotspot ako staviteľ ARG JAR_FILE = cieľ / *. Jar COPY $ {JAR_FILE} application.jar RUN java -Djarmode = layertools -jar application.jar extrakt Z adopttopenjdk: 11-jre-hotspot COPY --z = závislosti staviteľa / ./ COPY --from = závislosti snímok staviteľa / ./ COPY --from = builder spring-boot-loader / ./ COPY --from = aplikácia staviteľa / ./ ENTRYPOINT ["java", "org .springframework.boot.loader.JarLauncher "]

Tento súbor Docker extrahuje vrstvy z našej nádoby s tukom a potom každú vrstvu skopíruje do obrázka Docker. Každý KÓPIA Výsledkom smernice je nová vrstva v konečnom obrázku Dockeru.

Ak zostavíme tento súbor Docker, môžeme vidieť, že každá vrstva z vrstvenej nádoby sa pridáva k obrazu Docker ako jej vlastná vrstva:

... Krok 6/10: KOPÍROVAŤ --from = závislosti staviteľa / ./ ---> 2c631b8f9993 Krok 7/10: KOPÍROVAŤ --from = závislosti staviteľa na snímky / ./ ---> 26e8ceb86b7d Krok 8/10: COPY --from = builder spring-boot-loader / ./ ---> 6dd9eaddad7f Krok 9/10: COPY --from = aplikácia staviteľa / ./ ---> dc80cc00a655 ...

5. Záver

V tomto tutoriáli sme videli rôzne spôsoby, ako vytvoriť obrázky Dockeru pomocou Spring Boot. Pomocou balíkov buildpacks môžeme získať vhodné Docker obrázky bez štandardných profilov alebo vlastných konfigurácií. Alebo s trochou väčšieho úsilia môžeme použiť vrstvené dózy na získanie lepšie prispôsobeného obrazu Dockeru.

Všetky príklady v tomto výučbe nájdete na GitHub.

Ďalšie informácie o používaní jazykov Java a Docker nájdete v príručke jib.