Togail Ìomhaighean Docker Optimized airson Iarrtas Boot Spring

Tha soithichean air a thighinn gu bhith mar an dòigh as fheàrr air tagradh a phacadh leis a h-uile eisimeileachd air bathar-bog agus siostam obrachaidh agus an uairsin gan lìbhrigeadh gu diofar àrainneachdan.

Tha an artaigil seo a’ còmhdach diofar dhòighean air tagradh Spring Boot a chumail:

  • a 'togail ìomhaigh docker a' cleachdadh dockerfile,
  • togail ìomhaigh OCI bhon stòr a’ cleachdadh Cloud-Native Buildpack,
  • agus optimization ìomhaigh aig àm ruith le bhith a’ sgaradh pàirtean JAR gu diofar ìrean a’ cleachdadh innealan le sreathan.

 Eisimpleir còd

An cois an artaigil seo tha eisimpleir còd obrach air GitHub .

Briathrachas container

Tòisichidh sinn leis a’ bhriathrachas container a thathar a’ cleachdadh tron ​​artaigil:

  • Dealbh container: faidhle de chruth sònraichte. Bidh sinn ag atharrachadh an tagradh againn gu ìomhaigh container le bhith a’ ruith an inneal togail.
  • Container: Eisimpleir so-ghnìomhaichte den ìomhaigh container.
  • Inneal gleidhidh: Am pròiseas daemon le uallach airson an soitheach a ruith.
  • Neach-gleidhidh container: An inneal aoigheachd air a bheil an einnsean container a’ ruith.
  • Clàradh container: An t-àite coitcheann a thathar a 'cleachdadh airson an ìomhaigh container fhoillseachadh agus a sgaoileadh.
  • OCI àbhaisteachIomairt Bogsa Fosgailte (OCI) na fhrèam riaghlaidh aotrom, stòr fosgailte a chaidh a chruthachadh leis an Linux Foundation. Tha Sònrachadh Ìomhaigh OCI a’ mìneachadh inbhean gnìomhachais airson cruthan ìomhaigh container agus an ùine ruith gus dèanamh cinnteach gun urrainn dha na h-einnseanan soithich uile ìomhaighean soithich a chruthachadh le inneal togail sam bith.

Gus tagradh a chuir a-steach, bidh sinn a’ pasgadh an tagradh againn ann an ìomhaigh soithich agus a’ foillseachadh an ìomhaigh sin don chlàr phoblach. Bidh ùine ruith an t-soithich a’ faighinn an ìomhaigh seo air ais bhon chlàr, ga dì-phapadh, agus a’ ruith an aplacaid na bhroinn.

Tha dreach 2.3 de Spring Boot a’ toirt seachad plugins airson ìomhaighean OCI a thogail.

Docker am buileachadh soithichean as cumanta, agus bidh sinn a’ cleachdadh Docker anns na h-eisimpleirean againn, agus mar sin bidh a h-uile iomradh air soithichean às deidh sin san artaigil seo a’ toirt iomradh air Docker.

A’ togail ìomhaigh container san dòigh thraidiseanta

Tha e gu math furasta a bhith a’ togail ìomhaighean Docker airson tagraidhean Spring Boot le bhith a’ cur beagan stiùiridh ris an Dockerfile agad.

Bidh sinn an-toiseach a’ cruthachadh JAR so-ghnìomhaichte agus, mar phàirt de stiùireadh Dockerfile, dèan lethbhreac den JAR so-ghnìomhaichte air mullach ìomhaigh bunaiteach JRE às deidh dhuinn na gnàthachadh riatanach a chuir an sàs.

Nach cruthaich sinn ar tagradh Earrach air adhart Tòiseachadh an Earraich le eisimeileachd weblombokи actuator. Bidh sinn cuideachd a’ cur rianadair fois ris gus API a thoirt seachad GETdòigh-obrach.

A 'cruthachadh dockerfile

Bidh sinn an uairsin a’ cur an tagradh seo ann an soitheach le bhith a’ cur ris Dockerfile:

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

Anns an Dockerfile againn tha ìomhaigh bhunaiteach, bho adoptopenjdk, a bharrachd air an sin bidh sinn a’ dèanamh lethbhreac den fhaidhle JAR againn agus an uairsin a ’fosgladh a’ phort, 8080a dh’èisteas ri iarrtasan.

Co-chruinneachadh tagraidh

An toiseach feumaidh tu tagradh a chruthachadh a’ cleachdadh Maven no Gradle. An seo tha sinn a 'cleachdadh Maven:

mvn clean package

Bidh seo a’ cruthachadh faidhle JAR so-ghnìomhaichte airson an tagraidh. Feumaidh sinn an JAR so-ghnìomhaichte seo a thionndadh gu ìomhaigh Docker gus a ruith air einnsean Docker.

Cruthaich dealbh container

Bidh sinn an uairsin a’ cur an gnìomh JAR seo a-steach don ìomhaigh Docker le bhith a’ ruith an àithne docker buildbho eòlaire freumh a’ phròiseict anns a bheil an Dockerfile a chaidh a chruthachadh na bu thràithe:

docker build  -t usersignup:v1 .

Chì sinn an ìomhaigh againn san liosta leis an àithne:

docker images 

Tha toradh na h-àithne gu h-àrd a’ toirt a-steach an ìomhaigh againn usersignupmaille ris an dealbh bhunaiteach, adoptopenjdkair a shònrachadh anns an Dockerfile againn.

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

Seall sreathan taobh a-staigh ìomhaigh container

Bheir sinn sùil air a’ chruach de shreathan taobh a-staigh an ìomhaigh. Cleachdaidh sinn ionnstramaid  dàibheadh, gus na sreathan seo fhaicinn:

dive usersignup:v1

Seo pàirt de thoradh an àithne Dive: 

Togail Ìomhaighean Docker Optimized airson Iarrtas Boot Spring

Mar a chì sinn, tha còmhdach an tagraidh na phàirt chudromach de mheud an ìomhaigh. Tha sinn airson meud an ìre seo a lughdachadh anns na h-earrannan a leanas mar phàirt den optimization againn.

A’ togail ìomhaigh container le Buildpack

Pacaidean cruinneachaidh (Pacaichean togail) na theirm coitcheann air a chleachdadh le diofar thabhartasan Àrd-ùrlar mar Sheirbheis (PAAS) gus ìomhaigh soitheach a chruthachadh bho chòd stòr. Chaidh a chuir air bhog le Heroku ann an 2011 agus bhon uair sin chaidh gabhail ris le Cloud Foundry, Google App Engine, Gitlab, Knative agus beagan eile.

Togail Ìomhaighean Docker Optimized airson Iarrtas Boot Spring

Buannachd pacaidean togail Cloud

Is e aon de na prìomh bhuannachdan bho bhith a’ cleachdadh Buildpack gus ìomhaighean a thogail faodar atharrachaidhean rèiteachaidh ìomhaigh a riaghladh sa mheadhan (neach-togail) agus an gluasad gu gach tagradh a’ cleachdadh an neach-togail.

Bha na pacaidean togail ceangailte gu dlùth ris an àrd-ùrlar. Bidh Cloud-Native Buildpacks a’ toirt seachad cunbhalachadh thar àrd-ùrlaran le bhith a’ toirt taic do chruth ìomhaigh OCI, a nì cinnteach gum faod an ìomhaigh a bhith air a ruith leis an einnsean Docker.

A’ cleachdadh am plugan Spring Boot

Bidh am plugan Spring Boot a ’togail ìomhaighean OCI bhon stòr a’ cleachdadh Buildpack. Tha dealbhan air an cruthachadh a’ cleachdadh bootBuildImagegnìomhan (Gradle) no spring-boot:build-imagetargaid (Maven) agus stàladh Docker ionadail.

Is urrainn dhuinn ainm na h-ìomhaigh a dh’ fheumas sinn a phutadh gu clàr an Docker a ghnàthachadh le bhith a’ sònrachadh an ainm ann 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>

Cleachdamaid Maven airson a chur gu bàs build-imageamasan airson tagradh a chruthachadh agus ìomhaigh container a chruthachadh. Chan eil sinn a’ cleachdadh Dockerfiles sam bith an-dràsta.

mvn spring-boot:build-image

Bidh an toradh rudeigin mar seo:

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

Bhon toradh, chì sinn sin paketo Cloud-Native buildpackair a chleachdadh gus ìomhaigh OCI obrach a chruthachadh. Mar a bha roimhe, chì sinn an ìomhaigh air a liostadh mar ìomhaigh Docker le bhith a’ ruith an àithne:

docker images 

Co-dhùnadh:

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

A 'cruthachadh Ìomhaigh Container le Jib

Tha Jib na plugan ùghdarrachadh ìomhaighean bho Google a bheir seachad dòigh eile air ìomhaigh soitheach a chruthachadh bhon stòr.

Gnàthaich jib-maven-pluginann am pom.xml:

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

An uairsin, bidh sinn a ’ruith am plugan Jib a’ cleachdadh an àithne Maven gus an tagradh a thogail agus ìomhaigh an t-soithich a chruthachadh. Mar a bha roimhe, chan eil sinn a’ cleachdadh Dockerfiles sam bith an seo:

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

Às deidh dhuinn an àithne Maven gu h-àrd a chuir an gnìomh, gheibh sinn an toradh a leanas:

[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

Tha an toradh a’ sealltainn gun deach ìomhaigh an t-soithich a chruthachadh agus a chuir sa chlàr.

Brosnachaidhean agus dòighean airson ìomhaighean làn-leasaichte a chruthachadh

Tha dà phrìomh adhbhar againn airson optimachadh:

  • Coileanadh: Ann an siostam orchestration container, tha ìomhaigh container air a shlaodadh bhon chlàr ìomhaigh chun aoigh a tha a ’ruith einnsean an t-soithich. Canar planadh ris a’ phròiseas seo. Le bhith a’ tarraing ìomhaighean mòra bhon chlàr thig amannan clàraidh fada ann an siostaman orchestration container agus amannan togail fada ann am pìoban CI.
  • Tèarainteachd: tha raon mòr aig ìomhaighean mòra cuideachd airson so-leòntachd.

Tha ìomhaigh Docker air a dhèanamh suas de chruach de shreathan, gach fear a’ riochdachadh aithris anns an Dockerfile againn. Tha gach còmhdach a’ riochdachadh delta nan atharrachaidhean anns an t-sreath bhunasach. Nuair a tharraingeas sinn dealbh Docker bhon chlàr, thèid a tharraing ann an sreathan agus a thasgadh air an òstair.

Cleachdaidhean Spring Boot "fat JAR" a-steach mar an cruth pacaidh bunaiteach. Nuair a choimheadas sinn air JAR reamhar, chì sinn gur e pàirt glè bheag den JAR gu lèir a th’ anns an tagradh. Is e seo am pàirt as motha a dh’ atharraicheas. Tha an còrr a’ gabhail a-steach eisimeileachd Frèam an Earraich.

Tha am foirmle optimization stèidhichte air a bhith a’ dealachadh an tagraidh aig ìre air leth bho eisimeileachd Spring Framework.

Chan eil an ìre eisimeileachd a tha mar a’ mhòr-chuid den fhaidhle tiugh JAR air a luchdachadh sìos ach aon turas agus air a thasgadh air an t-siostam aoigheachd.

Chan eil ach sreath tana den aplacaid air a shlaodadh rè ùrachadh app agus clàradh shoithichean, mar a chithear san diagram seo:

Togail Ìomhaighean Docker Optimized airson Iarrtas Boot Spring

Anns na h-earrannan a leanas, seallaidh sinn ri mar a chruthaicheas tu na h-ìomhaighean làn-leasaichte sin airson tagradh Spring Boot.

A’ togail ìomhaigh gleidhidh Optimized airson Iarrtas Boot Spring le Buildpack

Bidh Spring Boot 2.3 a’ toirt taic do laigheadh ​​le bhith a’ toirt a-mach pàirtean de fhaidhle JAR tiugh gu sreathan fa leth. Tha am feart còmhdachaidh ciorramach gu bunaiteach agus feumar a chomasachadh gu sònraichte le bhith a’ cleachdadh am plugan Spring Boot Maven:

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

Cleachdaidh sinn an rèiteachadh seo gus an ìomhaigh container againn a thogail an toiseach le Buildpack agus an uairsin le Docker anns na h-earrannan a leanas.

Ruithidh sinn build-imageTargaid Maven gus ìomhaigh container a chruthachadh:

mvn spring-boot:build-image

Ma ruitheas sinn Dive gus na sreathan san ìomhaigh a thig às fhaicinn, chì sinn gu bheil an ìre tagraidh (air a chuairteachadh ann an dearg) mòran nas lugha anns an raon kilobyte an taca ris na fhuair sinn a’ cleachdadh an cruth JAR tiugh:

Togail Ìomhaighean Docker Optimized airson Iarrtas Boot Spring

A’ togail ìomhaigh gleidhidh Optimized airson Iarrtas Boot Spring le Docker

An àite a bhith a’ cleachdadh plugan Maven no Gradle, is urrainn dhuinn cuideachd ìomhaigh Docker JAR le còmhdach a chruthachadh le faidhle Docker.

Nuair a chleachdas sinn Docker, feumaidh sinn dà cheum a bharrachd a ghabhail gus na sreathan a thoirt a-mach agus an lethbhreac a-steach don ìomhaigh dheireannach.

Bidh susbaint an JAR a thig às an dèidh togail le Maven le còmhdach air a chomasachadh a’ coimhead mar seo:

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

Tha an toradh a’ sealltainn JAR a bharrachd ainmichte spring-boot-jarmode-layertoolsи layersfle.idxfaidhle. Tha am faidhle JAR a bharrachd seo a’ toirt seachad comasan laighe, mar a tha air a mhìneachadh san ath earrann.

Thoir a-mach eisimeileachd air sreathan fa leth

Gus sreathan fhaicinn agus a thoirt a-mach às an JAR sreathach againn, bidh sinn a’ cleachdadh seilbh an t-siostaim -Djarmode=layertoolsairson tòiseachadh spring-boot-jarmode-layertoolsJAR an àite an tagraidh:

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

Le bhith a’ ruith an àithne seo bheir sin a-mach toradh anns a bheil na roghainnean àithne a tha rim faighinn:

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

Tha an toradh a’ sealltainn nan òrduighean listextractи helpс helpbi mar an àbhaist. Rachamaid an àithne le listroghainn:

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

Chì sinn liosta de eisimeileachd a dh'fhaodar a chur ris mar shreathan.

Sreathan gu bunaiteach:

Ainm sreath

Clàr-innse

dependencies

eisimeileachd sam bith aig nach eil SNAPSHOT ann an dreach

spring-boot-loader

Clasaichean luchdaidh JAR luchdadh a-nuas

snapshot-dependencies

eisimeileachd sam bith anns a bheil SNAPSHOT ann an dreach

application

clasaichean tagraidh agus goireasan

Tha sreathan air an comharrachadh ann an layers.idxfaidhle san òrdugh anns am bu chòir an cur ri ìomhaigh Docker. Tha na sreathan sin air an tasgadh air an òstair às deidh a’ chiad lorg oir chan eil iad ag atharrachadh. Chan eil ach an ìre tagraidh ùraichte air a luchdachadh sìos chun òstair, a tha nas luaithe air sgàth meud nas lugha .

A 'togail ìomhaigh le eisimeileachd air a thoirt a-steach do shreathan fa leth

Togaidh sinn an dealbh mu dheireadh ann an dà cheum a’ cleachdadh modh ris an canar co-chruinneachadh ioma-ìre . Anns a’ chiad cheum bheir sinn a-mach na h-eisimeileachd agus anns an dàrna ceum nì sinn leth-bhreac de na h-eisimeileachd a chaidh a thoirt a-steach don chuairt dheireannaich.

Nach atharraich sinn ar Dockerfile airson togail ioma-ìre:

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

Sàbhailidh sinn an rèiteachadh seo ann am faidhle air leth - Dockerfile2.

Bidh sinn a’ togail ìomhaigh Docker a’ cleachdadh an àithne:

docker build -f Dockerfile2 -t usersignup:v1 .

Às deidh dhuinn an àithne seo a chuir an gnìomh, gheibh sinn an toradh a leanas:

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

Chì sinn gu bheil ìomhaigh an Docker air a chruthachadh le ID ìomhaigh agus an uairsin air a tagadh.

Mu dheireadh, bidh sinn a ’ruith an àithne Dive mar a bha roimhe gus sùil a thoirt air na sreathan taobh a-staigh an ìomhaigh Docker a chaidh a chruthachadh. Is urrainn dhuinn ID ìomhaigh no taga a thoirt a-steach don àithne Dive:

dive userssignup:v1

Mar a chì thu bhon toradh, chan eil anns an ìre anns a bheil an tagradh a-nis ach 11 KB agus tha na h-eisimeileachd air an tasgadh ann an sreathan fa leth. 

Togail Ìomhaighean Docker Optimized airson Iarrtas Boot Spring

Thoir a-mach eisimeileachd a-staigh air sreathan fa leth

Is urrainn dhuinn meud an t-sreath tagraidh a lughdachadh tuilleadh le bhith a’ toirt a-mach gin de na cleachdaidhean àbhaisteach againn gu còmhdach air leth an àite am pacadh leis an tagradh le bhith gan cur an cèill ann an ymlfaidhle coltach ris air ainmeachadh 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/"

Anns an fhaidhle seo layers.idxtha sinn air eisimeileachd gnàthaichte ainmeachadh, io.myorganns a bheil eisimeileachd buidhne air fhaighinn air ais bhon stòr-dàta co-roinnte.

co-dhùnadh

San artaigil seo, choimhead sinn air cleachdadh Cloud-Native Buildpacks gus ìomhaigh soitheach a thogail gu dìreach bhon stòr. Is e seo roghainn eile seach a bhith a’ cleachdadh Docker gus ìomhaigh container a chruthachadh san dòigh àbhaisteach: an toiseach, thèid faidhle JAR tiugh a ghabhas coileanadh a chruthachadh agus an uairsin a phacaigeadh a-steach do ìomhaigh container le bhith a ’sònrachadh an stiùireadh anns an Dockerfile.

Choimhead sinn cuideachd air a bhith a’ dèanamh an fheum as fheàrr den t-soitheach againn le bhith a’ toirt a-steach feart còmhdachaidh a bhios a’ toirt a-mach eisimeileachd a-steach do shreathan fa leth a tha air an tasgadh air an òstair agus tha còmhdach tagraidh tana air a luchdachadh aig àm clàraidh ann an einnseanan cur gu bàs an t-soithich.

Gheibh thu a h-uile còd tùsail a chaidh a chleachdadh san artaigil aig GitHub .

Iomradh àithne

Seo geàrr-chunntas de na h-òrdughan a chleachd sinn san artaigil seo airson iomradh sgiobalta.

Glanadh co-theacsa:

docker system prune -a

A’ togail ìomhaigh container le Dockerfile:

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

Tog ìomhaigh container bhon stòr (às aonais Dockerfile):

mvn spring-boot:build-image

Thoir sùil air ìrean eisimeileachd. Mus tèid am faidhle jar tagraidh a thogail, dèan cinnteach gu bheil am feart laighe air a chomasachadh anns an spring-boot-maven-plugin:

java -Djarmode=layertools -jar application.jar list

Thoir a-mach sreathan eisimeileachd. Mus tèid am faidhle jar tagraidh a thogail, dèan cinnteach gu bheil am feart laighe air a chomasachadh anns an spring-boot-maven-plugin:

 java -Djarmode=layertools -jar application.jar extract

A’ coimhead air Liosta de Dhealbhan Container

docker images

Seall air an taobh chlì taobh a-staigh ìomhaigh an t-soithich (dèan cinnteach gu bheil an inneal dàibhidh air a chuir a-steach):

dive <image ID or image tag>

Source: www.habr.com