Gina Ingantattun Hotunan Docker don Aikace-aikacen Boot na bazara

Kwantena sun zama hanyoyin da aka fi so na tattara aikace-aikace tare da duk abin dogaro da software da tsarin aiki sannan kuma isar da su zuwa wurare daban-daban.

Wannan labarin ya ƙunshi hanyoyi daban-daban don ɗaukar aikace-aikacen Boot Spring:

  • gina hoton docker ta amfani da dockerfile,
  • gina hoton OCI daga tushe ta amfani da Cloud-Native Buildpack,
  • da inganta hoto a lokacin aiki ta hanyar raba sassan JAR zuwa matakai daban-daban ta amfani da kayan aiki masu layi.

 Misali Code

Wannan labarin yana tare da misalin lambar aiki ku GitHub .

Kalmomin kwantena

Za mu fara da kalmomin kwantena da aka yi amfani da su cikin labarin:

  • Hoton kwantena: fayil na takamaiman tsari. Muna canza aikace-aikacen mu zuwa hoton akwati ta hanyar gudanar da kayan aikin gini.
  • Akwati: Misali mai aiwatarwa na hoton kwantena.
  • Injin kwantena: Tsarin daemon da ke da alhakin gudanar da akwati.
  • Mai masaukin kwantena: Na'ura mai watsa shiri wanda injin kwandon ke gudana.
  • Rijistar kwantena: Babban wurin da ake amfani da shi don bugawa da rarraba hoton kwantena.
  • Babban darajar OCIBude Kwantena Initiative (OCI) tsari ne mai sauƙi, buɗaɗɗen tsarin gudanarwa wanda Gidauniyar Linux ta kafa. Ƙimar Hoton OCI yana bayyana ma'auni na masana'antu don tsarin hoton ganga da lokacin aiki don tabbatar da cewa duk injunan kwantena na iya gudanar da hotunan kwantena da kowane kayan aikin gini ya ƙirƙira.

Don yin tanadin aikace-aikacen, muna nannade aikace-aikacenmu a cikin hoton akwati kuma mu buga wannan hoton zuwa wurin rajistar jama'a. Lokacin aiki na kwantena ya dawo da wannan hoton daga wurin yin rajista, ya buɗe shi, kuma yana gudanar da aikace-aikacen a ciki.

Sigar 2.3 na Spring Boot yana ba da kayan aiki don gina hotunan OCI.

Docker shine aiwatar da kwantena da aka fi amfani dashi, kuma muna amfani da Docker a cikin misalan mu, don haka duk nassoshi na kwantena na gaba a cikin wannan labarin zasu koma Docker.

Gina hoton akwati a hanyar gargajiya

Gina Hotunan Docker don aikace-aikacen Boot na bazara yana da sauƙi ta ƙara ƴan umarni zuwa Dockerfile ɗin ku.

Mun fara ƙirƙirar JAR mai aiwatarwa kuma, a matsayin ɓangare na umarnin Dockerfile, kwafi JAR mai aiwatarwa a saman hoton JRE na tushe bayan amfani da gyare-gyaren da suka dace.

Bari mu ƙirƙirar aikace-aikacen bazara a kan Spring Initializr tare da dogaro weblombokи actuator. Muna kuma ƙara mai sarrafa hutu don samar da API dashi GEThanya.

Ƙirƙirar Dockerfile

Sai mu sanya wannan aikace-aikacen a cikin akwati ta ƙara Dockerfile:

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

Dockerfile ɗin mu ya ƙunshi hoton tushe, daga adoptopenjdk, saman wanda muka kwafi fayil ɗin JAR ɗin mu sannan mu buɗe tashar jiragen ruwa. 8080wanda zai saurari buƙatun.

Taron aikace-aikace

Da farko kuna buƙatar ƙirƙirar aikace-aikacen ta amfani da Maven ko Gradle. Anan muna amfani da Maven:

mvn clean package

Wannan yana ƙirƙirar fayil ɗin JAR mai aiwatarwa don aikace-aikacen. Muna buƙatar canza wannan JAR mai aiwatarwa zuwa hoton Docker don aiki akan injin Docker.

Ƙirƙiri hoton akwati

Sannan mun sanya wannan JAR mai aiwatarwa a cikin hoton Docker ta hanyar aiwatar da umarnin docker builddaga tushen tushen aikin da ke ɗauke da Dockerfile da aka ƙirƙira a baya:

docker build  -t usersignup:v1 .

Za mu iya ganin hoton mu a cikin jeri tare da umarni:

docker images 

Fitowar umarnin da ke sama ya haɗa da hoton mu usersignuptare da hoton tushe, adoptopenjdkƙayyade a cikin Dockerfile.

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

Duba yadudduka a cikin hoton akwati

Bari mu kalli tarin yadudduka a cikin hoton. Za mu yi amfani kayan aiki  nutse, don duba waɗannan matakan:

dive usersignup:v1

Anan akwai ɓangaren fitarwa na umarnin Dive: 

Gina Ingantattun Hotunan Docker don Aikace-aikacen Boot na bazara

Kamar yadda muke iya gani, Layer ɗin aikace-aikacen yana samar da wani muhimmin yanki na girman hoton. Muna so mu rage girman wannan Layer a cikin sassan masu zuwa a matsayin wani ɓangare na ingantawa.

Gina hoton kwantena tare da Buildpack

Kunshin taro (Gilashin gini) jimla ce da Platform daban-daban ke amfani da ita azaman sadaukarwa (PAAS) don ƙirƙirar hoton akwati daga lambar tushe. Heroku ne ya ƙaddamar da shi a cikin 2011 kuma tun daga Cloud Foundry, Google App Engine, Gitlab, Knative da wasu kaɗan suka karbe shi.

Gina Ingantattun Hotunan Docker don Aikace-aikacen Boot na bazara

Amfanin Fakitin Gina Cloud

Ɗaya daga cikin manyan fa'idodin amfani da Buildpack don gina hotuna shine Ana iya sarrafa canje-canjen tsarin hoto a tsakiya (mai gini) kuma a yada shi zuwa duk aikace-aikacen ta amfani da maginin.

An haɗa fakitin ginin a kusa da dandamali. Cloud-Native Buildpacks suna ba da daidaito a cikin dandamali ta hanyar tallafawa tsarin hoton OCI, wanda ke tabbatar da cewa injin Docker na iya tafiyar da hoton.

Yin amfani da Plugin Boot na bazara

Kayan aikin Spring Boot yana gina hotunan OCI daga tushe ta amfani da Buildpack. Ana ƙirƙirar hotuna ta amfani da su bootBuildImageayyuka (Gradle) ko spring-boot:build-imagemanufa (Maven) da shigarwa na Docker na gida.

Za mu iya keɓance sunan hoton da muke buƙatar turawa zuwa rajistar Docker ta hanyar tantance sunan a ciki. 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>

Bari mu yi amfani da Maven don aiwatarwa build-imageburin ƙirƙirar aikace-aikace da ƙirƙirar hoton akwati. A halin yanzu ba mu amfani da kowane Dockerfiles.

mvn spring-boot:build-image

Sakamakon zai kasance kamar haka:

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

Daga fitarwa, muna ganin haka paketo Cloud-Native buildpackamfani da shi don ƙirƙirar hoton OCI mai aiki. Kamar yadda ya gabata, zamu iya ganin hoton da aka jera azaman hoton Docker ta hanyar aiwatar da umarni:

docker images 

Kammalawa:

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

Ƙirƙirar Hoton Kwantena tare da Jib

Jib plugin ne na marubucin hoto daga Google wanda ke ba da madadin hanyar ƙirƙirar hoton akwati daga tushe.

Harhadawa jib-maven-plugincikin pom.xml:

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

Na gaba, muna gudanar da plugin ɗin Jib ta amfani da umarnin Maven don gina aikace-aikacen da ƙirƙirar hoton akwati. Kamar yadda ya gabata, ba ma amfani da kowane Dockerfiles anan:

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

Bayan aiwatar da umarnin Maven na sama, muna samun fitarwa mai zuwa:

[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

Fitowar ta nuna cewa an ƙirƙiri hoton kwantena kuma an sanya shi cikin wurin yin rajista.

Ƙarfafawa da hanyoyi don ƙirƙirar ingantattun hotuna

Muna da manyan dalilai guda biyu don ingantawa:

  • Yawan aiki: A cikin tsarin kaɗe-kaɗe na kwantena, ana ciro hoton kwantena daga wurin rajistar hoto zuwa mai masaukin da ke aiki da injin kwantena. Ana kiran wannan tsari tsari. Cire manyan hotuna daga wurin yin rajista a cikin dogon lokaci na tsarawa a cikin tsarin kaɗe-kaɗe da dogon lokacin ginawa a cikin bututun CI.
  • Tsaro: manyan hotuna kuma suna da babban yanki don rauni.

Hoton Docker an yi shi da tarin yadudduka, kowanne yana wakiltar sanarwa a cikin Dockerfile ɗin mu. Kowane Layer yana wakiltar delta na canje-canje a cikin Layer ɗin da ke ƙasa. Lokacin da muka ja hoton Docker daga wurin yin rajista, ana jan shi a cikin yadudduka kuma a adana shi akan mai watsa shiri.

Spring Boot yana amfani "fat JAR" in azaman tsohuwar marufi. Idan muka kalli JAR mai kitse, zamu ga cewa application din kadan ne daga cikin JAR gaba daya. Wannan shi ne bangaren da ya fi canzawa. Sauran sun ƙunshi abubuwan dogaro da Tsarin bazara.

Ƙimar ingantawa ta ta'allaka ne wajen ware aikace-aikacen a wani matakin daban daga abubuwan dogaro da Tsarin bazara.

Zazzagewar Layer abin dogaro wanda ya samar da mafi yawan babban fayil ɗin JAR mai kauri ana zazzage shi sau ɗaya kawai kuma an adana shi akan tsarin runduna.

Ƙaƙƙarfan Layer na ƙa'idar ne kawai ake ja yayin sabuntawar ƙa'idar da tanadin akwati, kamar yadda aka nuna a cikin wannan zane:

Gina Ingantattun Hotunan Docker don Aikace-aikacen Boot na bazara

A cikin sassan masu zuwa, za mu kalli yadda ake ƙirƙirar waɗannan ingantattun hotuna don aikace-aikacen Boot na bazara.

Gina Ingantacciyar Hoton Kwantena don Aikace-aikacen Boot na bazara tare da Buildpack

Spring Boot 2.3 yana goyan bayan shimfidawa ta hanyar cire sassan babban fayil na JAR zuwa yadudduka daban-daban. An kashe fasalin shimfidawa ta tsohuwa kuma yana buƙatar kunnawa a sarari ta amfani da kayan aikin Spring Boot Maven:

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

Za mu yi amfani da wannan saitin don gina hoton kwandon mu da farko tare da Buildpack sannan tare da Docker a cikin sassan masu zuwa.

Mu gudu build-imageMaven manufa don ƙirƙirar hoton akwati:

mvn spring-boot:build-image

Idan muka gudu Dive don ganin yadudduka a cikin hoton da aka samu, zamu iya ganin cewa Layer aikace-aikacen (wanda aka zagaya cikin ja) ya fi ƙanƙanta a cikin kewayon kilobyte idan aka kwatanta da abin da muka samu ta amfani da tsarin JAR mai kauri:

Gina Ingantattun Hotunan Docker don Aikace-aikacen Boot na bazara

Gina Ingantacciyar Hoton Kwantena don Aikace-aikacen Boot na bazara tare da Docker

Maimakon yin amfani da kayan aikin Maven ko Gradle, za mu iya ƙirƙirar hoton Docker JAR mai shimfiɗa tare da fayil Docker.

Lokacin da muke amfani da Docker, muna buƙatar ɗaukar ƙarin matakai biyu don cire yadudduka kuma mu kwafa su cikin hoton ƙarshe.

Abubuwan da ke cikin sakamakon JAR bayan ginawa tare da Maven tare da kunna shimfidawa zai yi kama da haka:

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

Fitowar tana nuna ƙarin JAR mai suna spring-boot-jarmode-layertoolsи layersfle.idxfayil. Wannan ƙarin fayil ɗin JAR yana ba da damar daidaitawa, kamar yadda aka bayyana a sashe na gaba.

Cire abubuwan dogaro akan yadudduka daban-daban

Don dubawa da cire yadudduka daga JAR mai shimfiɗa, muna amfani da kayan tsarin -Djarmode=layertoolsdon farawa spring-boot-jarmode-layertoolsJAR maimakon aikace-aikace:

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

Gudanar da wannan umarni yana samar da fitarwa mai ƙunshe da zaɓuɓɓukan umarni:

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

Fitowar tana nuna umarni listextractи helpс helpzama tsoho. Bari mu gudanar da umurnin da listzabin:

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

Muna ganin jerin abubuwan dogaro waɗanda za a iya ƙara su azaman yadudduka.

Layer ta tsohuwa:

Sunan Layer

Abubuwa

dependencies

duk wani abin dogaro wanda sigarsa ba ta ƙunshi SNAPSHOT ba

spring-boot-loader

Azuzuwan lodawa JAR

snapshot-dependencies

duk wani abin dogaro wanda sigarsa ta ƙunshi SNAPSHOT

application

aikace-aikace azuzuwan da albarkatun

An bayyana Layers a ciki layers.idxfayil a cikin tsari wanda yakamata a ƙara su zuwa hoton Docker. Ana adana waɗannan yadudduka akan mai masaukin bayan an fara kawowa saboda ba sa canzawa. Sai kawai sabunta Layer aikace-aikacen ana sauke zuwa mai watsa shiri, wanda ya fi sauri saboda raguwar girman .

Gina hoto tare da abubuwan dogaro da aka fitar zuwa yadudduka daban-daban

Za mu gina hoton ƙarshe a matakai biyu ta amfani da hanyar da ake kira Multi-mataki taro . A mataki na farko za mu cire abubuwan dogaro kuma a mataki na biyu za mu kwafi abubuwan dogaro da aka cire zuwa ƙarshe.

Bari mu gyara Dockerfile ɗin mu don gina matakai da yawa:

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

Mun ajiye wannan saitin a cikin wani fayil daban - Dockerfile2.

Muna gina hoton Docker ta amfani da umarnin:

docker build -f Dockerfile2 -t usersignup:v1 .

Bayan aiwatar da wannan umarni, muna samun fitarwa mai zuwa:

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

Za mu iya ganin cewa an ƙirƙiri hoton Docker tare da ID na hoto sannan kuma aka yi masa alama.

A ƙarshe, muna gudanar da umarnin Dive kamar baya don bincika yadudduka a cikin hoton Docker da aka samar. Za mu iya samar da ID na hoto ko alama azaman shigarwa zuwa umarnin Dive:

dive userssignup:v1

Kamar yadda kuke gani daga fitarwa, Layer ɗin da ke ɗauke da aikace-aikacen yanzu yana da 11 KB kawai kuma ana adana abubuwan dogaro a cikin yadudduka daban-daban. 

Gina Ingantattun Hotunan Docker don Aikace-aikacen Boot na bazara

Cire abubuwan dogaro na ciki akan yadudduka daban-daban

Za mu iya ƙara rage girman Layer ɗin aikace-aikacen ta hanyar cire duk wani abin dogaronmu na al'ada zuwa wani yanki daban maimakon tattara su da aikace-aikacen ta hanyar bayyana su a ciki. ymlirin wannan fayil mai suna 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/"

A cikin wannan fayil layers.idxmun kara dogaro na al'ada mai suna, io.myorgdauke da abubuwan dogaro na kungiya da aka dawo dasu daga ma'ajiyar da aka raba.

ƙarshe

A cikin wannan labarin, mun duba amfani da Cloud-Native Buildpacks don gina hoton akwati kai tsaye daga tushe. Wannan madadin yin amfani da Docker don ƙirƙirar hoton akwati ta hanyar da aka saba: na farko, an ƙirƙiri fayil ɗin JAR mai kauri mai kauri sannan kuma an tattara shi cikin hoton akwati ta ƙayyadaddun umarnin a cikin Dockerfile.

Mun kuma duba inganta gandun dajin mu ta hada da siffa mai ɗorewa wanda ke fitar da abin dogaro zuwa yadudduka daban-daban waɗanda aka adana a kan mai masaukin kuma ana ɗora Layer ɗin aikace-aikacen bakin ciki a lokacin tsarawa a cikin injinan aiwatar da kwantena.

Kuna iya samun duk lambar tushe da aka yi amfani da ita a cikin labarin a Github .

Maganar Umurni

Anan ga taƙaitaccen umarni da muka yi amfani da su a cikin wannan labarin don tunani cikin sauri.

Sharar da magana:

docker system prune -a

Gina hoton akwati tare da Dockerfile:

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

Gina hoton akwati daga tushe (ba tare da Dockerfile ba):

mvn spring-boot:build-image

Duba matakan dogaro. Kafin gina fayil ɗin jar aikace-aikacen, tabbatar cewa an kunna fasalin shimfidawa a cikin spring-boot-maven-plugin:

java -Djarmode=layertools -jar application.jar list

Cire abubuwan dogaro. Kafin gina fayil ɗin jar aikace-aikacen, tabbatar cewa an kunna fasalin shimfidawa a cikin spring-boot-maven-plugin:

 java -Djarmode=layertools -jar application.jar extract

Duban Jerin Hotunan Kwantena

docker images

Duba hagu a cikin hoton ganga (tabbatar an shigar da kayan aikin nutsewa):

dive <image ID or image tag>

source: www.habr.com