Kupanga Zithunzi Zapamwamba za Docker Kuti Mugwiritse Ntchito Boot Spring

Zotengera zakhala njira yomwe imakonda kuyika pulogalamu ndi mapulogalamu ake onse ndi kudalira kwamakina ogwiritsira ntchito ndikuzipereka kumadera osiyanasiyana.

Nkhaniyi ikufotokoza njira zosiyanasiyana zosungira pulogalamu ya Spring Boot:

  • kupanga chithunzi cha Docker pogwiritsa ntchito fayilo ya Docker,
  • kupanga chithunzi cha OCI kuchokera kugwero pogwiritsa ntchito Cloud-Native Buildpack,
  • ndi kukhathamiritsa kwa zithunzi za nthawi yothamanga polekanitsa magawo a JAR kukhala magawo osiyanasiyana pogwiritsa ntchito zida zamitundu yambiri.

 Kodi Chitsanzo

Nkhaniyi ikuphatikizidwa ndi chitsanzo cha code code pa GitHub .

Container terminology

Tiyamba ndi mawu a chidebe omwe agwiritsidwa ntchito m'nkhaniyi:

  • Chithunzi cha Container: fayilo yamtundu wina. Tidzasintha pulogalamu yathu kukhala chithunzi cha chidebe pogwiritsa ntchito chida chomanga.
  • Chotsitsa: Chitsanzo chotheka cha chithunzi cha chidebe.
  • Injini ya Container: Njira ya daemon yomwe imayang'anira chidebecho.
  • Container host: Kompyuta yolandila yomwe injini ya chidebe imayendera.
  • Container registry: Malo omwe amagwiritsidwa ntchito kusindikiza ndi kugawa chithunzi cha chidebecho.
  • OCI muyezoOpen Container Initiative (OCI) ndi dongosolo lopepuka, lotseguka lokhazikitsidwa mkati mwa Linux Foundation. The OCI Image Specification imatanthawuza miyezo yamakampani yamawonekedwe a chidebe ndi mawonekedwe a nthawi yoyendetsa kuti awonetsetse kuti ma injini onse amatha kuyendetsa zithunzi zamachidebe zopangidwa ndi chida chilichonse chomangira.

Kuti tiyike pulogalamu, timakulunga pulogalamu yathu pachithunzi chotengera ndikusindikiza chithunzicho ku registry yogawana nawo. Nthawi yogwiritsira ntchito chidebe imatenga chithunzichi kuchokera ku registry, kuchimasula, ndikuyendetsa ntchito mkati mwake.

Mtundu 2.3 wa Spring Boot umapereka mapulagini opangira zithunzi za OCI.

Docker ndiye kukhazikitsa zidebe zomwe zimagwiritsidwa ntchito kwambiri, ndipo timagwiritsa ntchito Docker m'zitsanzo zathu, chifukwa chake zotengera zonse zomwe zili patsamba lino zitanthauza Docker.

Kumanga chidebe fano njira yachikhalidwe

Kupanga zithunzi za Docker pamapulogalamu a Spring Boot ndikosavuta kwambiri powonjezera malangizo angapo pafayilo ya Docker.

Timayamba kupanga fayilo ya JAR yomwe ingathe kuchitika ndipo, monga gawo la malangizo a fayilo ya Docker, koperani fayilo ya JAR pamwamba pa chithunzi choyambira cha JRE mutagwiritsa ntchito zofunikira.

Tiyeni tipange pulogalamu yathu ya Spring Spring Initializr ndi zodalira weblombokΠΈ actuator. Tikuwonjezeranso chowongolera kuti tipereke API GETnjira.

Kupanga Dockerfile

Kenako timayika pulogalamuyi powonjezera Dockerfile:

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

Fayilo yathu ya Docker ili ndi chithunzi choyambira adoptopenjdk, pamwamba pake timakopera fayilo yathu ya JAR ndikutsegula doko, 8080amene adzamvera zopempha.

Kupanga pulogalamu

Choyamba muyenera kupanga pulogalamu pogwiritsa ntchito Maven kapena Gradle. Apa timagwiritsa ntchito Maven:

mvn clean package

Izi zimapanga fayilo ya JAR yomwe ingagwiritsidwe ntchito. Tiyenera kusintha JAR yotheka iyi kukhala chithunzi cha Docker kuti tiyende pa injini ya Docker.

Kupanga chithunzi cha chidebe

Kenako timayika fayilo iyi ya JAR mu chithunzi cha Docker poyendetsa lamulo docker buildkuchokera ku chikwatu cha polojekiti yomwe ili ndi Dockerfile yomwe idapangidwa kale:

docker build  -t usersignup:v1 .

Titha kuwona chithunzi chathu pamndandanda pogwiritsa ntchito lamulo:

docker images 

Zotsatira za lamulo ili pamwambazi zikuphatikizapo chithunzi chathu usersignuppamodzi ndi chithunzi choyambira, adoptopenjdkzafotokozedwa mu fayilo yathu ya Docker.

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

Onani zigawo mkati mwa chithunzi cha chidebe

Tiyeni tione mulu wa zigawo mkati mwa fano. Tidzagwiritsa ntchito chida  kudumpha kuti muwone zigawo izi:

dive usersignup:v1

Nayi gawo lazotulutsa kuchokera ku lamulo la Dive: 

Kupanga Zithunzi Zapamwamba za Docker Kuti Mugwiritse Ntchito Boot Spring

Monga tikuonera, gawo logwiritsira ntchito limapanga gawo lalikulu la kukula kwa fano. Tikufuna kuchepetsa kukula kwa gawoli m'magawo otsatirawa ngati gawo la kukhathamiritsa kwathu.

Kupanga chithunzi cha chidebe pogwiritsa ntchito Buildpack

Phukusi la msonkhano (Zomangamanga) ndi mawu wamba omwe amagwiritsidwa ntchito ndi nsanja zosiyanasiyana monga Service (PAAS) zopereka kuti apange chithunzi cham'chidebe kuchokera ku code code. Idakhazikitsidwa ndi Heroku mu 2011 ndipo idakhazikitsidwa ndi Cloud Foundry, Google App Engine, Gitlab, Knative ndi ena angapo.

Kupanga Zithunzi Zapamwamba za Docker Kuti Mugwiritse Ntchito Boot Spring

Ubwino wa ma phukusi omanga mtambo

Ubwino umodzi wogwiritsa ntchito Buildpack kupanga zithunzi ndikuti Zosintha zamasinthidwe azithunzi zitha kuwongoleredwa pakati (omanga) ndikufalitsidwa ku mapulogalamu onse pogwiritsa ntchito omanga.

Zomangamangazo zidalumikizidwa mwamphamvu papulatifomu. Cloud-Native Buildpacks imapereka kukhazikika pamapulatifomu pothandizira mawonekedwe azithunzi a OCI, omwe amawonetsetsa kuti chithunzicho chitha kuyendetsedwa ndi injini ya Docker.

Kugwiritsa ntchito pulogalamu yowonjezera ya Spring Boot

Pulagi ya Spring Boot imapanga zithunzi za OCI kuchokera kugwero pogwiritsa ntchito Buildpack. Zithunzi zimapangidwa pogwiritsa ntchito bootBuildImagentchito (Gradle) kapena spring-boot:build-imagetargets (Maven) ndi kukhazikitsa kwa Docker kwanuko.

Titha kusintha dzina lachithunzi chofunikira kukankhira ku registry ya Docker pofotokoza dzinalo 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>

Tiyeni tigwiritse ntchito Maven kuti tichite build-imagezolinga kupanga pulogalamu ndi kupanga chithunzi chotengera. Sitikugwiritsa ntchito ma Dockerfiles aliwonse pakadali pano.

mvn spring-boot:build-image

Zotsatira zake zikhala motere:

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

Kuchokera pazotulutsa timaziwona paketo Cloud-Native buildpackamagwiritsidwa ntchito popanga chithunzi cha OCI chogwira ntchito. Monga m'mbuyomu, titha kuwona chithunzi chomwe chili ngati chithunzi cha Docker poyendetsa lamulo:

docker images 

Kutsiliza:

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

Kupanga chithunzi cha chidebe pogwiritsa ntchito Jib

Jib ndi pulogalamu yowonjezera yopangira zithunzi kuchokera ku Google yomwe imapereka njira ina yopangira chithunzi chachidebe kuchokera ku code code.

Kukhazikitsa jib-maven-pluginmu pom.xml:

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

Kenako, timayendetsa pulogalamu yowonjezera ya Jib pogwiritsa ntchito lamulo la Maven kuti tipange pulogalamuyi ndikupanga chithunzi cha chidebe. Monga kale, sitigwiritsa ntchito mafayilo a Docker apa:

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

Pambuyo popereka lamulo la Maven pamwambapa, timapeza zotsatirazi:

[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

Zotsatira zikuwonetsa kuti chithunzi cha chidebecho chapangidwa ndikuyikidwa mu registry.

Zolimbikitsa ndi njira zopangira zithunzi zokongoletsedwa bwino

Tili ndi zifukwa ziwiri zazikulu zokwaniritsira:

  • Kukonzekera: Mu kachitidwe ka chidebe choyimba, chithunzi cha chidebe chimatengedwa kuchokera ku registry ya zithunzi kupita kwa wolandira omwe akuyendetsa injini ya chidebe. Njira imeneyi imatchedwa kukonzekera. Kukoka zithunzi zazikulu kuchokera ku registry kumabweretsa nthawi yayitali yokonzekera m'makina oimba ndi nthawi yayitali yomanga mapaipi a CI.
  • Chitetezo: Zithunzi zazikuluzikulu zilinso ndi malo okulirapo osatetezeka.

Chithunzi cha Docker chimakhala ndi mulu wa zigawo, zomwe zimayimira malangizo mu Dockerfile yathu. Chigawo chilichonse chimayimira delta ya zosintha zomwe zili pansi pake. Tikakoka chithunzi cha Docker kuchokera ku registry, chimakokedwa m'magawo ndikusungidwa pa wolandirayo.

Spring Boot imagwiritsa ntchito "mafuta JAR" mu monga mtundu wokhazikika wapackage. Tikayang'ana JAR wandiweyani, timawona kuti kugwiritsa ntchito kumapanga gawo laling'ono kwambiri la JAR yonse. Ichi ndi gawo lomwe limasintha nthawi zambiri. Zotsalazo zimakhala ndi zodalira za Spring Framework.

Njira yokwaniritsira imakhazikika pakupatula pulogalamuyo pamlingo wosiyana ndi kudalira kwa Spring Framework.

Chigawo chodalira, chomwe chimapanga kuchuluka kwa fayilo ya JAR yokhuthala, imatsitsidwa kamodzi kokha ndikusungidwa pamakina osungira.

Kagawo kakang'ono kokha ka pulogalamuyi ndi komwe kamakokedwa panthawi yosintha ntchito komanso kukonza zotengera. monga zikuwonekera pachithunzichi:

Kupanga Zithunzi Zapamwamba za Docker Kuti Mugwiritse Ntchito Boot Spring

M'magawo otsatirawa, tiwona momwe mungapangire zithunzi zokongoletsedwa izi kuti mugwiritse ntchito Spring Boot.

Kupanga Chifaniziro Chachidebe Chokongoletsedwa Chogwiritsa Ntchito Boot Spring Pogwiritsa Ntchito Buildpack

Spring Boot 2.3 imathandizira kusanjika pochotsa magawo a fayilo ya JAR yakuda mu zigawo zosiyana. Chosanjikizacho chimayimitsidwa mwachisawawa ndipo chiyenera kuthandizidwa momveka bwino pogwiritsa ntchito pulogalamu yowonjezera ya Spring Boot Maven:

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

Tigwiritsa ntchito kasinthidweku kuti tipange chithunzi chathu choyamba ndi Buildpack kenako ndi Docker m'magawo otsatirawa.

Tiyeni tiyambitse build-imageCholinga cha Maven popanga chithunzi cha chidebe:

mvn spring-boot:build-image

Ngati tithamanga Dive kuti tiwone zigawo zomwe zili pachithunzichi, titha kuwona kuti gawo la ntchito (lomwe lafotokozedwa mofiyira) ndilocheperako mumtundu wa kilobyte poyerekeza ndi zomwe tapeza pogwiritsa ntchito mtundu wa JAR wandiweyani:

Kupanga Zithunzi Zapamwamba za Docker Kuti Mugwiritse Ntchito Boot Spring

Kupanga Chithunzi Chokhazikika cha Chidebe cha Spring Boot Application Pogwiritsa Ntchito Docker

M'malo mogwiritsa ntchito pulogalamu yowonjezera ya Maven kapena Gradle, titha kupanganso chithunzi cha Docker JAR chokhala ndi fayilo ya Docker.

Tikamagwiritsa ntchito Docker, tiyenera kuchita njira ziwiri zowonjezera kuti tichotse zigawozo ndikuzikopera mu chithunzi chomaliza.

Zomwe zili mu JAR yotsatila mutamanga pogwiritsa ntchito Maven yokhala ndi kusanjika koyatsa zidzawoneka motere:

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

Zotsatira zikuwonetsa JAR yowonjezera yotchedwa spring-boot-jarmode-layertoolsΠΈ layersfle.idxwapamwamba. Fayilo yowonjezera ya JAR iyi imapereka kuthekera kosinthira, monga tafotokozera mgawo lotsatira.

Kuchotsa zidalira pa aliyense zigawo

Kuti muwone ndikuchotsa zigawo kuchokera ku JAR yathu yosanjikiza, timagwiritsa ntchito katundu wamakina -Djarmode=layertoolskwa poyambira spring-boot-jarmode-layertoolsJAR m'malo mwa kugwiritsa ntchito:

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

Kuthamanga lamuloli kumatulutsa zotulutsa zomwe zili ndi zosankha zamalamulo zomwe zilipo:

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

Zotsatira zikuwonetsa malamulo listextractΠΈ helpс helpkukhala wokhazikika. Tiyeni tiyendetse lamulo ndi listmwina:

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

Tikuwona mndandanda wazodalira zomwe zitha kuwonjezeredwa ngati zigawo.

Masanjidwe ofikira:

Layer dzina

Zamkatimu

dependencies

kudalira kulikonse komwe mtundu wake ulibe SNAPSHOT

spring-boot-loader

Maphunziro a JAR Loader

snapshot-dependencies

kudalira kulikonse komwe mtundu wake uli ndi SNAPSHOT

application

makalasi ogwiritsira ntchito ndi zothandizira

Masanjidwe amafotokozedwa mu layers.idxfayilo mu dongosolo lomwe liyenera kuwonjezeredwa ku chithunzi cha Docker. Zigawozi zimasungidwa mumsakatuli pambuyo pa kubweza koyamba chifukwa sizisintha. Ndilo gawo losinthidwa lokhalo lomwe limatsitsidwa kwa wolandirayo, lomwe limathamanga kwambiri chifukwa cha kuchepa kwake .

Kupanga chithunzi chokhala ndi zodalira zomwe zimachotsedwa mumagulu osiyana

Tidzamanga chithunzi chomaliza mu magawo awiri pogwiritsa ntchito njira yotchedwa msonkhano wamagulu ambiri . Mu sitepe yoyamba tidzachotsa zodalira ndipo mu sitepe yachiwiri tidzatengera zomwe zachotsedwa mu chithunzi chomaliza.

Tiyeni tisinthe Dockerfile yathu pakupanga magawo angapo:

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

Timasunga izi mu fayilo ina - Dockerfile2.

Timamanga chithunzi cha Docker pogwiritsa ntchito lamulo:

docker build -f Dockerfile2 -t usersignup:v1 .

Pambuyo poyendetsa lamulo ili timapeza zotsatirazi:

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

Titha kuwona kuti chithunzi cha Docker chimapangidwa ndi chithunzi cha ID kenako ndikumangidwa.

Pomaliza, timayendetsa lamulo la Dive monga kale kuti tiyang'ane zigawo zomwe zili mkati mwa chithunzi chopangidwa ndi Docker. Titha kupereka chithunzithunzi cha ID kapena tag ngati cholowetsa ku lamulo la Dive:

dive userssignup:v1

Monga mukuwonera pazotulutsa, wosanjikiza womwe uli ndi pulogalamuyi ndi 11 KB yokha, ndipo zodalira zimasungidwa m'magawo osiyanasiyana. 

Kupanga Zithunzi Zapamwamba za Docker Kuti Mugwiritse Ntchito Boot Spring

Kuchotsa zodalira zamkati pamagulu amodzi

Titha kuchepetsanso kukula kwa gawo logwiritsira ntchito pochotsa zodalira zathu zilizonse kukhala gawo lina m'malo moziyika ndi pulogalamuyo pozilengeza mu ymlfayilo yofananira yotchedwa 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/"

Mu fayilo iyi layers.idxtawonjezera kudalira komwe kumatchedwa, io.myorgzomwe zili ndi zidalira pa bungwe zomwe zatengedwa kuchokera kunkhokwe yogawana nawo.

Pomaliza

M'nkhaniyi, tidayang'ana kugwiritsa ntchito Cloud-Native Buildpacks kuti tipange chithunzi cha chidebe mwachindunji kuchokera ku code code. Iyi ndi njira ina yogwiritsira ntchito Docker kupanga chithunzi cha chidebe monga mwachizolowezi: choyamba pangani fayilo ya JAR yokhazikika ndikuyiyika mu chidebe pofotokoza malangizo mu fayilo ya Docker.

Tidayang'ananso kukhathamiritsa chidebe chathu pothandizira gawo losanjikiza lomwe limakoka zodalira m'magawo osiyanasiyana omwe amasungidwa pa wolandila ndipo gawo locheperako la pulogalamuyo limayikidwa pakukonzekera nthawi yamainjini opangira chidebe.

Mutha kupeza ma source code onse omwe amagwiritsidwa ntchito m'nkhaniyi Github .

Command reference

Nawa mwachidule malamulo omwe tidagwiritsa ntchito m'nkhaniyi.

Kuthetsa nkhani:

docker system prune -a

Kupanga chithunzi cha chidebe pogwiritsa ntchito fayilo ya Docker:

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

Timamanga chithunzi cha chidebe kuchokera ku code code (popanda Dockerfile):

mvn spring-boot:build-image

Onani zigawo zodalira. Musanapange fayilo ya JAR yogwiritsira ntchito, onetsetsani kuti gawolo layatsidwa mu spring-boot-maven-plugin:

java -Djarmode=layertools -jar application.jar list

Kuchotsa zigawo zodalira. Musanapange fayilo ya JAR yogwiritsira ntchito, onetsetsani kuti gawolo layatsidwa mu spring-boot-maven-plugin:

 java -Djarmode=layertools -jar application.jar extract

Onani mndandanda wazithunzi zotengera

docker images

Onani kumanzere mkati mwa chithunzi cha chidebe (onetsetsani kuti chida chodumphira chayikidwa):

dive <image ID or image tag>

Source: www.habr.com