Dhisida Sawirada Docker ee La Hagaajiyey ee Codsiga Bootka Gu'ga

Konteenarada waxay noqdeen habka la door biday ee baakadaha arjiga leh dhammaan software-kiisa iyo nidaamka qalliinka ku tiirsanaanta ka dibna la geeyo deegaanno kala duwan.

Maqaalkani waxa uu daboolayaa habab kala duwan oo lagu haynta codsiga Bootka gu'ga:

  • dhisidda sawir-qaadaha iyadoo la adeegsanayo dockerfile,
  • dhisida sawirka OCI ee isha iyadoo la adeegsanayo Cloud-Native Buildpack,
  • iyo hagaajinta sawirka wakhtiga runtime iyadoo loo kala saarayo qaybaha JAR heerar kala duwan iyadoo la isticmaalayo qalab lakabyo ah.

 Tusaalaha kood

Maqaalkan waxa la socda tusaale kood shaqo ku yaal GitHub .

Eray bixinta weelka

Waxaan ku bilaabi doonaa ereyada weelka ee loo adeegsaday maqaalka oo dhan:

  • Sawirka weelka: fayl qaab gaar ah leh. Codsigayaga waxaanu u beddelnaa sawir weel annagoo wadnayna qalabka wax lagu dhiso.
  • Kontayn: Tusaale la fulin karo oo ah sawirka weelka.
  • Matoorka weelka: Habka daemon ee ka mas'uul ah socodsiinta weelka.
  • Martigeliyaha weelka: Mashiinka martida loo yahay ee matoorka weelku ku socdo.
  • Diiwaanka weelasha: Goobta guud ee loo isticmaalo daabacaadda iyo qaybinta sawirka weelka.
  • Heerka OCIHindisaha Kontaynarrada Furan (OCI) waa qaab-dhismeedka maamulka il furan oo fudud oo uu sameeyay Linux Foundation. Tilmaamaha Sawirka OCI wuxuu qeexayaa heerarka warshadaha ee qaababka sawirka weelka iyo wakhtiga runtime si loo hubiyo in dhammaan mishiinnada weelka ay maamuli karaan sawirada weelka ee ay sameeyeen qalab kasta oo la dhiso.

Si aanu codsiga u weecino, waxaanu ku duubnaa codsigayaga sawirka weel oo aanu ku daabacno sawirkaas diiwaanka dadweynaha. Wakhtiga runtime weelka ayaa sawirkan ka soo saara diiwaanka, ka soo furaa, oo ku socodsiiya codsiga dhexdiisa.

Nooca 2.3 ee Bootka Guga wuxuu bixiyaa qalabyo lagu dhisayo sawirada OCI.

Docker waa hirgelinta weelka ugu badan ee la isticmaalo, waxaanan u isticmaalnaa Docker tusaalaheena, marka dhammaan tixraacyada weelka xiga ee maqaalkan waxay tixraaci doonaan Docker.

Dhisida sawirka weelka ee habka dhaqanka

Dhisida sawirada Docker ee codsiyada Bootka gu'ga waa mid aad u fudud adiga oo ku daraya dhowr tilmaamo Dockerfile kaaga.

Waxaan marka hore abuurnaa JAR la fulin karo iyo, iyada oo qayb ka ah tilmaamaha Dockerfile, nuqul ka samayn karto JAR ee dusha sare ee sawirka JRE ka dib marka aan isticmaalno habaynta lagama maarmaanka ah.

Aan ku abuurno codsigeena gu'ga Guga Initializr ku tiirsanaanta weblombokΠΈ actuator. Waxaan sidoo kale ku darnaa koontaroolaha nasashada si aan u siino API GEThabka.

Abuuritaanka Dockerfile

Waxaan markaas gelineynaa codsigan weel annagoo ku darayna Dockerfile:

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

Dockerfile-kayagu waxa uu ka kooban yahay sawir sal, ka adoptopenjdk, dusheeda oo aan nuqul ka samayno faylka JAR ka dibna furno dekedda, 8080kaas oo dhagaysan doona codsiyada.

Kulanka codsiga

Marka hore waxaad u baahan tahay inaad abuurto codsi adoo isticmaalaya Maven ama Gradle. Halkan waxaan isticmaalnaa Maven:

mvn clean package

Tani waxay u abuurtaa faylka JAR ee la fulin karo codsiga. Waxaan u baahanahay inaan u beddelno JAR-ga la fulin karo oo aan u beddelno sawirka Docker si loogu shaqeeyo mishiinka Docker.

Samee sawir weel

Ka dib waxaanu gelinay JAR-ga la fulin karo sawirka Docker annagoo ku shaqaynayna amarka docker buildLaga soo bilaabo tusaha xididka mashruuca oo ka kooban Dockerfile hore loo abuuray:

docker build  -t usersignup:v1 .

Waxaan ku arki karnaa sawirkayaga liiska amarka:

docker images 

Wax soo saarka amarka sare waxaa ku jira sawirkayaga usersignupoo ay la socdaan sawirka salka, adoptopenjdkku qeexan Dockerfile-keena

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

Fiiri lakabyada gudaha sawirka weelka

Aynu eegno isku dhafka lakabyada gudaha sawirka. Waan isticmaali doonaa qalab  quusin, si aad u aragto lakabyadan:

dive usersignup:v1

Halkan waxaa ah qayb ka mid ah wax soo saarka amarka Dive: 

Dhisida Sawirada Docker ee La Hagaajiyey ee Codsiga Bootka Gu'ga

Sida aan arki karno, lakabka codsigu wuxuu ka dhigayaa qayb muhiim ah cabbirka sawirka. Waxaan rabnaa inaan hoos u dhigno xajmiga lakabkan qaybaha soo socda iyada oo qayb ka ah hagaajintayada.

Dhismaha sawirka weelka leh Buildpack

Baakadaha golaha (xirmooyinka dhismaha) waa erey guud oo ay adeegsadaan Platform kala duwan oo adeeg ahaan ah (PAAS) bixinta si loo abuuro sawirka weelka ee koodhka isha. Waxaa bilaabay Heroku 2011-kii ilaa iyo markaas waxaa qaatay Cloud Foundry, Google App Engine, Gitlab, Knative iyo kuwo kale oo yar.

Dhisida Sawirada Docker ee La Hagaajiyey ee Codsiga Bootka Gu'ga

Faa'iidada Xirmooyinka Dhisidda Daruuraha

Mid ka mid ah faa'iidooyinka ugu weyn ee isticmaalka Buildpack si loo dhiso sawirada waa taas Isbedelka qaabeynta sawirka waxaa loo maareyn karaa xarun dhexe (dhisaha) waxaana lagu faafin karaa dhammaan codsiyada iyadoo la adeegsanayo wax-dhisaha.

Baakadaha dhismuhu waxay si dhow ugu xidhnaayeen goobta. Cloud-Native Buildpacks waxay bixiyaan jaangooyo guud ahaan aaladaha iyadoo la taageerayo qaabka sawirka OCI, kaas oo hubinaya in sawirka uu maamuli karo mishiinka Docker.

Isticmaalka Plugin-ka Bootka Guga

Plugin-ka Spring Boot wuxuu dhisaa sawirada OCI ee isha iyadoo la adeegsanayo Buildpack. Sawirada waxaa la abuuray iyadoo la isticmaalayo bootBuildImagehawlaha (Gradle) ama spring-boot:build-imagebartilmaameedka (Maven) iyo rakibidda Docker-ka maxalliga ah.

Waxaan habayn karnaa magaca sawirka aan u baahanahay si aan ugu riixno diiwaanka Docker annagoo cayimayna magaca 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>

Aynu isticmaalno Maven si aan u fulino build-imageujeedooyinka abuuritaanka codsi iyo abuurista sawirka weelka. Hadda ma isticmaalno wax Dockerfiles ah.

mvn spring-boot:build-image

Natiijadu waxay noqon doontaa sida soo socota:

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

Laga soo bilaabo wax soo saarka, waxaan aragnaa taas paketo Cloud-Native buildpackloo isticmaalo in lagu abuuro sawirka OCI oo shaqaynaya. Sidii hore, waxaan arki karnaa sawirka ku taxan sida sawirka Docker annagoo ku shaqeyneyno amarka:

docker images 

Π’Ρ‹Π²ΠΎΠ΄:

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

Abuuritaanka Sawir Konteenar leh Jib

Jib waa plugin sawir-qaade ka socda Google kaas oo bixiya hab kale oo lagu abuurayo sawirka weelka ee isha.

Habayn jib-maven-plugingudaha pom.xml:

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

Marka xigta, waxaan ku socodsiineynaa plugin Jib anagoo adeegsanayna amarka Maven si aan u dhisno codsiga oo aan u abuurno sawirka weelka. Sidii hore, kuma isticmaalno wax Dockerfiles halkan:

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

Kadib fulinta amarka Maven ee kor ku xusan, waxaan helnaa soosaarka soo socda:

[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

Soosaarku wuxuu muujinayaa in sawirka weelka la sameeyay oo la geliyey diiwaanka.

Dhiirigelinta iyo hababka abuurista sawirro la hagaajiyay

Waxaan haynaa laba sababood oo waaweyn oo lagu hagaajinayo:

  • Wax-soo-saarka: Nidaamka habaynta weelka, sawirka weelka waxaa laga soo jiidayaa diiwaanka sawirka oo la geeyaa martigeliyaha ku shaqeeya mishiinka weelka. Habkan waxa loo yaqaan qorshaynta. Sawirro waaweyn oo laga soo qaado diiwaanka waxay keenaysaa jadwal dheer oo nidaamyada habaynta weelka iyo wakhtiyada dheer ee dhismaha dhuumaha CI.
  • AmnigaSawirada waaweyn sidoo kale waxay leeyihiin aag ballaaran oo nugul.

Sawirka Docker wuxuu ka kooban yahay lakabyo farabadan, mid walbana wuxuu matalaa bayaan ku jira Dockerfile-keena. Lakab kastaa wuxuu u taagan yahay duleelka isbeddellada lakabka hoose. Marka aan ka soo saarno sawirka Docker ee diiwaanka, waxaa la jiidayaa lakabyo waxaana lagu kaydiyaa martigeliyaha.

Isticmaalka Bootka Spring "JAR buuran" gudaha sida qaabka baakadaha caadiga ah. Markaan eegno JAR dufan leh, waxaan aragnaa in codsigu yahay qayb aad u yar oo ka mid ah JAR oo dhan. Tani waa qaybta ugu isbeddelka badan. Inta soo hartay waxay ka kooban tahay ku tiirsanaanta Qaabdhismeedka Guga.

Qaabka wanaajintu waxa uu udub dhexaad u yahay ka soocida arjiga heer ka duwan ku tiirsanaanta Qaabdhismeedka Guga.

Lakabka ku-tiirsanaanta ee sameeya inta badan faylka JAR ee dhumucdiisuna waxay tahay hal mar oo keliya oo lagu kaydiyay nidaamka martida loo yahay.

Kaliya lakab khafiif ah oo abka ah ayaa la jiidaa inta lagu jiro cusboonaysiinta abka iyo jadwalka weelka, sida ku cad jaantuskan:

Dhisida Sawirada Docker ee La Hagaajiyey ee Codsiga Bootka Gu'ga

Qaybaha soo socda, waxaan ku eegi doonaa sida loo sameeyo sawiradan la hagaajiyay ee codsiga Bootka gu'ga.

Dhisidda Sawirka Konteenarka La Hagaajiyey ee Codsiga Boot Guga oo leh Buildpack

Bootka Spring 2.3 wuxuu taageeraa lakabaynta iyadoo la soo saarayo qaybo ka mid ah faylka JAR dhumucdiisuna tahay lakabyo kala duwan. Sifada lakabka waa naafo si caadi ah oo waxay u baahan tahay in si cad loo awoodsiiyo iyadoo la adeegsanayo plugin-ka Spring Boot Maven:

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

Waxaan u isticmaali doonaa qaabeyntan si aan ugu dhisno sawirka weelka marka hore Buildpack ka dibna Docker ee qaybaha soo socda.

Aan orodno build-imageBartilmaameedka Maven si loo abuuro sawirka weelka:

mvn spring-boot:build-image

Haddii aan ku soconno Dive si aan u aragno lakabyada sawirka natiijada, waxaan arki karnaa in lakabka codsigu (oo ku wareegsan casaan) uu aad uga yar yahay qiyaasta kilobyte marka la barbar dhigo waxa aan helnay iyadoo la isticmaalayo qaabka dhumucda ee JAR:

Dhisida Sawirada Docker ee La Hagaajiyey ee Codsiga Bootka Gu'ga

Dhisida Sawirka Kontaynarada La Hagaajiyay ee Codsiga Boot Guga oo leh Docker

Halkii laga isticmaali lahaa plugin Maven ama Gradle, waxaan sidoo kale abuuri karnaa sawir Docker JAR oo lakab ah oo leh faylka Docker.

Marka aan isticmaalno Docker, waxaan u baahanahay inaan qaadno laba tillaabo oo dheeri ah si aan u soo saarno lakabyada oo aan nuqul uga dhigno sawirka ugu dambeeya.

Waxa ku jira JAR ka dib marka la dhiso Maven oo leh lakabyo karti leh waxay u ekaan doontaa sidan:

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

Soosaarku wuxuu muujinayaa JAR dheeraad ah oo la magacaabay spring-boot-jarmode-layertoolsΠΈ layersfle.idxfayl. Faylkan dheeraadka ah ee JAR wuxuu bixiyaa awoodaha lakabka, sida lagu qeexay qaybta xigta.

Soo saar ku tiirsanaanta lakabyo kala duwan

Si aan u aragno ugana soo saarno lakabyadayada JAR ee lakabka ah, waxaanu isticmaalnaa hantida nidaamka -Djarmode=layertoolsbilow spring-boot-jarmode-layertoolsJAR bedelkii codsiga:

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

Ku socodsiinta amarkan waxay soo saartaa wax soo saar ka kooban xulashooyinka amarka ee jira:

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

Soosaarku wuxuu muujinayaa amarrada listextractΠΈ helpс helpnoqo mid aan caadi ahayn. Aan ku wadno amarka listdoorasho:

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

Waxaan aragnaa liiska ku tiirsanaanta oo lagu dari karo lakab ahaan.

Lakabyada sida caadiga ah:

Magaca lakabka

Tusmo

dependencies

ku-tiirsanaan kasta oo nuqulkiisu aanu ku jirin SNAPSHOT

spring-boot-loader

Fasalada Xamuulka JAR

snapshot-dependencies

ku-tiirsanaan kasta oo noociisu ka kooban yahay SNAPSHOT

application

fasalada codsiga iyo agabka

Lakabyada waxaa lagu qeexay layers.idxu fayl garee habka ay tahay in loogu daro sawirka Docker. Lakabyadan waxa lagu kaydiyaa martigeliyaha ka dib marka ugu horreysa ee la keeno sababtoo ah ma isbeddelaan. Kaliya lakabka dalabka ee la cusboonaysiiyay ayaa lagu soo dejiyaa martida loo yahay, taas oo dhakhso badan sababtoo ah cabbirka la dhimay .

Dhisidda sawir leh ku-tiirsanaan laga soo saaray lakabyo kala duwan

Waxaan ku dhisi doonaa sawirka kama dambaysta ah laba tallaabo anagoo adeegsanayna hab la yiraahdo kulan heerar badan . Talaabada ugu horeysa waxaan soo saari doonaa ku-tiirsanaanta, ta labaadna waxaan koobi doonaa ku tiirsanaanta la soo saaray finalka .

Aan wax ka beddelno Dockerfile-kayaga dhismo heerar badan leh:

# 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"]

Waxaanu ku kaydinaynaa qaabayntan fayl gaar ah - Dockerfile2.

Waxaan ku dhisnaa sawirka Docker annagoo adeegsanayna amarka:

docker build -f Dockerfile2 -t usersignup:v1 .

Kadib fulinta amarkan, waxaan helnaa soosaarka soo socda:

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

Waxaan arki karnaa in sawirka Docker lagu abuuray aqoonsi sawir ka dibna lagu calaamadiyay.

Ugu dambeyntii, waxaan u socodsiineynaa amarka Dive sidii hore si aan u hubinno lakabyada gudaha sawirka Docker ee la sameeyay. Waxaan bixin karnaa aqoonsiga sawirka ama ku dhejin karnaa si aan u galno amarka Dive:

dive userssignup:v1

Sida aad ka arki karto wax soo saarka, lakabka ku jira codsiga hadda waa 11 KB oo kaliya iyo ku-tiirsanaanta waxaa lagu kaydiyaa lakabyo kala duwan. 

Dhisida Sawirada Docker ee La Hagaajiyey ee Codsiga Bootka Gu'ga

Soo saar ku tiirsanaanta gudaha ee lakabyo kala duwan

Waxaan sii yareyn karnaa cabbirka lakabka arjiga annagoo ka soo saarna mid kasta oo ku tiirsanaanta caadada u ah lakab gooni ah halkii aan ku baakadeyn lahayn arjiga annaga oo ku caddaynayna ymlfaylka la midka ah ee la magacaabay 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/"

Faylkan layers.idxwaxaanu ku soo kordhinay ku tiirsanaanta caado ee la magac baxay, io.myorgka kooban ku tiirsanaanta ururka laga soo saaray kaydka la wadaago.

gunaanad

Maqaalkan, waxaan eegnay adeegsiga Cloud-Native Buildpacks si aan u dhisno sawirka weelka tooska ah ee isha. Tani waa beddelka isticmaalka Docker si loo abuuro sawirka weelka sida caadiga ah: marka hore, faylka JAR ee dhumuc weyn ayaa la sameeyay ka dibna lagu duubayaa sawirka weelka iyadoo lagu qeexayo tilmaamaha ku jira Dockerfile.

Waxa kale oo aanu eegnay hagaajinta weelkayaga annagoo ku darayna qaab lakab ah oo soo saara ku tiirsanaanta lakabyo kala duwan oo ku kaydsan goobta martida loo yahay iyo lakabka codsiga khafiifka ah ayaa lagu shubaa wakhtiga jadwalka ee matoorada weelka.

Waxaad ka heli kartaa dhammaan koodhka isha ee lagu isticmaalo maqaalka at Github .

Tixraaca Taliska

Halkan waxaa ah soo koobida amarada aan u isticmaalnay maqaalkan tixraac degdeg ah.

Nadiifinta macnaha:

docker system prune -a

Ku dhisidda sawirka weelka leh Dockerfile:

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

Ka dhis sawirka weelka isha (la'aanteed Dockerfile):

mvn spring-boot:build-image

Fiiri lakabyada ku-tiirsanaanta. Kahor intaadan dhisin faylka weelka arjiga, hubi in sifada lakabka ah ay karti u leedahay guga-boot-maven-plugin:

java -Djarmode=layertools -jar application.jar list

Soo saar lakabyada ku-tiirsanaanta. Kahor intaadan dhisin faylka weelka arjiga, hubi in sifada lakabka ah ay karti u leedahay guga-boot-maven-plugin:

 java -Djarmode=layertools -jar application.jar extract

Daawashada Liiska Sawirada Kontaynarada

docker images

Ka eeg bidixda gudaha sawirka weelka (hubi in qalabka quusitaanka lagu rakibay):

dive <image ID or image tag>

Source: www.habr.com