Ịmepụta onyonyo Docker kachasị mma maka ngwa buut mmiri

Eriri abụrụla ụzọ kacha mma isi jiri ngwa ngwa na sistemụ arụmọrụ ya niile na-ebuga ya na gburugburu ebe dị iche iche.

Edemede a na-ekpuchi ụzọ dị iche iche iji tinye ngwa ngwa Boot Spring:

  • ịmepụta ihe oyiyi Docker site na iji faịlụ Docker,
  • ịmepụta ihe oyiyi OCI site na isi iyi site na iji Cloud-Native Buildpack,
  • na njikarịcha onyonyo oge ọsọ site na ikewa akụkụ nke JAR n'ime ọkwa dị iche iche site na iji ngwaọrụ ọtụtụ ọkwa.

 Ihe atụ koodu

Edemede a na-esonyere ihe atụ koodu ọrụ na GitHub .

Okwu okwu akpa

Anyị ga-amalite na okwu okwu akpa e ji mee ihe n'isiokwu:

  • Onyonyo akpa: faịlụ nke otu usoro. Anyị ga-atụgharị ngwa anyị ka ọ bụrụ ihe onyonyo akpa site na iji ngwa ihe eji arụ ọrụ.
  • Igbe: Ihe atụ nke foto akpa nwere ike ime.
  • Akụrụngwa igwe: Usoro daemon na-ahụ maka ịgbasa akpa ahụ.
  • Onye nnabata akpa: Kọmputa ndị ọbịa nke igwe akpa na-agba.
  • ndekọ akpa: Ebe izugbe ejiri ebipụta na kesaa foto akpa ahụ.
  • Ọkọlọtọ OCIMepee arịa ụlọ (OCI) bụ usoro ọchịchị mepere emepe hibere n'ime Linux Foundation. The OCI Image nkọwapụta na-akọwa ụlọ ọrụ ụkpụrụ maka akpa oyiyi na oge ojiri gaa formats iji hụ na niile akpa engines nwere ike na-agba ọsọ akpa oyiyi kere ọ bụla ewu ngwá ọrụ.

Iji containerize ngwa, anyị kechie ngwa anyị na akpa onyonyo wee bipụta onyonyo ahụ na ndekọ nkekọrịta. Oge ojiri gaa akpa ahụ na-eweghachi onyonyo a na ndekọ, bupụ ya, wee tinye ngwa n'ime ya.

Ụdị 2.3 nke Spring Boot na-enye plugins maka ịmepụta ihe oyiyi OCI.

Docker bụ mmejuputa akpa a na-ejikarị eme ihe, anyị na-ejikwa Docker na ihe atụ anyị, yabụ ntụnyere akpa niile na-esote n'isiokwu a ga-ezo aka na Docker.

Ime ihe oyiyi akpa n'ụzọ ọdịnala

Ịmepụta onyonyo Docker maka ngwa Boot mmiri dị mfe site na ịgbakwunye ntuziaka ole na ole na faịlụ Docker.

Anyị na-ebu ụzọ mepụta faịlụ JAR na-arụ ọrụ yana, dịka akụkụ nke ntuziaka faịlụ Docker, detuo faịlụ JAR nke nwere ike ime n'elu ihe oyiyi JRE isi mgbe itinyechara ntọala ndị dị mkpa.

Ka anyị mepụta ngwa mmiri anyị na Mmiri Initializr na ịdabere weblombokи actuator. Anyị na-agbakwunyekwa njikwa izu ike iji nye API GETusoro.

Ịmepụta Dockerfile

Anyị wee tinye ngwa a site na ịgbakwunye Dockerfile:

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

Faịlụ Docker anyị nwere onyonyo ntọala sitere na adoptopenjdk, n'elu nke anyị na-eṅomi anyị JAR faịlụ wee mepee ọdụ ụgbọ mmiri, 8080nke ga-ege ntị maka arịrịọ.

Iwuli ngwa

Mbụ ịkwesịrị ịmepụta ngwa site na iji Maven ma ọ bụ Gradle. Ebe a anyị na-eji Maven:

mvn clean package

Nke a na-emepụta faịlụ JAR nwere ike ime ya maka ngwa ahụ. Anyị kwesịrị ịgbanwe JAR a na-arụ ọrụ ka ọ bụrụ ihe onyonyo Docker iji na-agba ọsọ na injin Docker.

Ịmepụta onyonyo akpa

Anyị tinyezie faịlụ JAR a na-arụ ọrụ n'ime onyonyo Docker site na ịme iwu ahụ docker buildsite na ndekọ mgbọrọgwụ ọrụ nke nwere Dockerfile emepụtara na mbụ:

docker build  -t usersignup:v1 .

Anyị nwere ike ịhụ onyonyo anyị na listi ahụ site na iji iwu:

docker images 

Nsonaazụ nke iwu dị n'elu gụnyere onyonyo anyị usersignuptinyere ihe oyiyi isi, adoptopenjdkakọwapụtara na faịlụ Docker anyị.

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

Lelee ọkwa dị n'ime onyonyo akpa

Ka anyị leba anya n'ọtụtụ ọkwa dị n'ime ihe onyonyo a. Anyị ga-eji ihe eji eme ihe  imikpu ilele ọkwa ndị a:

dive usersignup:v1

Nke a bụ akụkụ nke mmepụta sitere na iwu Dive: 

Ịmepụta onyonyo Docker kachasị mma maka ngwa buut mmiri

Dị ka anyị nwere ike ịhụ, oyi akwa ngwa na-eme ka akụkụ dị ịrịba ama nke nha oyiyi ahụ. Anyị chọrọ ibelata nha oyi akwa a na ngalaba ndị a dịka akụkụ nke njikarịcha anyị.

Ịmepụta onyonyo akpa site na iji Buildpack

Ngwunye mgbakọ (Buildpacks) bụ okwu n'ozuzu nke Platform dị iche iche na-eji dị ka onyinye ọrụ (PAAS) iji mepụta ihe oyiyi akpa site na koodu isi mmalite. Heroku hibere ya na 2011 ma Cloud Foundry, Google App Engine, Gitlab, Knative na ọtụtụ ndị ọzọ nakweere ya.

Ịmepụta onyonyo Docker kachasị mma maka ngwa buut mmiri

Uru nke ngwugwu wuo igwe ojii

Otu uru dị n'iji Buildpack mepụta onyonyo bụ nke ahụ Enwere ike ijikwa mgbanwe nhazi onyonyo n'etiti (onye nrụpụta) wee gbasaa na ngwa niile site na iji ihe nrụpụta.

Ejikọtara ngwugwu ihe owuwu ahụ na ikpo okwu. Cloud-Native Buildpacks na-enye nhazi ọkwa n'ofe nyiwe site na ịkwado usoro ihe oyiyi OCI, nke na-eme ka o doo anya na igwe Docker nwere ike ime ihe oyiyi ahụ.

Iji ngwa mgbakwunye Spring Boot

Ihe mgbakwunye Spring Boot na-ewuli onyonyo OCI site na isi mmalite site na iji Buildpack. A na-eji foto eme ihe bootBuildImageaga-eme (Gradle) ma ọ bụ spring-boot:build-imageebumnuche (Maven) na ntinye Docker mpaghara.

Anyị nwere ike hazie aha onyonyo achọrọ iji kwaba na ndekọ Docker site na ịkọwa aha n'ime ya 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>

Ka anyị jiri Maven mee ya build-imageihe mgbaru ọsọ maka ịmepụta ngwa na ịmepụta ihe oyiyi akpa. Anyị anaghị eji Dockerfiles ọ bụla n'oge a.

mvn spring-boot:build-image

Nsonaazụ ga-abụ ihe dị ka nke a:

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

Site na mmepụta anyị na-ahụ nke ahụ paketo Cloud-Native buildpackejiri iji mepụta onyonyo OCI na-arụ ọrụ. Dịka ọ dị na mbụ, anyị nwere ike ịhụ onyonyo edepụtara dị ka onyonyo Docker site na iji iwu a:

docker images 

Mmechi:

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

Ịmepụta onyonyo akpa site na iji Jib

Jib bụ ngwa mgbakwunye ihe okike sitere na Google na-enye ụzọ ọzọ maka imepụta onyonyo akpa site na koodu isi mmalite.

Confhazi jib-maven-pluginna pom.xml:

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

Na-esote, anyị na-eji Jib ngwa mgbakwunye na-eji iwu Maven wuo ngwa ahụ wee mepụta ihe oyiyi akpa. Dị ka ọ dị na mbụ, anyị anaghị eji faịlụ Docker ọ bụla ebe a:

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

Mgbe emechara iwu Maven dị n'elu, anyị na-enweta nsonaazụ a:

[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

Nsonaazụ na-egosi na emepụtala ihe oyiyi akpa ma tinye ya na ndekọ.

Ihe mkpali na usoro maka ịmepụta ihe oyiyi kachasị mma

Anyị nwere isi ihe abụọ kpatara njikarịcha:

  • Ubu oke: N'ime usoro ihe egwu akpa akpa, a na-enweta ihe oyiyi akpa site na ndekọ ihe oyiyi gaa na onye ọbịa na-agba ígwè akpa. A na-akpọ usoro a atụmatụ. Ịwepụta nnukwu onyonyo site na ndekọ na-arụpụta ogologo oge nhazi oge na sistemu nhazi akpa na ogologo oge na-arụ ọrụ na pipeline CI.
  • Nche: Foto ndị buru ibu nwekwara mpaghara buru ibu maka adịghị ike.

Onyonyo Docker nwere nchịkọta nke ọkwa, nke ọ bụla n'ime ya na-anọchi anya ntuziaka na Dockerfile anyị. Igwe oyibo ọ bụla na-anọchite anya delta nke mgbanwe na oyi akwa dị n'okpuru. Mgbe anyị wepụrụ onyonyo Docker site na ndekọ, a na-adọta ya n'ígwé ma chekwaa ya na onye ọbịa.

Spring Boot na-eji "abụba JAR" na dịka usoro nkwakọ ngwaahịa ndabara. Mgbe anyị lere anya na nnukwu JAR, anyị na-ahụ na ngwa ahụ mejupụtara akụkụ dị ntakịrị nke JAR dum. Nke a bụ akụkụ na-agbanwekarị. Nke fọdụrụ bụ ndabere Framework mmiri.

Usoro njikarịcha ahụ gbadoro ụkwụ na ikewapụ ngwa a n'ọkwa dị iche site na ndabere Framework nke oge opupu ihe ubi.

A na-ebudata oyi akwa ndabere, nke mebere nnukwu faịlụ JAR siri ike, naanị otu ugboro wee chekwaa ya na sistemụ nnabata.

Naanị obere oyi akwa nke ngwa a na-adọta n'oge mmelite ngwa yana nhazi oge. dị ka egosiri na eserese a:

Ịmepụta onyonyo Docker kachasị mma maka ngwa buut mmiri

N'akụkụ ndị a, anyị ga-eleba anya ka esi mepụta onyonyo ndị a kachasị mma maka ngwa Boot Spring.

Ịmepụta Onyonyo akpa akpa maka ngwa buut mmiri n'iji Buildpack

Mmiri Boot 2.3 na-akwado ịkwa akwa site na iwepụta akụkụ nke faịlụ JAR siri ike n'ime ọkwa dị iche iche. Akwụsịghị atụmatụ nhazi ahụ site na ndabara ma a ga-agbanyerịrị ya nke ọma site na iji Spring Boot Maven plugin:

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

Anyị ga-eji nhazi a wee jiri Buildpack wuo ihe oyiyi akpa anyị wee jiri Docker rụọ ọrụ na ngalaba ndị a.

Ka anyị malite build-imageEbumnuche Maven maka imepụta onyonyo akpa:

mvn spring-boot:build-image

Ọ bụrụ na anyị na-agba ọsọ Dive ka ịhụ ọkwa dị na onyonyo a ga-esi na ya pụta, anyị nwere ike ịhụ na oyi akwa ngwa (akọwapụtara na-acha uhie uhie) pere mpe na oke kilobyte ma e jiri ya tụnyere ihe anyị nwetara site na iji usoro JAR abụba:

Ịmepụta onyonyo Docker kachasị mma maka ngwa buut mmiri

Ịmepụta Onyonyo akpa akpa maka ngwa buut mmiri n'iji Docker

Kama iji ngwa mgbakwunye Maven ma ọ bụ Gradle, anyị nwekwara ike imepụta onyonyo Docker JAR nwere faịlụ Docker.

Mgbe anyị na-eji Docker, anyị kwesịrị ime usoro abụọ ọzọ iji wepụ akwa akwa ma detuo ha na foto ikpeazụ.

Ọdịnaya nke JAR ga-esi na ya pụta ka emechara ya site na iji Maven jiri akwa akwa ga-adị ka nke a:

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

Nsonaazụ gosiri JAR agbakwunyere aha ya spring-boot-jarmode-layertoolsи layersfle.idxfaịlụ. Faịlụ JAR a agbakwunyere na-enye ike nhazi usoro, dịka akọwara na ngalaba na-esote.

Ịwepụ dabere na n'ígwé nke onye ọ bụla

Ka ilele ma wepụta ọkwa site na JAR anyị nwere akwa, anyị na-eji akụrụngwa sistemụ -Djarmode=layertoolsmaka mmalite spring-boot-jarmode-layertoolsJAR kama ngwa:

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

Ịme iwu a na-arụpụta mmepụta nwere nhọrọ iwu dị:

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

Nsonaazụ na-egosi iwu listextractи helpс helpbụrụ ndabara. Ka anyị jiri ya mee iwu ahụ listnhọrọ:

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

Anyị na-ahụ ndepụta ndabere nke enwere ike ịgbakwunye dị ka ọkwa.

Ngosipụta izizi:

Aha oyi akwa

Ihe

dependencies

ndabere ọ bụla nke ụdị ya enweghị SNAPSHOT

spring-boot-loader

Klas ndị na-ebu ihe JAR

snapshot-dependencies

ndabere ọ bụla nke ụdị ya nwere SNAPSHOT

application

klaasị ngwa na akụrụngwa

A na-akọwapụta akwa akwa n'ime layers.idxfaịlụ n'usoro ekwesịrị ịgbakwunye ha na onyonyo Docker. A na-echekwa akwa akwa ndị a na onye ọbịa ka eweghachite mbụ n'ihi na ha anaghị agbanwe. Naanị oyi akwa ngwa emelitere ka a na-ebudatara na onye ọbịa, nke na-adị ngwa ngwa n'ihi nha dị ala .

Jiri ihe ndabere ewepụtara n'ọkwa dị iche iche wuo onyonyo

Anyị ga-ewu ihe oyiyi ikpeazụ na nkebi abụọ site na iji usoro a na-akpọ mgbakọ multi-ogbo . Na nzọụkwụ mbụ, anyị ga-ewepụ ihe ndị a na-adabere na ya na nke abụọ, anyị ga-eṅomi ihe ndabere amịpụtara n'ime foto ikpeazụ.

Ka anyị gbanwee Dockerfile anyị maka ịrụ ọtụtụ ọkwa:

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

Anyị na-echekwa nhazi a na faịlụ dị iche - Dockerfile2.

Anyị na-eji iwu a na-ewu ihe oyiyi Docker:

docker build -f Dockerfile2 -t usersignup:v1 .

Mgbe ịmechara iwu a, anyị na-enweta nsonaazụ a:

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

Anyị nwere ike ịhụ na ejiri ID onyonyo mepụta onyonyo Docker wee kpado ya.

N'ikpeazụ, anyị na-agba ọsọ iwu Dive dị ka ọ dị na mbụ iji nyochaa ọkwa dị n'ime ihe oyiyi Docker emepụtara. Anyị nwere ike ịnye NJ onyonyo ma ọ bụ mkpado dị ka ntinye na iwu Dive:

dive userssignup:v1

Dị ka ị pụrụ ịhụ na mmepụta, oyi akwa nwere ngwa bụ ugbu a naanị 11 KB, na ndabere na-echekwara na iche iche n'ígwé. 

Ịmepụta onyonyo Docker kachasị mma maka ngwa buut mmiri

Na-ewepụta ihe dabere n'ime n'ígwé nke onye ọ bụla

Anyị nwere ike ibelata ogo ngwa ngwa site n'iwepụ ihe ndabere omenala anyị n'ọkwa dị iche kama ịkwakọ ha na ngwa site n'ịkpọsa ha ymlyiri faịlụ aha 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/"

Na faịlụ a layers.idxanyị atụkwasịla ndabere omenala aha, io.myorgnwere ndabere ụlọ ọrụ ewepụtara na ebe nchekwa ekekọrịtara.

nkwubi

N'isiokwu a, anyị lere anya iji Cloud-Native Buildpacks wuo ihe oyiyi akpa ozugbo site na koodu isi mmalite. Nke a bụ ihe ọzọ iji Docker mepụta onyonyo akpa dị ka ọ na-adị: buru ụzọ mepụta faịlụ JAR siri ike ma tinyezie ya n'ime onyonyo akpa site na ịkọwa ntuziaka na faịlụ Docker.

Anyị na-elekwa anya na-ebuli akpa anyị site na-enyere a layering atụmatụ na-adọta adabere n'ime iche iche n'ígwé na-echekwara na onye ọbịa na a mkpa oyi akwa nke ngwa na-kwajuru na nhazi oge n'ime akpa ogbugbu engines.

Ị nwere ike ịhụ koodu isi mmalite niile ejiri n'ime akụkọ a na Github .

Ntuziaka iwu

Nke a bụ nchịkọta ngwa ngwa nke iwu anyị ji mee n'isiokwu a.

Mkpochapụ okwu:

docker system prune -a

Mepụta onyonyo akpa site na iji faịlụ Docker:

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

Anyị na-ewu foto akpa ahụ site na koodu isi mmalite (na-enweghị Dockerfile):

mvn spring-boot:build-image

Lelee ọkwa dabere. Tupu iwulite faịlụ JAR ngwa, gbaa mbọ hụ na agbanyere njirimara layering na spring-boot-maven-plugin:

java -Djarmode=layertools -jar application.jar list

Na-ewepụta ọkwa dabere. Tupu iwulite faịlụ JAR ngwa, gbaa mbọ hụ na agbanyere njirimara layering na spring-boot-maven-plugin:

 java -Djarmode=layertools -jar application.jar extract

Lelee ndepụta ihe onyonyo akpa

docker images

Lelee n'aka ekpe n'ime onyonyo akpa (hụta na etinyere ngwa nkpu mmiri):

dive <image ID or image tag>

isi: www.habr.com