Ukudala iMifanekiso yeDocker eNgcotshiweyo kwiSicelo sokuQalwa kweNtwasahlobo

Imigqomo iye yaba yindlela ekhethwayo yokupakisha isicelo kunye nayo yonke isoftware yayo kunye nokuxhomekeka kwenkqubo yokusebenza kwaye emva koko ihanjiswe kwiindawo ezahlukeneyo.

Eli nqaku ligubungela iindlela ezahlukeneyo zokufaka isicelo seSpring Boot:

  • ukwenza umfanekiso weDocker usebenzisa ifayile yeDocker,
  • ukwenza umfanekiso we-OCI kumthombo usebenzisa i-Cloud-Native Buildpack,
  • kunye nexesha lokuqhuba umfanekiso wokuphucula ngokuhlula iinxalenye ze-JAR kwimigangatho eyahlukeneyo usebenzisa izixhobo ezininzi.

 Umzekelo wekhowudi

Eli nqaku lihamba kunye nomzekelo wekhowudi yokusebenza kwiGitHub .

Isigama sesikhongozeli

Siza kuqala ngesigama sesikhongozeli esisetyenziswe kwinqaku:

  • Umfanekiso wesikhongozeli: ifayile yohlobo oluthile. Siza kuguqula isicelo sethu sibe ngumfanekiso wesikhongozeli ngokuqhuba isixhobo sokwakha.
  • Isikhongozelo: Umzekelo ophunyeziweyo womfanekiso wesikhongozeli.
  • Injini yesikhongozeli: Inkqubo yedaemon enoxanduva lokuqhuba isikhongozeli.
  • Umamkeli wesikhongozeli: Ikhompyuter yenginginya apho injini yesikhongozeli isebenza khona.
  • Ubhaliso lwesikhongozeli: Indawo jikelele esetyenziselwa ukupapasha nokusasaza umfanekiso wesikhongozeli.
  • OCI umgangathoVula Inyathelo leSikhongozeli (OCI) Lubukhaphukhaphu, ubume bolawulo obuvulekileyo obusekwe kwiSiseko seLinux. I-OCI Image Specification ichaza imigangatho yoshishino yomfanekiso wesikhongozeli kunye neefomati zexesha lokuqhuba ukuqinisekisa ukuba zonke ii-injini zesikhongozeli zinokuqhuba imifanekiso yesikhongozeli eyenziwe nasiphi na isixhobo sokwakha.

Ukufakela isicelo, sisonga isicelo sethu kumfanekiso wesikhongozeli kwaye sipapashe loo mfanekiso kwirejista ekwabelwana ngayo. Ixesha lokuqhuba lesikhongozeli lifumana lo mfanekiso kwirejista, iwukhuphe, kwaye iqhube isicelo ngaphakathi kwayo.

Inguqulo ye-2.3 ye-Spring Boot ibonelela ngeeplagi zokwenza imifanekiso ye-OCI.

Docker sesona sikhongozeli sisetyenziswa kakhulu, kwaye sisebenzisa iDocker kwimizekelo yethu, ke zonke iireferensi zesikhongozeli ezilandelayo kweli nqaku ziya kubhekisa kwiDocker.

Ukwakha umfanekiso wesikhongozeli ngendlela yemveli

Ukwenza imifanekiso yeDocker kwizicelo ze-Spring Boot kulula kakhulu ngokongeza imiyalelo embalwa kwifayile yeDocker.

Siqala ngokudala ifayile yeJAR ephunyezwayo kwaye, njengenxalenye yemiyalelo yefayile yeDocker, khuphela ifayile yeJAR ephunyezwayo ngaphezulu kwesiseko somfanekiso weJRE emva kokufaka useto oluyimfuneko.

Masidale usetyenziso lwethu lwaseNtwasahlobo I-Spring Initializr ngokuxhomekeka weblombokΠΈ actuator. Kwakhona songeza isilawuli sokuphumla ukubonelela nge-API GETindlela.

Ukwenza iDockerfile

Emva koko sifaka esi sicelo ngokudibanisa Dockerfile:

FROM adoptopenjdk:11-jre-hotspot
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/application.jar"]

Ifayile yethu yeDocker inomfanekiso osisiseko ovela adoptopenjdk, ngaphezulu apho sikhuphela ifayile yethu yeJAR kwaye emva koko sivule izibuko, 8080eya kuphulaphula izicelo.

Ukwakha isicelo

Okokuqala kufuneka wenze isicelo usebenzisa iMaven okanye iGradle. Apha sisebenzisa iMaven:

mvn clean package

Oku kwenza ifayile yeJAR ephunyeziweyo yesicelo. Kufuneka siguqule le JAR ephunyezwayo ibe ngumfanekiso weDocker ukuze usebenze kwi-injini yeDocker.

Ukwenza umfanekiso wesikhongozeli

Emva koko sibeka le fayile yeJAR ephunyezwayo kumfanekiso weDocker ngokuqhuba umyalelo docker buildukusuka kulawulo lweengcambu zeprojekthi equlethe iDockerfile eyenziwe ngaphambili:

docker build  -t usersignup:v1 .

Sinokubona umfanekiso wethu kuluhlu sisebenzisa umyalelo:

docker images 

Imveliso yalo myalelo ungasentla ibandakanya umfanekiso wethu usersignupkunye nomfanekiso osisiseko, adoptopenjdkichazwe kwifayile yethu yeDocker.

REPOSITORY          TAG                 SIZE
usersignup          v1                  249MB
adoptopenjdk        11-jre-hotspot      229MB

Jonga iileya ngaphakathi komfanekiso wesikhongozeli

Makhe sijonge kwinqwaba yeeleya ngaphakathi komfanekiso. Siza kusebenzisa isixhobo  ukuntywila ukujonga olu maleko:

dive usersignup:v1

Nantsi inxalenye yesiphumo esivela kumyalelo weDive: 

Ukudala iMifanekiso yeDocker eNgcotshiweyo kwiSicelo sokuQalwa kweNtwasahlobo

Njengoko sibona, umaleko wesicelo wenza inxalenye ebalulekileyo yobukhulu bomfanekiso. Sifuna ukunciphisa ubungakanani bolu maleko kumacandelo alandelayo njengenxalenye yolungiselelo lwethu.

Ukwenza umfanekiso wesikhongozeli usebenzisa i-Buildpack

Iiphakheji zeNdibano (Iipakethi zokwakha) ligama eliqhelekileyo elisetyenziswa yiPlatform eyahlukeneyo njengeNkonzo (i-PAAS) iminikelo yokudala umfanekiso wesikhongozeli kwikhowudi yomthombo. Yasungulwa nguHeroku ngo-2011 kwaye sele yamkelwa yi-Cloud Foundry, i-Google App Engine, i-Gitlab, i-Knative kunye nabanye abaninzi.

Ukudala iMifanekiso yeDocker eNgcotshiweyo kwiSicelo sokuQalwa kweNtwasahlobo

Inzuzo yeepakethe zokwakha ilifu

Enye yeenzuzo eziphambili zokusebenzisa i-Buildpack ukwenza imifanekiso kukuba Utshintsho loqwalaselo lomfanekiso lunokulawulwa embindini (umakhi) kwaye lusasazwe kuzo zonke izicelo kusetyenziswa umakhi.

Iipasile zokwakha zadityaniswa ngokuqinileyo eqongeni. I-Cloud-Native Buildpacks ibonelela ngokusemgangathweni kuwo onke amaqonga ngokuxhasa ifomathi ye-OCI yomfanekiso, eqinisekisa ukuba umfanekiso unokuqhutywa yi-injini ye-Docker.

Ukusebenzisa iplagi ye-Spring Boot

Iplagi ye-Spring Boot yakha imifanekiso ye-OCI ukusuka kumthombo usebenzisa i-Buildpack. Imifanekiso yenziwa kusetyenziswa bootBuildImageimisebenzi (Gradle) okanye spring-boot:build-imageiithagethi (Maven) kunye nofakelo lweDocker yendawo.

Sinokwenza ngokwezifiso igama lomfanekiso ofunekayo ukutyhala kwirejista yeDocker ngokuchaza igama ngaphakathi 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 ukuyenza build-imageiinjongo zokwenza isicelo kunye nokudala umfanekiso wesikhongozeli. Asisebenzisi naziphi na iiDockerfiles ngeli xesha.

mvn spring-boot:build-image

Isiphumo siya kuba yinto efana nale:

[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'

Ukusuka kwimveliso sibona oko paketo Cloud-Native buildpackisetyenziselwa ukwenza umfanekiso osebenzayo we-OCI. Njengangaphambili, sinokubona umfanekiso odweliswe njengomfanekiso weDocker ngokuqhuba umyalelo:

docker images 

Isiphelo:

REPOSITORY                             SIZE
paketobuildpacks/run                  84.3MB
gcr.io/paketo-buildpacks/builder      652MB
pratikdas/usersignup                  257MB

Ukwenza umfanekiso wesikhongozeli usebenzisa iJib

I-Jib yiplagi yokudala umfanekiso evela kuGoogle ebonelela ngenye indlela yokwenza umfanekiso wesikhongozeli kwikhowudi yomthombo.

Ukuqwalasela jib-maven-pluginkwi pom.xml:

      <plugin>
        <groupId>com.google.cloud.tools</groupId>
        <artifactId>jib-maven-plugin</artifactId>
        <version>2.5.2</version>
      </plugin>

Emva koko, siqhuba i-plugin ye-Jib usebenzisa umyalelo we-Maven ukwakha isicelo kunye nokwenza umfanekiso wesikhongozeli. Njengangaphambili, asisebenzisi naziphi na iifayile zeDocker apha:

mvn compile jib:build -Dimage=<docker registry name>/usersignup:v1

Emva kokwenza lo myalelo ungasentla weMaven, sifumana oku kulandelayo:

[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

Imveliso ibonisa ukuba umfanekiso wesikhongozeli senziwe kwaye ubekwe kwirejista.

Iimpembelelo kunye nobuchule bokwenza imifanekiso ephuculweyo

Sinezizathu ezibini eziphambili zokulungiselela:

  • Imveliso: Kwisixokelelwano se-orchestration yesikhongozeli, umfanekiso wesikhongozeli uyafunyanwa kwirejistri yomfanekiso ukuya kumamkeli osebenzisa i-injini yesikhongozeli. Le nkqubo ibizwa ngokuba kukucwangcisa. Ukutsalwa kwemifanekiso emikhulu kwirejistri kukhokelela kwixesha elide lokucwangciswa kwiinkqubo ze-orchestration yesikhongozeli kunye namaxesha amade okwakha kwimibhobho yeCI.
  • Khu seleko: Imifanekiso emikhulu nayo inendawo enkulu yobuthathaka.

Umfanekiso weDocker uqulathe uthotho lweeleya, nganye kuzo imele umyalelo kwiDockerfile yethu. Umaleko ngamnye umele idelta yotshintsho kumaleko angaphantsi. Xa sitsala umfanekiso weDocker kwirejista, itsalwa ngokwemigangatho kwaye igcinwe kwi-host host.

I-Spring Boot isebenzisa "Fat JAR" ngaphakathi njengefomathi yokupakisha engagqibekanga. Xa sijonga i-JAR eshinyeneyo, sibona ukuba isicelo senza inxalenye encinci ye-JAR yonke. Le yinxenye etshintsha rhoqo. Intsalela iqulathe ukuxhomekeka kwiNkqubo-sikhokelo yeNtwasahlobo.

Ifomula yokuphucula igxile ekubekeni bucala isicelo kwinqanaba elahlukileyo kuxhomekeko lweSikhokelo seNtwasahlobo.

Umaleko wokuxhomekeka, owenza isambuku sefayile eshinyeneyo ye-JAR, ikhutshelwa kube kanye kuphela kwaye igcinwe kwi-cache kwindlela yokusingatha.

Kuphela umaleko omncinci wesicelo utsalwa ngexesha lohlaziyo lwesicelo kunye nokucwangciswa kwesikhongozeli. njengoko kubonisiwe kulo mzobo:

Ukudala iMifanekiso yeDocker eNgcotshiweyo kwiSicelo sokuQalwa kweNtwasahlobo

Kula macandelo alandelayo, siza kujonga indlela yokwenza le mifanekiso ilungiselelwe isicelo seSpring Boot.

Ukwenza uMfanekiso weSikhongozeli oLungileyo kwiSicelo sokuQalwa kweNtwasahlobo usebenzisa i-Buildpack

I-Spring Boot 2.3 ixhasa ukwaluka ngokukhupha iinxalenye zefayile eshinyeneyo ye-JAR ibe ngamaleko ahlukeneyo. Uphawu lomaleko luvaliwe ngokungagqibekanga kwaye kufuneka luvulwe ngokucacileyo kusetyenziswa iplagi yeSpring Boot Maven:

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <configuration>
    <layers>
      <enabled>true</enabled>
    </layers>
  </configuration> 
</plugin>

Siza kusebenzisa olu lungelelwaniso ukwakha umfanekiso wethu wesikhongozeli kuqala nge-Buildpack emva koko nge-Docker kula macandelo alandelayo.

Masiqalise build-imageIthagethi kaMaven yokwenza umfanekiso wesikhongozeli:

mvn spring-boot:build-image

Ukuba siqhuba i-Dive ukuze sibone iileya kumfanekiso oyisiphumo, siyabona ukuba umaleko wesicelo (ochazwe ngobomvu) umncinci kakhulu kuluhlu lwekhilobhayithi xa kuthelekiswa noko sikufumeneyo sisebenzisa ifomathi eshinyeneyo ye-JAR:

Ukudala iMifanekiso yeDocker eNgcotshiweyo kwiSicelo sokuQalwa kweNtwasahlobo

Ukwenza uMfanekiso weSikhongozeli oLungileyo kwiSicelo seSibhobho seNtwasahlobo usebenzisa iDocker

Endaweni yokusebenzisa iplagi ye-Maven okanye ye-Gradle, singenza kwakhona umfanekiso we-Docker JAR owenziweyo kunye nefayile ye-Docker.

Xa sisebenzisa iDocker, kufuneka senze amanyathelo amabini ongezelelweyo ukukhupha iileya kwaye sizikhuphele kumfanekiso wokugqibela.

Imixholo yesiphumo se-JAR emva kokwakha usebenzisa iMaven enolwaleko olunikwe amandla iya kujongeka ngolu hlobo:

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

Imveliso ibonisa i-JAR eyongezelelweyo ebizwa ngegama spring-boot-jarmode-layertoolsΠΈ layersfle.idxifayile. Le fayile ye-JAR eyongezelelweyo ibonelela ngezakhono zokucwangcisa, njengoko kuchaziwe kwicandelo elilandelayo.

Ukutsala ukuxhomekeka kwiileya zomntu ngamnye

Ukujonga kunye nokukhupha iileya kwi-JAR yethu eyakhiweyo, sisebenzisa ipropathi yenkqubo -Djarmode=layertoolsukuqala spring-boot-jarmode-layertoolsJAR endaweni yesicelo:

java -Djarmode=layertools -jar target/usersignup-0.0.1-SNAPSHOT.jar

Ukwenza lo myalelo kuvelisa imveliso equlethe iinketho zomyalelo ezikhoyo:

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

Imveliso ibonisa imiyalelo listextractΠΈ helpс helpibe yintsilelo. Masiqhube umyalelo nge listukhetho:

java -Djarmode=layertools -jar target/usersignup-0.0.1-SNAPSHOT.jar list
dependencies
spring-boot-loader
snapshot-dependencies
application

Sibona uluhlu lwezinto ezixhomekeke kuzo ezinokuthi zongezwe njengomaleko.

Izaleko ezihlala zikhona:

Igama leleya

Iziqulatho

dependencies

Nakuphi na ukuxhomekeka ekuguqulelweni kwayo kungaqulathanga SNAPSHOT

spring-boot-loader

Iiklasi zokulayishwa kweJAR

snapshot-dependencies

Nakuphi na ukuxhomekeka oguqulelo luqulathe ISIFANEKO

application

iiklasi zesicelo kunye nezibonelelo

Iileya zichazwe kwi layers.idxifayile ngokulandelelana kufuneka yongezwe kumfanekiso weDocker. Ezi maleko zigcinwe kwi-host emva kokufunyanwa kokuqala kuba azitshintshi. Kuphela umaleko wesicelo ohlaziyiweyo ukhutshelwa kumsingathi, okhawulezayo ngenxa yobungakanani obuncitshisiweyo .

Ukwakha umfanekiso kunye nokuxhomekeka okhutshwe kwiileya ezahlukeneyo

Siya kwakha umfanekiso wokugqibela kwizigaba ezibini usebenzisa indlela ebizwa indibano yamanqanaba amaninzi . Kwinqanaba lokuqala siya kukhupha ukuxhomekeka kwaye kwisinyathelo sesibini siya kukopisha ukuxhomekeka okukhutshiweyo kumfanekiso wokugqibela.

Masiyilungise iDockerfile yethu yolwakhiwo lwamanqanaba amaninzi:

# 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 olu qwalaselo kwifayile eyahlukileyo - Dockerfile2.

Sakha umfanekiso weDocker sisebenzisa umyalelo:

docker build -f Dockerfile2 -t usersignup:v1 .

Emva kokuqhuba lo myalelo sifumana oku kulandelayo:

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 ukuba umfanekiso weDocker wenziwa nge-ID yomfanekiso kwaye emva koko uthegiwe.

Okokugqibela, siqhuba umyalelo weDive njengangaphambili ukujonga umaleko ngaphakathi komfanekiso weDocker owenziweyo. Singanikezela ngesazisi somfanekiso okanye ithegi njengegalelo kumyalelo weDive:

dive userssignup:v1

Njengoko ubona kwisiphumo, umaleko oqulethe isicelo ngoku kuphela yi-11 KB, kwaye ukuxhomekeka kugcinwe kwi-cache kumacandelo ahlukeneyo. 

Ukudala iMifanekiso yeDocker eNgcotshiweyo kwiSicelo sokuQalwa kweNtwasahlobo

Ukukhupha ukuxhomekeka kwangaphakathi kwiileya zomntu ngamnye

Singaphinda sinciphise ubungakanani benqanaba lesicelo ngokukhupha nakuphi na ukuxhomekeka kwethu kwisiko kwinqanaba elahlukileyo endaweni yokuyipakisha ngesicelo ngokuyibhengeza ymlifayile efanayo enegama 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/"

Kule fayile layers.idxsongeze ukuxhomekeka kwesiko okubizwa ngegama, io.myorgequlethe ukuxhomekeka kombutho ofunyenwe kwindawo yokugcina ekwabelwanayo.

isiphelo

Kweli nqaku, sijonge ukusebenzisa i-Cloud-Native Buildpacks ukwakha umfanekiso wesikhongozeli ngqo kwikhowudi yomthombo. Le yenye indlela yokusebenzisa iDocker ukwenza umfanekiso wesikhongozeli ngendlela eqhelekileyo: kuqala wenze ifayile yeJAR ephunyeziweyo kwaye emva koko uyipakishe kumfanekiso wesikhongozeli ngokuchaza imiyalelo kwifayile yeDocker.

Sikwajonge ekwandiseni isikhongozeli sethu ngokwenza uphawu lokwaleko olutsalela ukuxhomekeka kwiimaleko ezahlukeneyo ezigcinwe kwi-host kwaye umaleko obhityileyo wesicelo ulayishwe ngexesha lokucwangciswa kwiinjini zokusebenzisa isikhongozeli.

Ungafumana yonke ikhowudi yemvelaphi esetyenziswe kwinqaku Github .

Isalathiso somyalelo

Nantsi inkcazo ekhawulezayo yemiyalelo esiyisebenzisileyo kweli nqaku.

Ukucoca umxholo:

docker system prune -a

Ukwenza umfanekiso wesikhongozeli usebenzisa ifayile yeDocker:

docker build -f <Docker file name> -t <tag> .

Sakha umfanekiso wesikhongozeli kwikhowudi yomthombo (ngaphandle kweDockerfile):

mvn spring-boot:build-image

Jonga imigangatho yokuxhomekeka. Ngaphambi kokwakha ifayile ye-JAR yesicelo, qiniseka ukuba indawo yokubeka iyasebenza kwi-spring-boot-maven-plugin:

java -Djarmode=layertools -jar application.jar list

Ukutsalwa kokuxhomekeka. Ngaphambi kokwakha ifayile ye-JAR yesicelo, qiniseka ukuba indawo yokubeka iyasebenza kwi-spring-boot-maven-plugin:

 java -Djarmode=layertools -jar application.jar extract

Jonga uluhlu lwemifanekiso yesikhongozeli

docker images

Jonga ngasekhohlo ngaphakathi komfanekiso wesikhongozeli (qinisekisa ukuba isixhobo sokuntywila sifakiwe):

dive <image ID or image tag>

umthombo: www.habr.com