Iziqukathi seziphenduke izindlela ezithandwayo zokupakisha uhlelo lokusebenza nayo yonke isoftware yalo kanye nokuncika kwesistimu yokusebenza bese iziletha ezindaweni ezahlukene.
Lesi sihloko sihlanganisa izindlela ezihlukene zokufaka isicelo se-Spring Boot:
- ukudala isithombe se-Docker usebenzisa ifayela le-Docker,
- ukudala isithombe se-OCI kusuka emthonjeni kusetshenziswa i-Cloud-Native Buildpack,
- kanye nokwenza kahle kwesithombe sesikhathi sokusebenza ngokuhlukanisa izingxenye ze-JAR zibe izendlalelo ezihlukene kusetshenziswa amathuluzi anezigaba eziningi.
Isibonelo sekhodi
Lesi sihloko sihambisana nesibonelo sekhodi yokusebenza
Amagama esiqukathi
Sizoqala ngamagama esiqukathi asetshenziswe esihlokweni:
- Isithombe sesitsha: ifayela lefomethi ethile. Sizoguqula uhlelo lwethu lokusebenza lube isithombe sesitsha ngokusebenzisa ithuluzi lokwakha.
- Isiqukathi: Isenzakalo esisebenzisekayo sesithombe sesiqukathi.
- Injini yesiqukathi: Inqubo ye-daemon enesibopho sokusebenzisa isiqukathi.
- Umsingathi wesitsha: Ikhompyutha yomsingathi lapho injini yesiqukathi isebenza khona.
- Irejista yesiqukathi: Indawo evamile esetshenziselwa ukushicilela nokusabalalisa isithombe sesiqukathi.
- OCI standard:
Vula I-Container Initiative (OCI) iwuhlaka olulula, oluvulekile lokubusa olwakhiwe ngaphakathi kwe-Linux Foundation. I-OCI Image Specification ichaza amazinga embonini ezithombe zesiqukathi namafomethi wesikhathi sokusebenza ukuze kuqinisekiswe ukuthi zonke izinjini zeziqukathi zingasebenzisa izithombe zesiqukathi ezidalwe yinoma yiliphi ithuluzi lokwakha.
Ukuze sifake uhlelo lokusebenza, sigoqa uhlelo lwethu lokusebenza esithombeni sesiqukathi futhi sishicilele leso sithombe ekubhaliseni okwabiwe. Isikhathi sokusebenza sesiqukathi sibuyisa lesi sithombe kurejista, sisikhiphe, futhi sisebenzise uhlelo lokusebenza ngaphakathi kwaso.
Inguqulo engu-2.3 ye-Spring Boot inikeza ama-plugin okudala izithombe ze-OCI.
Ukwakha isithombe sesitsha ngendlela evamile
Ukudala izithombe ze-Docker zezinhlelo zokusebenza ze-Spring Boot kulula kakhulu ngokungeza imiyalelo embalwa kufayela le-Docker.
Siqala sakha ifayela le-JAR elisebenzisekayo futhi, njengengxenye yemiyalelo yefayela le-Docker, sikopisha ifayela le-JAR elisebenzisekayo phezu kwesithombe esiyisisekelo se-JRE ngemva kokufaka izilungiselelo ezidingekayo.
Masidale isicelo sethu saseNtwasahlobo web
, lombok
ΠΈ actuator
. Futhi sengeza isilawuli sokuphumula ukuze sinikeze i-API ngaso GET
indlela.
Ukudala i-Dockerfile
Sibe sesifaka lolu hlelo lokusebenza ngokungeza Dockerfile
:
FROM adoptopenjdk:11-jre-hotspot
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/application.jar"]
Ifayela lethu le-Docker liqukethe isithombe esiyisisekelo esivela ku adoptopenjdk
, phezu kwalokho sikopisha ifayela lethu le-JAR bese sivula ichweba, 8080
ezolalela izicelo.
Ukwakha isicelo
Okokuqala udinga ukudala uhlelo lokusebenza usebenzisa i-Maven noma i-Gradle. Lapha sisebenzisa i-Maven:
mvn clean package
Lokhu kudala ifayela le-JAR elisebenzisekayo lohlelo lokusebenza. Sidinga ukuguqula le JAR esebenzisekayo ibe yisithombe se-Docker ukuze sisebenze enjini ye-Docker.
Ukudala isithombe sesitsha
Sibe sesifaka leli fayela le-JAR elisebenzisekayo esithombeni se-Docker ngokusebenzisa umyalo docker build
kusuka kumkhombandlela wempande wephrojekthi oqukethe i-Dockerfile eyakhiwe ngaphambili:
docker build -t usersignup:v1 .
Singabona isithombe sethu ohlwini sisebenzisa umyalo:
docker images
Umphumela womyalo ongenhla uhlanganisa isithombe sethu usersignup
kanye nesithombe esiyisisekelo, adoptopenjdk
ecaciswe kufayela lethu le-Docker.
REPOSITORY TAG SIZE
usersignup v1 249MB
adoptopenjdk 11-jre-hotspot 229MB
Buka izendlalelo ngaphakathi kwesithombe sesitsha
Ake sibheke inqwaba yezendlalelo ngaphakathi kwesithombe. Sizosebenzisa
dive usersignup:v1
Nansi ingxenye yokuphuma komyalo we-Dive:
Njengoba sibona, isendlalelo sohlelo lokusebenza senza ingxenye ebalulekile yosayizi wesithombe. Sifuna ukunciphisa usayizi walesi sendlalelo ezigabeni ezilandelayo njengengxenye yokuthuthukisa kwethu.
Ukudala isithombe sesitsha usebenzisa i-Buildpack
Inzuzo yamaphakheji wokwakha amafu
Enye yezinzuzo eziyinhloko zokusebenzisa i-Buildpack ukudala izithombe ukuthi Izinguquko zokucushwa kwesithombe zingaphathwa endaweni eyodwa (umakhi) futhi zisatshalaliswe kuzo zonke izinhlelo zokusebenza kusetshenziswa umakhi.
Amaphakheji okwakha ahlanganiswe ngokuqinile endaweni yesikhulumi. I-Cloud-Native Buildpacks ihlinzeka ngokumiswa kuzo zonke izinkundla ngokusekela ifomethi yesithombe ye-OCI, eqinisekisa ukuthi isithombe singaqhutshwa injini ye-Docker.
Ukusebenzisa i-plugin ye-Spring Boot
I-plugin ye-Spring Boot yakha izithombe ze-OCI kusuka emthonjeni kusetshenziswa i-Buildpack. Izithombe zidalwe kusetshenziswa bootBuildImage
imisebenzi (Gradle) noma spring-boot:build-image
okuhlosiwe (i-Maven) nokufakwa kwe-Docker yendawo.
Singenza ngendlela oyifisayo igama lesithombe esidingekayo ukuze siphushele ebhukwini le-Docker ngokucacisa igama elikuyo image tag
:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<name>docker.io/pratikdas/${project.artifactId}:v1</name>
</image>
</configuration>
</plugin>
Masisebenzise iMaven ukuze sikwenze build-image
imigomo yokudala uhlelo lokusebenza nokudala isithombe sesitsha. Asisebenzisi noma yimaphi ama-Dockerfiles ngalesi sikhathi.
mvn spring-boot:build-image
Umphumela uzoba into enjengale:
[INFO] --- spring-boot-maven-plugin:2.3.3.RELEASE:build-image (default-cli) @ usersignup ---
[INFO] Building image 'docker.io/pratikdas/usersignup:v1'
[INFO]
[INFO] > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 0%
.
.
.. [creator] Adding label 'org.springframework.boot.version'
.. [creator] *** Images (c311fe74ec73):
.. [creator] docker.io/pratikdas/usersignup:v1
[INFO]
[INFO] Successfully built image 'docker.io/pratikdas/usersignup:v1'
Kusukela ekuphumeni sikubona lokho paketo Cloud-Native buildpack
esetshenziselwa ukudala isithombe se-OCI esisebenzayo. Njengangaphambili, singabona isithombe esisohlwini lwesithombe se-Docker ngokusebenzisa umyalo:
docker images
Isiphetho:
REPOSITORY SIZE
paketobuildpacks/run 84.3MB
gcr.io/paketo-buildpacks/builder 652MB
pratikdas/usersignup 257MB
Ukudala isithombe sesitsha usebenzisa i-Jib
I-Jib iyi-plugin yokudala isithombe evela ku-Google enikeza enye indlela yokudala isithombe sesiqukathi kusuka kukhodi yomthombo.
Iyalungisa jib-maven-plugin
ku-pom.xml:
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>2.5.2</version>
</plugin>
Okulandelayo, sisebenzisa i-plugin ye-Jib sisebenzisa umyalo we-Maven ukwakha uhlelo lokusebenza futhi sakhe isithombe sesitsha. Njengangaphambili, asisebenzisi noma yimaphi amafayela e-Docker lapha:
mvn compile jib:build -Dimage=<docker registry name>/usersignup:v1
Ngemuva kokukhipha umyalo ongenhla we-Maven, sithola okulandelayo:
[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
Okukhiphayo kubonisa ukuthi isithombe sesiqukathi senziwe futhi safakwa kurejista.
Izisusa namasu okudala izithombe ezithuthukisiwe
Sinezizathu ezimbili eziyinhloko zokuthuthukisa:
- Ukukhiqiza: Kusistimu ye-orchestration yesiqukathi, isithombe sesiqukathi siyabuyiswa kusukela kurejista yesithombe kumsingathi osebenzisa injini yesiqukathi. Le nqubo ibizwa ngokuthi ukuhlela. Ukudonsa izithombe ezinkulu kumphumela wokubhalisa ezikhathini ezinde zokuhlela ezinhlelweni ze-orchestration zesitsha kanye nezikhathi ezinde zokwakha kumapayipi e-CI.
- Ukuphepha: Izithombe ezinkulu nazo zinendawo enkulu yokuba sengozini.
Isithombe se-Docker siqukethe inqwaba yezendlalelo, ngayinye emele imiyalelo ku-Dockerfile yethu. Isendlalelo ngasinye simele i-delta yezinguquko kusendlalelo esingaphansi. Uma sidonsa isithombe se-Docker kurejista, sidonswa ngezigaba futhi sifakwe kunqolobane kumsingathi.
I-Spring Boot isebenzisa
Ifomula yokuthuthukisa igxile ekuhlukaniseni uhlelo lokusebenza ezingeni elihlukile kokuncika kohlaka Lwentwasahlobo.
Isendlalelo sokuncika, esakha inqwaba yefayela eliwugqinsi le-JAR, lilandwa kanye kuphela futhi lifakwe kunqolobane kusistimu yomsingathi.
Ungqimba oluncane kuphela lohlelo lokusebenza oludonswayo phakathi nezibuyekezo zohlelo lokusebenza nokuhlelwa kwesiqukathi. njengoba kukhonjisiwe kulo mdwebo:
Ezigabeni ezilandelayo, sizobheka ukuthi singazenza kanjani lezi zithombe ezilungiselelwe uhlelo lokusebenza lwe-Spring Boot.
Ukudala Isithombe Sesitsha Esithuthukisiwe sohlelo lokusebenza lwe-Spring Boot usebenzisa i-Buildpack
I-Spring Boot 2.3 isekela ukwendlaleka ngokukhipha izingxenye zefayela eliwugqinsi le-JAR libe izendlalelo ezihlukene. Isici sokubeka isendlalelo sikhutshaziwe ngokuzenzakalelayo futhi kufanele sivunyelwe ngokusobala kusetshenziswa i-plugin ye-Spring Boot Maven:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layers>
<enabled>true</enabled>
</layers>
</configuration>
</plugin>
Sizosebenzisa lokhu kulungiselelwa ukwakha isithombe sethu sesitsha kuqala nge-Buildpack bese nge-Docker ezigabeni ezilandelayo.
Asiqalise build-image
Ithagethi ka-Maven yokudala isithombe sesiqukathi:
mvn spring-boot:build-image
Uma sisebenzisa i-Diveza ukuze sibone izendlalelo esithombeni esiwumphumela, singabona ukuthi isendlalelo sohlelo lokusebenza (esichazwe ngokubomvu) sincane kakhulu kububanzi bekhilobhayithi uma siqhathaniswa nesikuthole sisebenzisa ifomethi ye-JAR ewugqinsi:
Ukudala isithombe Sesitsha Esilungiselelwe Ukufaka Isicelo Se-Spring Boot usebenzisa i-Docker
Esikhundleni sokusebenzisa i-plugin ye-Maven noma ye-Gradle, singakwazi futhi ukudala isithombe se-Docker JAR esinezingqimba ngefayela le-Docker.
Uma sisebenzisa i-Docker, sidinga ukwenza izinyathelo ezimbili ezengeziwe ukuze sikhiphe izendlalelo futhi sizikopishe esithombeni sokugcina.
Okuqukethwe kwe-JAR ewumphumela ngemuva kokwakha kusetshenziswa i-Maven ene-layer enikwe amandla izobukeka kanje:
META-INF/
.
BOOT-INF/lib/
.
BOOT-INF/lib/spring-boot-jarmode-layertools-2.3.3.RELEASE.jar
BOOT-INF/classpath.idx
BOOT-INF/layers.idx
Okukhiphayo kubonisa i-JAR eyengeziwe ebizwa spring-boot-jarmode-layertools
ΠΈ layersfle.idx
ifayela. Leli fayela elengeziwe le-JAR lihlinzeka ngamakhono okucubungula anezingqimba, njengoba kuchazwe esigabeni esilandelayo.
Ikhipha ukuncika kuzingqimba ngazinye
Ukuze ubuke futhi ukhiphe izendlalelo ku-JAR yethu enezingqimba, sisebenzisa impahla yesistimu -Djarmode=layertools
okokuqala spring-boot-jarmode-layertools
I-JAR esikhundleni sohlelo lokusebenza:
java -Djarmode=layertools -jar target/usersignup-0.0.1-SNAPSHOT.jar
Ukusebenzisa lo myalo kukhiqiza okukhiphayo okuqukethe izinketho zomyalo ezitholakalayo:
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
Okukhiphayo kubonisa imiyalo list
, extract
ΠΈ help
Ρ help
kube okuzenzakalelayo. Masigijime umyalo nge list
inketho:
java -Djarmode=layertools -jar target/usersignup-0.0.1-SNAPSHOT.jar list
dependencies
spring-boot-loader
snapshot-dependencies
application
Sibona uhlu lokuncika okungangezwa njengezendlalelo.
Izendlalelo ezizenzakalelayo:
Igama lesendlalelo
Okuqukethwe
dependencies
noma yikuphi ukuncika okunguqulo yakho ingaqukethe IZIFANEKISO
spring-boot-loader
I-JAR Loader Amakilasi
snapshot-dependencies
noma yikuphi ukuncika okunguqulo yakho iqukethe IZIFANEKISO
application
amakilasi ohlelo lokusebenza nezinsiza
Izendlalelo zichazwe ngaphakathi layers.idx
ifayela ngendlela okufanele lifakwe ngayo esithombeni se-Docker. Lezi zendlalelo zifakwe kunqolobane kumsingathi ngemva kokubuyisa kokuqala ngoba azishintshi. Isendlalelo sohlelo lokusebenza olubuyekeziwe kuphela esilandwa kumsingathi, osheshayo ngenxa yosayizi oncishisiwe .
Ukwakha isithombe esinokuncika kukhishelwe izendlalelo ezihlukene
Sizokwakha isithombe sokugcina ngezigaba ezimbili sisebenzisa indlela ebizwa
Masilungise i-Dockerfile yethu ukuze kube nezigaba eziningi zokwakha:
# 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"]
Sigcina lokhu kulungiselelwa efayeleni elihlukile - Dockerfile2
.
Sakha isithombe se-Docker sisebenzisa umyalo:
docker build -f Dockerfile2 -t usersignup:v1 .
Ngemuva kokusebenzisa lo myalo sithola okukhiphayo okulandelayo:
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
Siyabona ukuthi isithombe se-Docker senziwa nge-ID yesithombe bese simakwa.
Ekugcineni, sisebenzisa umyalo we-Dive njengangaphambili ukuze sihlole izendlalelo ezingaphakathi kwesithombe se-Docker esikhiqiziwe. Singahlinzeka nge-ID yesithombe noma umaka njengokufakiwe kumyalo we-Dive:
dive userssignup:v1
Njengoba ubona kokuphumayo, isendlalelo esiqukethe uhlelo lokusebenza manje sesiyi-11 KB kuphela, futhi okuncikile kufakwe kunqolobane ezendlalelo ezihlukene.
Ikhipha ukuncika kwangaphakathi ngezandlalelo ngazinye
Singaqhubeka sinciphise usayizi wesigaba sohlelo lokusebenza ngokukhipha noma yikuphi ukuncika kwethu ngokwezifiso kusigaba esihlukile esikhundleni sokukupakisha ngohlelo lokusebenza ngokukumemezela yml
ifayela elifanayo eliqanjwe igama layers.idx
:
- "dependencies":
- "BOOT-INF/lib/"
- "spring-boot-loader":
- "org/"
- "snapshot-dependencies":
- "custom-dependencies":
- "io/myorg/"
- "application":
- "BOOT-INF/classes/"
- "BOOT-INF/classpath.idx"
- "BOOT-INF/layers.idx"
- "META-INF/"
Kuleli fayela layers.idx
sengeze ukuncika ngokwezifiso okuqanjwe, io.myorg
equkethe ukuncika kwenhlangano okubuyiswe endaweni yokugcina okwabelwana ngayo.
isiphetho
Kulesi sihloko, sibheke ukusebenzisa i-Cloud-Native Buildpacks ukwakha isithombe sesiqukathi ngokuqondile kusuka kukhodi yomthombo. Lena enye indlela yokusebenzisa i-Docker ukwakha isithombe sesitsha ngendlela evamile: qala ngokudala ifayela eliwugqinsi elisebenzisekayo le-JAR bese ulipakisha esithombeni sesitsha ngokucacisa imiyalelo efayeleni le-Docker.
Siphinde sabheka ekuthuthukiseni isiqukathi sethu ngokunika amandla isici sokwendlalela esidonsa okuncikile kube izendlalelo ezihlukene ezifakwe kunqolobane kumsingathi futhi ungqimba oluncane lohlelo lokusebenza lulayishwa ngesikhathi sokuhlela ezinjini zokusayinda zesiqukathi.
Ungathola yonke ikhodi yomthombo esetshenziswe esihlokweni kokuthi
Ireferensi yomyalo
Nasi isifinyezo esisheshayo semiyalo esiyisebenzisile kulesi sihloko.
Ukusula okuqukethwe:
docker system prune -a
Ukudala isithombe sesitsha usebenzisa ifayela le-Docker:
docker build -f <Docker file name> -t <tag> .
Sakha isithombe sesitsha kusuka kukhodi yomthombo (ngaphandle kwe-Dockerfile):
mvn spring-boot:build-image
Buka izendlalelo zokuncika. Ngaphambi kokwakha ifayela le-JAR lohlelo lokusebenza, qiniseka ukuthi isici sokubeka sinikwe amandla ku-spring-boot-maven-plugin:
java -Djarmode=layertools -jar application.jar list
Ikhipha izendlalelo zokuncika. Ngaphambi kokwakha ifayela le-JAR lohlelo lokusebenza, qiniseka ukuthi isici sokwendlalela sinikwe amandla ku-spring-boot-maven-plugin:
java -Djarmode=layertools -jar application.jar extract
Buka uhlu lwezithombe zesiqukathi
docker images
Buka kwesokunxele ngaphakathi kwesithombe sesiqukathi (qiniseka ukuthi ithuluzi lokutshuza lifakiwe):
dive <image ID or image tag>
Source: www.habr.com