Kuvaka Yakakwenenzverwa Docker Mifananidzo yeChitubu Boot Chikumbiro

Containers yave nzira yakasarudzika yekurongedza application neayo ese software uye inoshanda sisitimu inotsamira uye wozoendesa kune akasiyana nharaunda.

Ichi chinyorwa chinovhara nzira dzakasiyana dzekuisa mukati meChitubu Boot application:

  • kuvaka chifananidzo chedocker uchishandisa dockerfile,
  • kuvaka mufananidzo weOCI kubva kunobva uchishandisa Cloud-Native Buildpack,
  • uye optimization yemufananidzo panguva yekumhanya nekuparadzanisa zvikamu zveJAR mumatanho akasiyana uchishandisa maturusi akaiswa.

 Code Muenzaniso

Ichi chinyorwa chinoperekedzwa nemuenzaniso wekodhi yekushanda paGitHub .

Container terminology

Tichatanga ne terminology yemidziyo inoshandiswa mukati mechinyorwa ichi:

  • Mufananidzo wemudziyo: faira remhando chaiyo. Isu tinoshandura application yedu kuita mufananidzo wemudziyo nekumhanyisa chishandiso chekuvaka.
  • Mudziyo: Muenzaniso unogoneka wemufananidzo wemudziyo.
  • Injini yemidziyo: Iyo daemon maitiro ane basa rekumhanyisa mudziyo.
  • Container host: Muchina wekugamuchira uyo injini yemidziyo iri kushanda.
  • Container registry: Nzvimbo yakajairika inoshandiswa kushambadza uye kugovera mufananidzo wemudziyo.
  • OCI standardVhura Container Initiative (OCI) isingaremi, yakavhurika-sosi manejimendi system yakaumbwa neLinux Foundation. Iyo OCI Image Tsanangudzo inotsanangura indasitiri zviyero zvemafomati emifananidzo uye nguva yekumhanyisa kuona kuti ese maenjini emidziyo anogona kumhanyisa mifananidzo yemidziyo yakagadzirwa nechero chishandiso chekuvaka.

Kuti tiise application, tinoputira application yedu mumudziyo mufananidzo uye tinoshambadza iwo mufananidzo kune yeruzhinji registry. Iyo mudziyo runtime inotora iyi chifananidzo kubva kurejista, inoiburitsa, uye inomhanyisa application mukati mayo.

Shanduro 2.3 yeSpring Boot inopa plugins yekuvaka OCI mifananidzo.

Docker ndiyo inonyanya kushandiswa midziyo yekushandisa, uye isu tinoshandisa Docker mumienzaniso yedu, saka ese anotevera mareferensi emidziyo muchinyorwa ichi anoreva Docker.

Kuvaka mufananidzo wemudziyo nenzira yechinyakare

Kuvaka Docker mifananidzo yeChitubu Boot application iri nyore kwazvo nekuwedzera mashoma mirairo kuDockerfile yako.

Isu tinotanga kugadzira JAR inogoneka uye, sechikamu cheDockerfile mirairo, kopira iyo inotepfenyura JAR pamusoro peiyo base JRE mufananidzo mushure mekushandisa inodiwa maitiro.

Ngatigadzire yedu Chitubu application pa Spring Initializr ne dependencies weblombokΠΈ actuator. Isu tinowedzerawo kuzorora controller kuti tipe API nayo GETnzira.

Kugadzira Dockerfile

Isu tozoisa iyi application mumudziyo nekuwedzera Dockerfile:

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

Yedu Dockerfile ine base mufananidzo, kubva adoptopenjdk, pamusoro payo isu tinokopa yedu JAR faira tozovhura chiteshi, 8080iyo inoteerera zvikumbiro.

Application assembly

Kutanga iwe unofanirwa kugadzira application uchishandisa Maven kana Gradle. Pano tiri kushandisa Maven:

mvn clean package

Izvi zvinogadzira faira reJAR rinogoneka rekushandisa. Isu tinofanirwa kushandura iyi inogoneka JAR kuita Docker mufananidzo kuti umhanye paDocker injini.

Gadzira mufananidzo wemudziyo

Isu tobva taisa iyi JAR inogoneka muDocker mufananidzo nekumhanyisa rairo docker buildkubva kumudzi weprojekiti dhairekitori ine Dockerfile yakagadzirwa kare:

docker build  -t usersignup:v1 .

Tinogona kuona mufananidzo wedu mune runyorwa nemurairo:

docker images 

Kubuda kwemurairo wepamusoro kunosanganisira mufananidzo wedu usersignuppamwe chete nemufananidzo wekutanga, adoptopenjdkyakatsanangurwa muDockerfile yedu.

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

Ona mitsara mukati memufananidzo wemudziyo

Ngatitarisei kune akaturikidzana mukati memufananidzo. Tichashandisa chishandiso  nyura, kuona ma layers aya:

dive usersignup:v1

Hechino chikamu chekubuda kweiyo Dive command: 

Kuvaka Yakakwenenzverwa Docker Mifananidzo yeChitubu Boot Chikumbiro

Sezvatinoona, iyo application layer inoita chikamu chakakosha chehukuru hwemufananidzo. Tinoda kudzikisa saizi yeiyi layer muzvikamu zvinotevera sechikamu chekugadzirisa kwedu.

Kuvaka mufananidzo wemudziyo neBuildpack

Assembly packages (Mabuildpacks) ishoko rinozivikanwa rinoshandiswa neakasiyana Platform seSevhisi (PAAS) zvinopihwa kugadzira mufananidzo wemudziyo kubva kunobva kodhi. Yakatangwa naHeroku muna 2011 uye yakabva yagamuchirwa neCloud Foundry, Google App Engine, Gitlab, Knative nevamwe vashoma.

Kuvaka Yakakwenenzverwa Docker Mifananidzo yeChitubu Boot Chikumbiro

Kubatsira kwe Cloud Build Packages

Imwe yemabhenefiti makuru ekushandisa Buildpack kuvaka mifananidzo ndeyekuti shanduko yegadziriso yemufananidzo inogona kutariswa nechepakati (muvaki) uye kuparidzirwa kune ese maapplication uchishandisa muvaki.

Mapasuru ekuvaka aive akanyatsosungirirwa pachikuva. Cloud-Native Buildpacks inopa kumira pamapuratifomu nekutsigira iyo OCI mufananidzo fomati, iyo inova nechokwadi chekuti chifananidzo chinogona kumhanyiswa neDocker injini.

Kushandisa Spring Boot Plugin

Iyo Spring Boot plugin inovaka OCI mifananidzo kubva kunobva uchishandisa Buildpack. Mifananidzo inogadzirwa uchishandisa bootBuildImagemabasa (Gradle) kana spring-boot:build-imagechinangwa (Maven) uye yemuno Docker kuisirwa.

Isu tinogona kugadzirisa zita remufananidzo watinoda kusundira kuDocker registry nekutsanangura zita mukati 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>

Ngatishandisei Maven kuita build-imagezvinangwa zvekugadzira application uye kugadzira mufananidzo wemudziyo. Isu hatisi kushandisa chero Dockerfiles parizvino.

mvn spring-boot:build-image

Mhedzisiro ichava chinhu chakadai:

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

Kubva pane zvakabuda, tinozviona paketo Cloud-Native buildpackinoshandiswa kugadzira mufananidzo unoshanda weOCI. Sekare, isu tinogona kuona mufananidzo wakanyorwa seDocker mufananidzo nekumhanyisa murairo:

docker images 

Mhedziso:

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

Kugadzira mufananidzo weContainer neJib

Jib ipikicha yekunyora mifananidzo kubva kuGoogle inopa imwe nzira yekugadzira mufananidzo wemudziyo kubva kunobva.

Tsika jib-maven-pluginmune pom.xml:

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

Tevere, isu tinomhanyisa Jib plugin tichishandisa iyo Maven kuraira kuvaka iyo application uye kugadzira iyo mudziyo mufananidzo. Sekare, hatisi kushandisa chero Dockerfiles pano:

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

Mushure mekuita murairo weMaven uri pamusoro, tinowana zvinotevera:

[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

Izvo zvinobuda zvinoratidza kuti mufananidzo wemudziyo wakagadzirwa uye wakaiswa mune registry.

Zvinokurudzira uye nzira dzekugadzira yakagadziridzwa mifananidzo

Tine zvikonzero zviviri zvakakosha zvekugadzirisa:

  • Kubudirira: Mumudziyo we orchestration system, mufananidzo wemudziyo unodhonzwa kubva ku registry yemufananidzo kuenda kumugadziri achimhanyisa injini yemidziyo. Iyi nzira inonzi kuronga. Kudhonza mifananidzo mikuru kubva ku registry kunoguma nekureba yekuronga nguva mumudziyo orchestration masisitimu uye nguva refu yekuvaka mumapaipi eCI.
  • Chengetedzo: mifananidzo mikuru inewo nzvimbo yakakura yekusagadzikana.

Mufananidzo weDocker unogadzirwa neakaturikidzana, imwe neimwe ichimiririra chirevo muDockerfile yedu. Mutsara wega wega unomiririra delta yekuchinja muchikamu chepasi. Kana isu tikadhonza mufananidzo weDocker kubva kurejista, inodhonzwa mumatanho uye yakavharirwa pane iyo host.

Spring Boot inoshandisa "mafuta JAR" mukati seyakagadzika yekurongedza fomati. Kana tikatarisa JAR ine mafuta, tinoona kuti iko kushandisa chikamu chidiki kwazvo cheJAR yese. Ichi ndicho chikamu chinoshandura zvakanyanya. Mamwe ese ane Spring Framework dependencies.

Iyo optimization formula yakatarisana nekutsaura iyo application padanho rakasiyana kubva kuSpring Framework zvinoenderana.

Iyo yekutsamira layer inoumba iyo yakawanda yeiyo gobvu JAR faira inotorwa kamwe chete uye yakavharirwa pane iyo host system.

Chete chitete cheapp chinodhonzwa panguva yekuvandudzwa kweapp uye kuronga kwemidziyo, sezvinoratidzwa mumufananidzo uyu:

Kuvaka Yakakwenenzverwa Docker Mifananidzo yeChitubu Boot Chikumbiro

Muzvikamu zvinotevera, isu tichatarisa maitiro ekugadzira aya akakwenenzverwa mifananidzo yeChitubu Boot application.

Kuvaka Yakagadziridzwa Container Image yeChitubu Boot Chikumbiro neBuildpack

Spring Boot 2.3 inotsigira kuiswa nekubvisa zvikamu zveiyo gobvu JAR faira muzvikamu zvakasiyana. Iyo yekumisikidza inovharwa nekusarudzika uye inoda kugoneswa zvakajeka uchishandisa iyo Spring Boot Maven plugin:

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

Isu tichashandisa iyi gadziriso kuvaka yedu mudziyo mufananidzo kutanga neBuildpack uyezve neDocker muzvikamu zvinotevera.

Ngatimhanyei build-imageMaven chinangwa chekugadzira mufananidzo wemudziyo:

mvn spring-boot:build-image

Kana tikamhanya Dive kuti tione matinji mumufananidzo unobuda, isu tinogona kuona kuti iyo application layer (yakatsanangurwa mutsvuku) idiki kwazvo mu kilobyte renji zvichienzaniswa nezvatakawana tichishandisa mafuta JAR fomati:

Kuvaka Yakakwenenzverwa Docker Mifananidzo yeChitubu Boot Chikumbiro

Kuvaka Yakakwenenzverwa Container Mufananidzo weChitubu Boot Chikumbiro neDocker

Panzvimbo pekushandisa Maven kana Gradle plugin, isu tinogona zvakare kugadzira yakaturikidzana Docker JAR mufananidzo neDocker faira.

Kana isu tikashandisa Docker, isu tinofanirwa kutora matanho maviri ekuwedzera kubvisa maseru uye kuakopa mumufananidzo wekupedzisira.

Zviri mukati meJAR yakaguma mushure mekuvaka neMaven ine layering inogoneswa inotaridzika seizvi:

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

Izvo zvinobuda zvinoratidza imwe JAR yakanzi spring-boot-jarmode-layertoolsΠΈ layersfle.idxfile. Iyi yekuwedzera JAR faira inopa kugona kwekuisa, sekutsanangurwa kwazvino muchikamu chinotevera.

Bvisa zvinotsamira pazvikamu zvakasiyana

Kuti utarise uye ubvise zvidimbu kubva kune yedu yakaturikidzana JAR, isu tinoshandisa sisitimu chivakwa -Djarmode=layertoolskwekutanga spring-boot-jarmode-layertoolsJAR pachinzvimbo chekushandisa:

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

Kumhanya murairo uyu kunoburitsa chinobuda chine sarudzo dzekuraira dziripo:

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

Zvakabuda zvinoratidza mirairo listextractΠΈ helpс helpkuva default. Ngatimhanyei murairo ne listsarudzo:

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

Isu tinoona runyoro rwekutsamira iyo inogona kuwedzerwa sezvikamu.

Layer by default:

Layer name

Zviri mukati

dependencies

chero kutsamira iyo shanduro isina SNAPSHOT

spring-boot-loader

JAR Loader Makirasi

snapshot-dependencies

chero kutsamira ine vhezheni ine SNAPSHOT

application

makirasi ekushandisa uye zviwanikwa

Matanho anotsanangurwa mukati layers.idxfaira muhurongwa hwavanofanira kuwedzerwa kumufananidzo weDocker. Aya maturu akavharirwa pane anotambira mushure mekutora kwekutanga nekuti haachinje. Iyo chete yakagadziridzwa application layer inotorwa kune iyo host, iyo inokurumidza nekuda kwekuderedzwa saizi .

Kuvaka chifananidzo chine zvinotsamira zvakabviswa muzvikamu zvakasiyana

Tichavaka chifananidzo chekupedzisira mumatanho maviri tichishandisa nzira inonzi multi-stage assembly . Munhanho yekutanga isu tinobvisa zvinotsamira uye mune yechipiri nhanho isu tinokopa zvakabviswa zvinotsamira mune yekupedzisira.

Ngatigadzirise yedu Dockerfile yeakawanda-nhanho kuvaka:

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

Isu tinochengetedza iyi gadziriso mune yakaparadzana faira - Dockerfile2.

Isu tinovaka iyo Docker mufananidzo tichishandisa iwo murairo:

docker build -f Dockerfile2 -t usersignup:v1 .

Mushure mekuita murairo uyu, tinowana zvinotevera:

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

Isu tinogona kuona kuti iyo Docker mufananidzo unogadzirwa nemufananidzo ID uye wobva wamaka.

Chekupedzisira, isu tinomhanyisa Dive rairo sepakutanga kuti titarise maseru mukati meyakagadzirwa Docker mufananidzo. Tinogona kupa ID yemufananidzo kana tag sekuisa kune iyo Dive command:

dive userssignup:v1

Sezvauri kuona kubva pane zvakabuda, iyo layer ine application yave 11 KB chete uye zvinotsamira zvakachengetwa muzvikamu zvakasiyana. 

Kuvaka Yakakwenenzverwa Docker Mifananidzo yeChitubu Boot Chikumbiro

Kutora kutsamira kwemukati pane zvidimbu zvega

Isu tinokwanisa kudzoreredza saizi yedhizaini yekushandisa nekubvisa chero yetsika yedu inotsamira mune yakaparadzana layer pane kurongedza nekushandisa nekuzvizivisa mukati. ymlfaira rakafanana rine zita 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/"

Mune iyi faira layers.idxtawedzera tsika yekutsamira inonzi, io.myorgine zvinovigwa nesangano zvakatorwa kubva kune yakagovaniswa repository.

mhedziso

Muchikamu chino, takatarisa kushandisa Cloud-Native Buildpacks kuvaka mufananidzo wemudziyo wakananga kubva kunobva. Iyi ndiyo imwe nzira yekushandisa Docker kugadzira mufananidzo wemudziyo nenzira yakajairwa: kutanga, gobvu rinoitwa reJAR faira rinogadzirwa rozoiswa mumufananidzo wemudziyo nekutsanangura mirairo muDockerfile.

Isu takatarisawo kukwirisa mudziyo wedu nekubatanidza chinhu chekuisa chinoburitsa zvinotsamira muzvikamu zvakaparadzana zvakavharirwa pane anotambira uye nhete yekunyorera inoiswa panguva yekuronga mumajini ekuuraya emudziyo.

Unogona kuwana ese kodhi kodhi yakashandiswa muchinyorwa pa Github .

Command Reference

Heino pfupiso yemirairo yatakashandisa muchinyorwa chino kuti utarise nekukurumidza.

Context clearing:

docker system prune -a

Kuvaka mufananidzo wemudziyo une Dockerfile:

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

Vaka mufananidzo wemudziyo kubva kunobva (pasina Dockerfile):

mvn spring-boot:build-image

Ona kutsamira zvikamu. Usati wavaka faira rejagi rekushandisa, ita shuwa kuti iyo yekumisikidza inogoneswa muchirimo-boot-maven-plugin:

java -Djarmode=layertools -jar application.jar list

Bvisa zvidimbu zvekutsamira. Usati wavaka faira rejagi rekushandisa, ita shuwa kuti iyo yekumisikidza inogoneswa muchirimo-boot-maven-plugin:

 java -Djarmode=layertools -jar application.jar extract

Kuona Rondedzero Yemifananidzo YemuContainer

docker images

Tarisa kuruboshwe mukati memufananidzo wemudziyo (ita shuwa kuti dive mudziyo wakaiswa):

dive <image ID or image tag>

Source: www.habr.com