Konteineri ir kļuvuÅ”i par vÄlamo lÄ«dzekli, lai iesaiÅotu lietojumprogrammu ar visÄm programmatÅ«ras un operÄtÄjsistÄmas atkarÄ«bÄm un pÄc tam piegÄdÄtu tÄs dažÄdÄs vidÄs.
Å ajÄ rakstÄ ir aprakstÄ«ti dažÄdi veidi, kÄ ievietot Spring Boot lietojumprogrammu.
izveidot Docker attÄlu, izmantojot Docker failu,
veidojot OCI attÄlu no avota, izmantojot Cloud-Native Buildpack,
un attÄla optimizÄcija izpildes laikÄ, sadalot JAR daļas dažÄdos lÄ«meÅos, izmantojot slÄÅveida rÄ«kus.
Koda piemÄrs
Å im rakstam ir pievienots darba koda piemÄrs vietnÄ GitHub .
Konteineru terminoloģija
SÄksim ar konteinera terminoloÄ£iju, kas izmantota visÄ rakstÄ:
Konteinera attÄls: noteikta formÄta fails. MÄs pÄrvÄrÅ”am savu lietojumprogrammu par konteinera attÄlu, palaižot veidoÅ”anas rÄ«ku.
Konteineru dzinÄjs: dÄmona process, kas ir atbildÄ«gs par konteinera palaiÅ”anu.
Konteinera saimnieks: saimniekdators, kurÄ darbojas konteinera dzinÄjs.
Konteineru reÄ£istrs: vispÄrÄ«gÄ atraÅ”anÄs vieta, kas tiek izmantota konteinera attÄla publicÄÅ”anai un izplatÄ«Å”anai.
OCI standarts: Open Container Initiative (OCI) ir viegls, atvÄrtÄ koda pÄrvaldÄ«bas ietvars, ko veido Linux fonds. OCI attÄla specifikÄcija nosaka nozares standartus konteinera attÄlu formÄtiem un izpildlaikam, lai nodroÅ”inÄtu, ka visi konteineru dzinÄji var palaist konteinera attÄlus, kas izveidoti ar jebkuru veidoÅ”anas rÄ«ku.
Lai konteinerizÄtu lietojumprogrammu, mÄs iesaiÅojam savu lietojumprogrammu konteinera attÄlÄ un publicÄjam Å”o attÄlu publiskajÄ reÄ£istrÄ. Konteinera izpildlaiks izgÅ«st Å”o attÄlu no reÄ£istra, izpako to un palaiž tajÄ esoÅ”o lietojumprogrammu.
Spring Boot versijÄ 2.3 ir pieejami spraudÅi OCI attÄlu veidoÅ”anai.
dokers ir visbiežÄk izmantotÄ konteinera ievieÅ”ana, un savos piemÄros mÄs izmantojam Docker, tÄpÄc visas turpmÄkÄs atsauces uz konteineru Å”ajÄ rakstÄ attieksies uz Docker.
Docker attÄlu izveide Spring Boot lietojumprogrammÄm ir ļoti vienkÄrÅ”a, pievienojot savam Dockerfile dažus norÄdÄ«jumus.
Vispirms mÄs izveidojam izpildÄmo JAR un kÄ daļu no Dockerfile instrukcijÄm kopÄjam izpildÄmo JAR virs pamata JRE attÄla pÄc nepiecieÅ”amo pielÄgojumu veikÅ”anas.
Izveidosim mÅ«su pavasara pieteikumu Pavasara inicializÄcija ar atkarÄ«bÄm web, lombokŠø actuator. MÄs pievienojam arÄ« atpÅ«tas kontrolieri, lai nodroÅ”inÄtu API GETmetodi.
Docker faila izveide
PÄc tam mÄs ievietojam Å”o lietojumprogrammu konteinerÄ, pievienojot Dockerfile:
MÅ«su Dockerfile satur pamata attÄlu no adoptopenjdk, virs kura mÄs kopÄjam savu JAR failu un pÄc tam atveram portu, 8080kas uzklausÄ«s pieprasÄ«jumus.
Lietojumprogrammas veidoŔana
Vispirms jums ir jÄizveido lietojumprogramma, izmantojot Maven vai Gradle. Å eit mÄs izmantojam Maven:
mvn clean package
Tas lietojumprogrammai izveido izpildÄmu JAR failu. Mums ir jÄpÄrvÄrÅ” Å”is izpildÄmais JAR par Docker attÄlu, lai tas darbotos Docker dzinÄjÄ.
Izveidojiet konteinera attÄlu
PÄc tam mÄs ievietojÄm Å”o JAR izpildÄmo failu Docker attÄlÄ, palaižot komandu docker buildno tÄ projekta saknes direktorija, kurÄ ir iepriekÅ” izveidots Dockerfile:
docker build -t usersignup:v1 .
MÄs varam redzÄt savu attÄlu sarakstÄ ar komandu:
docker images
IepriekÅ” minÄtÄs komandas izvade ietver mÅ«su attÄlu usersignupkopÄ ar pamata attÄlu, adoptopenjdknorÄdÄ«ts mÅ«su Dockerfile.
REPOSITORY TAG SIZE
usersignup v1 249MB
adoptopenjdk 11-jre-hotspot 229MB
MontÄžas paketes (Buildpacks) ir vispÄrÄ«gs termins, ko izmanto dažÄdi platformas kÄ pakalpojuma (PAAS) piedÄvÄjumi, lai izveidotu konteinera attÄlu no pirmkoda. To palaida Heroku 2011. gadÄ, un kopÅ” tÄ laika to ir pieÅÄmuÅ”i Cloud Foundry, Google App Engine, Gitlab, Knative un daži citi.
MÄkoÅu veidoÅ”anas pakotÅu priekÅ”rocÄ«ba
Viena no galvenajÄm priekÅ”rocÄ«bÄm, ko sniedz Buildpack izmantoÅ”ana attÄlu veidoÅ”anai, ir tÄ attÄla konfigurÄcijas izmaiÅas var pÄrvaldÄ«t centralizÄti (veidotÄjs) un izplatÄ«t visÄs lietojumprogrammÄs, izmantojot veidotÄju.
BÅ«vpaketes bija cieÅ”i saistÄ«tas ar platformu. Cloud-Native Buildpacks nodroÅ”ina standartizÄciju dažÄdÄs platformÄs, atbalstot OCI attÄla formÄtu, kas nodroÅ”ina, ka attÄlu var palaist Docker dzinÄjs.
Spring Boot spraudÅa izmantoÅ”ana
Spring Boot spraudnis veido OCI attÄlus no avota, izmantojot Buildpack. AttÄli tiek veidoti, izmantojot bootBuildImageuzdevumi (Gradle) vai spring-boot:build-imagemÄrÄ·a (Maven) un vietÄjÄ Docker instalÄcija.
MÄs varam pielÄgot attÄla nosaukumu, kas jÄnosÅ«ta uz Docker reÄ£istru, norÄdot nosaukumu image tag:
PÄc tam mÄs palaižam spraudni Jib, izmantojot komandu Maven, lai izveidotu lietojumprogrammu un izveidotu konteinera attÄlu. TÄpat kÄ iepriekÅ”, mÄs Å”eit neizmantojam nekÄdus Dockerfailus:
PÄc iepriekÅ” minÄtÄs komandas Maven izpildes mÄs iegÅ«stam Å”Ädu izvadi:
[INFO] Containerizing application to pratikdas/usersignup:v1...
.
.
[INFO] Container entrypoint set to [java, -cp, /app/resources:/app/classes:/app/libs/*, io.pratik.users.UsersignupApplication]
[INFO]
[INFO] Built and pushed image as pratikdas/usersignup:v1
[INFO] Executing tasks:
[INFO] [==============================] 100.0% complete
Izvade parÄda, ka konteinera attÄls ir izveidots un ievietots reÄ£istrÄ.
MotivÄcijas un metodes optimizÄtu attÄlu veidoÅ”anai
Mums ir divi galvenie optimizÄcijas iemesli:
ŠŃŠ¾ŠøŠ·Š²Š¾Š“ŠøŃŠµŠ»ŃŠ½Š¾ŃŃŃ: konteinera orÄ·estrÄÅ”anas sistÄmÄ konteinera attÄls tiek izvilkts no attÄlu reÄ£istra uz resursdatoru, kurÄ darbojas konteinera dzinÄjs. Å o procesu sauc par plÄnoÅ”anu. Lielu attÄlu izÅemÅ”ana no reÄ£istra rada ilgu plÄnoÅ”anas laiku konteineru orÄ·estrÄÅ”anas sistÄmÄs un ilgus izveides laikus CI cauruļvados.
DroŔība: lieliem attÄliem ir arÄ« liela vieta ievainojamÄ«bÄm.
Docker attÄlu veido slÄÅu kaudze, un katrs no tiem attÄlo paziÅojumu mÅ«su Docker failÄ. Katrs slÄnis ir pamatÄ esoÅ”Ä slÄÅa izmaiÅu delta. Kad mÄs izvelkam Docker attÄlu no reÄ£istra, tas tiek izvilkts slÄÅos un resursdatora keÅ”atmiÅÄ.
Spring Boot lietojumi "resnais JAR" iekÅ”Ä kÄ noklusÄjuma iepakojuma formÄtu. Kad mÄs skatÄmies uz resno JAR, mÄs redzam, ka lietojumprogramma ir ļoti maza daļa no visa JAR. Å Ä« ir tÄ daļa, kas mainÄs visvairÄk. PÄrÄjo daļu veido Spring Framework atkarÄ«bas.
OptimizÄcijas formula ir vÄrsta uz lietojumprogrammas izolÄÅ”anu no Spring Framework atkarÄ«bÄm atseviÅ”Ä·Ä lÄ«menÄ«.
AtkarÄ«bas slÄnis, kas veido lielÄko daļu no biezÄ JAR faila, tiek lejupielÄdÄts tikai vienu reizi un saglabÄts resursdatora sistÄmas keÅ”atmiÅÄ.
Lietojumprogrammas atjauninÄÅ”anas un konteinera plÄnoÅ”anas laikÄ tiek izvilkts tikai plÄns lietojumprogrammas slÄnis. kÄ parÄdÄ«ts Å”ajÄ diagrammÄ:
NÄkamajÄs sadaļÄs apskatÄ«sim, kÄ izveidot Å”os optimizÄtos attÄlus lietojumprogrammai Spring Boot.
OptimizÄta konteinera attÄla izveide pavasara sÄknÄÅ”anas lietojumprogrammai, izmantojot Buildpack
Spring Boot 2.3 atbalsta slÄÅoÅ”anu, izvelkot bieza JAR faila daļas atseviŔķos slÄÅos. SlÄÅu funkcija pÄc noklusÄjuma ir atspÄjota, un tÄ ir skaidri jÄiespÄjo, izmantojot spraudni Spring Boot Maven:
MÄs izmantosim Å”o konfigurÄciju, lai izveidotu konteinera attÄlu vispirms ar Buildpack un pÄc tam ar Docker nÄkamajÄs sadaļÄs.
Skrienam build-imageMaven mÄrÄ·is, lai izveidotu konteinera attÄlu:
mvn spring-boot:build-image
Ja palaižam programmu Dive, lai redzÄtu slÄÅus iegÅ«tajÄ attÄlÄ, mÄs varam redzÄt, ka lietojumprogrammas slÄnis (apzÄ«mÄts ar sarkanu krÄsu) ir daudz mazÄks kilobaitu diapazonÄ, salÄ«dzinot ar to, ko ieguvÄm, izmantojot biezo JAR formÄtu:
OptimizÄta konteinera attÄla izveide pavasara sÄknÄÅ”anas lietojumprogrammai, izmantojot Docker
TÄ vietÄ, lai izmantotu Maven vai Gradle spraudni, mÄs varam izveidot arÄ« slÄÅveida Docker JAR attÄlu ar Docker failu.
Kad mÄs izmantojam Docker, mums ir jÄveic divas papildu darbÄ«bas, lai izvilktu slÄÅus un kopÄtu tos galÄ«gajÄ attÄlÄ.
IegÅ«tÄ JAR saturs pÄc Maven izveides ar iespÄjotu slÄÅoÅ”anu izskatÄ«sies Å”Ädi:
Izvade parÄda papildu JAR ar nosaukumu spring-boot-jarmode-layertoolsŠø layersfle.idxfailu. Å is papildu JAR fails nodroÅ”ina slÄÅoÅ”anas iespÄjas, kÄ aprakstÄ«ts nÄkamajÄ sadaļÄ.
Izvilkt atkarÄ«bas no atseviŔķiem slÄÅiem
Lai skatÄ«tu un izvilktu slÄÅus no mÅ«su slÄÅveida JAR, mÄs izmantojam sistÄmas rekvizÄ«tu -Djarmode=layertoolssÄkumam spring-boot-jarmode-layertoolsJAR lietojumprogrammas vietÄ:
Palaižot Å”o komandu, tiek iegÅ«ta izvade ar pieejamÄm komandas opcijÄm:
Usage:
java -Djarmode=layertools -jar usersignup-0.0.1-SNAPSHOT.jar
Available commands:
list List layers from the jar that can be extracted
extract Extracts layers from the jar for image creation
help Help about any command
Izvade parÄda komandas list, extractŠø helpŃ helpbÅ«t noklusÄjuma. IzpildÄ«sim komandu ar listvariants:
java -Djarmode=layertools -jar target/usersignup-0.0.1-SNAPSHOT.jar list
MÄs redzam to atkarÄ«bu sarakstu, kuras var pievienot kÄ slÄÅus.
NoklusÄjuma slÄÅi:
SlÄÅa nosaukums
saturs
dependencies
jebkura atkarība, kuras versija nesatur SNAPSHOT
spring-boot-loader
JAR iekrÄvÄju klases
snapshot-dependencies
jebkura atkarība, kuras versija satur SNAPSHOT
application
lietojumprogrammu klases un resursi
SlÄÅi ir definÄti layers.idxfailu tÄdÄ secÄ«bÄ, kÄdÄ tie jÄpievieno Docker attÄlam. Å ie slÄÅi tiek saglabÄti keÅ”atmiÅÄ resursdatorÄ pÄc pirmÄs ielÄdes, jo tie nemainÄs. Uz resursdatora tiek lejupielÄdÄts tikai atjauninÄtais lietojumprogrammas slÄnis, kas ir ÄtrÄks samazinÄtÄ izmÄra dÄļ .
AttÄla veidoÅ”ana ar atkarÄ«bÄm, kas izvilktas atseviŔķos slÄÅos
MÄs izveidosim galÄ«go attÄlu divos posmos, izmantojot metodi, ko sauc daudzpakÄpju montÄža . PirmajÄ solÄ« mÄs izgÅ«sim atkarÄ«bas, bet otrajÄ solÄ« mÄs kopÄsim iegÅ«tÄs atkarÄ«bas galÄ«gajÄ .
ModificÄsim savu Dockerfile daudzpakÄpju bÅ«vÄÅ”anai:
# the first stage of our build will extract the layers
FROM adoptopenjdk:14-jre-hotspot as builder
WORKDIR application
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract
# the second stage of our build will copy the extracted layers
FROM adoptopenjdk:14-jre-hotspot
WORKDIR application
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
PÄc Ŕīs komandas izpildes mÄs saÅemam Å”Ädu izvadi:
Sending build context to Docker daemon 20.41MB
Step 1/12 : FROM adoptopenjdk:14-jre-hotspot as builder
14-jre-hotspot: Pulling from library/adoptopenjdk
.
.
Successfully built a9ebf6970841
Successfully tagged userssignup:v1
MÄs redzam, ka Docker attÄls tiek izveidots ar attÄla ID un pÄc tam tiek atzÄ«mÄts.
Visbeidzot, mÄs palaižam komandu Dive tÄpat kÄ iepriekÅ”, lai pÄrbaudÄ«tu Ä£enerÄtÄ Docker attÄla slÄÅus. MÄs varam nodroÅ”inÄt attÄla ID vai tagu kÄ ievadi komandai Dive:
dive userssignup:v1
KÄ redzat no izvades, slÄnis, kurÄ ir lietojumprogramma, tagad ir tikai 11 KB, un atkarÄ«bas tiek saglabÄtas keÅ”atmiÅÄ atseviŔķos slÄÅos.
Izvilkt iekÅ”ÄjÄs atkarÄ«bas no atseviŔķiem slÄÅiem
MÄs varam vÄl vairÄk samazinÄt lietojumprogrammas slÄÅa izmÄru, izvelkot jebkuru no mÅ«su pielÄgotajÄm atkarÄ«bÄm atseviÅ”Ä·Ä slÄnÄ«, nevis iesaiÅojot tÄs kopÄ ar lietojumprogrammu, deklarÄjot tÄs ymllÄ«dzÄ«gs fails ar nosaukumu layers.idx:
Å ajÄ failÄ layers.idxesam pievienojuÅ”i pielÄgotu atkarÄ«bu ar nosaukumu, io.myorgkas satur organizÄcijas atkarÄ«bas, kas izgÅ«tas no koplietotÄ repozitorija.
secinÄjums
Å ajÄ rakstÄ mÄs apskatÄ«jÄm Cloud-Native Buildpacks izmantoÅ”anu, lai izveidotu konteinera attÄlu tieÅ”i no avota. Å Ä« ir alternatÄ«va Docker izmantoÅ”anai, lai izveidotu konteinera attÄlu parastajÄ veidÄ: vispirms tiek izveidots biezs izpildÄms JAR fails un pÄc tam tiek iesaiÅots konteinera attÄlÄ, norÄdot norÄdÄ«jumus Dockerfile.
MÄs arÄ« izskatÄ«jÄm sava konteinera optimizÄÅ”anu, iekļaujot slÄÅoÅ”anas funkciju, kas izvelk atkarÄ«bas atseviŔķos slÄÅos, kas tiek saglabÄti saimniekdatora keÅ”atmiÅÄ, un plÄnoÅ”anas laikÄ konteinera izpildprogrammÄs tiek ielÄdÄts plÄns lietojumprogrammas slÄnis.
Visu rakstÄ izmantoto avota kodu varat atrast vietnÄ GitHub .
Komandu atsauce
Å eit ir sniegts Å”ajÄ rakstÄ izmantoto komandu kopsavilkums Ätrai uzziÅai.
Konteksta notīrīŔana:
docker system prune -a
Konteinera attÄla izveide, izmantojot Dockerfile:
docker build -f <Docker file name> -t <tag> .
Veidot konteinera attÄlu no avota (bez Dockerfile):
mvn spring-boot:build-image
SkatÄ«t atkarÄ«bas slÄÅus. Pirms lietojumprogrammas jar faila izveides pÄrliecinieties, vai spraudnÄ« spring-boot-maven-plugin ir iespÄjota slÄÅu funkcija:
java -Djarmode=layertools -jar application.jar list
AtkarÄ«bas slÄÅu izvilkÅ”ana. Pirms lietojumprogrammas jar faila izveides pÄrliecinieties, vai spraudnÄ« spring-boot-maven-plugin ir iespÄjota slÄÅu funkcija: