Ukwakha Izithombe Ze-Docker Ezithuthukisiwe zohlelo lokusebenza lwe-Spring Boot

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 ku-GitHub .

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 standardVula 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.

Docker iwukusetshenziswa kwesitsha esivame ukusetshenziswa kakhulu, futhi sisebenzisa i-Docker ezibonelweni zethu, ngakho-ke zonke izinkomba zesiqukathi ezilandelayo kulesi sihloko zizobhekisa ku-Docker.

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 I-Spring Initializr ngokuncika weblombokΠΈ actuator. Futhi sengeza isilawuli sokuphumula ukuze sinikeze i-API ngaso GETindlela.

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, 8080ezolalela 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 buildkusuka 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 usersignupkanye nesithombe esiyisisekelo, adoptopenjdkecaciswe 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 ithuluzi  tshuza ukubuka lezi zendlalelo:

dive usersignup:v1

Nansi ingxenye yokuphuma komyalo we-Dive: 

Ukwakha Izithombe Ze-Docker Ezithuthukisiwe zohlelo lokusebenza lwe-Spring Boot

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

Amaphakheji womhlangano (Amaphakethe okwakha) igama elivamile elisetshenziswa iPlatform ehlukahlukene njengesevisi (i-PAAS) enikelwe ukuze kwakhiwe isithombe sesiqukathi kusuka kukhodi yomthombo. Yasungulwa ngu-Heroku ngo-2011 futhi selokhu yamukelwa yi-Cloud Foundry, Google App Engine, Gitlab, Knative nabanye abambalwa.

Ukwakha Izithombe Ze-Docker Ezithuthukisiwe zohlelo lokusebenza lwe-Spring Boot

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 bootBuildImageimisebenzi (Gradle) noma spring-boot:build-imageokuhlosiwe (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-imageimigomo 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 buildpackesetshenziselwa 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-pluginku-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 "Fat JAR" phakathi njengefomethi yokupakisha ezenzakalelayo. Uma sibheka i-JAR ewugqinsi, siyabona ukuthi uhlelo lokusebenza lwakha ingxenye encane kakhulu ye-JAR yonke. Lena ingxenye eshintsha kaningi. Okusele kuqukethe okuncike ku-Spring Framework.

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:

Ukwakha Izithombe Ze-Docker Ezithuthukisiwe zohlelo lokusebenza lwe-Spring Boot

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-imageIthagethi 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:

Ukwakha Izithombe Ze-Docker Ezithuthukisiwe zohlelo lokusebenza lwe-Spring Boot

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.idxifayela. 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=layertoolsokokuqala spring-boot-jarmode-layertoolsI-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 listextractΠΈ helpс helpkube okuzenzakalelayo. Masigijime umyalo nge listinketho:

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.idxifayela 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 umhlangano wezigaba eziningi . Esinyathelweni sokuqala sizokhipha okuncikile futhi esinyathelweni sesibili sizokopisha ukuncika okukhishiwe esithombeni sokugcina.

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. 

Ukwakha Izithombe Ze-Docker Ezithuthukisiwe zohlelo lokusebenza lwe-Spring Boot

Ikhipha ukuncika kwangaphakathi ngezandlalelo ngazinye

Singaqhubeka sinciphise usayizi wesigaba sohlelo lokusebenza ngokukhipha noma yikuphi ukuncika kwethu ngokwezifiso kusigaba esihlukile esikhundleni sokukupakisha ngohlelo lokusebenza ngokukumemezela ymlifayela 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.idxsengeze ukuncika ngokwezifiso okuqanjwe, io.myorgequkethe 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 I-Github .

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