Tsim kom zoo Docker duab rau daim ntawv thov caij nplooj ntoos hlav khau raj

Cov thawv ntim tau dhau los ua txoj kev xav tau ntawm kev ntim cov ntawv thov nrog tag nrho nws cov software thiab kev ua haujlwm ntawm kev ua haujlwm thiab tom qab ntawd xa lawv mus rau qhov chaw sib txawv.

Kab lus no suav nrog ntau txoj hauv kev los ntim cov ntawv thov Spring Boot:

  • tsim cov duab docker siv dockerfile,
  • tsim cov duab OCI los ntawm qhov chaw siv Cloud-Native Buildpack,
  • thiab cov duab optimization ntawm lub sijhawm khiav los ntawm kev sib cais JAR qhov chaw mus rau ntau qib siv cov cuab yeej txheej txheej.

 Code piv txwv

Kab lus no yog nrog los ntawm kev ua haujlwm code piv txwv ntawm GitHub .

Thawv terminology

Peb mam li pib nrog lub thawv terminology siv thoob plaws hauv kab lus:

  • Thawv duab: cov ntaub ntawv ntawm ib hom ntawv tshwj xeeb. Peb yuav hloov peb daim ntawv thov mus rau hauv lub thawv duab los ntawm kev khiav lub cuab yeej tsim.
  • Thawv: Ib qho executable piv txwv ntawm lub thawv duab.
  • Thawv cav: Cov txheej txheem daemon lub luag haujlwm rau kev khiav lub thawv.
  • Thawv host: Tus tswv tsev computer uas lub thawv cav khiav.
  • Thawv sau npe: Qhov chaw dav dav siv los tshaj tawm thiab faib cov duab ntim.
  • OCI txheemQhib Container Initiative (OCI) yog lub teeb yuag, qhib qhov chaw tswj hwm tsim los ntawm Linux Foundation. OCI Image Specification txhais cov qauv kev lag luam rau lub thawv duab hom thiab lub sijhawm ua haujlwm los xyuas kom meej tias txhua lub thawv ntim tuaj yeem khiav cov duab thawv tsim los ntawm txhua lub cuab yeej tsim.

Txhawm rau ntim ib daim ntawv thov, peb qhwv peb daim ntawv thov rau hauv ib lub thawv duab thiab luam tawm cov duab ntawd rau pej xeem sau npe. Lub thawv runtime retrieves daim duab no los ntawm lub npe, unpacks nws, thiab khiav daim ntawv thov nyob rau hauv nws.

Version 2.3 ntawm Caij Nplooj Ntoos Hlav muab cov plugins tsim OCI cov duab.

docker yog kev siv cov thawv ntim ntau tshaj plaws, thiab peb siv Docker hauv peb cov piv txwv, yog li tag nrho cov ntaub ntawv ntim tom ntej hauv kab lus no yuav xa mus rau Docker.

Tsim ib lub thawv duab nyob rau hauv ib txwm txoj kev

Tsim Docker dluab rau Spring Boot daim ntaub ntawv yog ib qho yooj yim heev los ntawm kev ntxiv ob peb cov lus qhia rau Docker cov ntaub ntawv.

Peb xub tsim ib qho JAR executable thiab, raws li ib feem ntawm Dockerfile cov lus qhia, luam cov executable JAR nyob rau sab saum toj ntawm lub hauv paus JRE duab tom qab siv qhov tsim nyog customizations.

Cia peb tsim peb daim ntawv thov Caij nplooj ntoos hlav rau Caij nplooj ntoos hlav Initializr nrog dependencies weblombokΠΈ actuator. Peb kuj ntxiv tus tswj xyuas so kom muab API nrog GETtxoj kev.

Tsim ib Dockerfile

Peb mam li ntim cov ntawv thov no los ntawm kev ntxiv Dockerfile:

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

Peb cov ntaub ntawv Docker muaj cov duab hauv qab los ntawm adoptopenjdk, nyob rau saum toj uas peb luam peb cov ntaub ntawv JAR thiab tom qab ntawd qhib qhov chaw nres nkoj, 8080uas yuav mloog rau kev thov.

Tsim daim ntawv thov

Ua ntej koj yuav tsum tsim ib daim ntawv thov siv Maven lossis Gradle. Ntawm no peb siv Maven:

mvn clean package

Qhov no tsim cov ntaub ntawv JAR executable rau daim ntawv thov. Peb yuav tsum tau hloov JAR executable no rau hauv Docker duab kom khiav ntawm Docker cav.

Tsim ib lub thawv duab

Peb mam li muab JAR executable no rau hauv Docker duab los ntawm kev khiav cov lus txib docker buildlos ntawm qhov project hauv paus directory uas muaj Dockerfile tsim ua ntej:

docker build  -t usersignup:v1 .

Peb tuaj yeem pom peb cov duab hauv cov npe siv cov lus txib:

docker images 

Cov zis ntawm cov lus txib saum toj no suav nrog peb cov duab usersignupnrog rau lub hauv paus duab, adoptopenjdkteev nyob rau hauv peb cov ntaub ntawv Docker.

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

Saib cov khaubncaws sab nraud povtseg hauv lub thawv ntim duab

Cia peb saib cov txheej txheej hauv daim duab. Peb yuav siv ntsuas  dhia dej mus saib cov txheej no:

dive usersignup:v1

Nov yog ib feem ntawm cov zis los ntawm Dive hais kom ua: 

Tsim kom zoo Docker duab rau daim ntawv thov caij nplooj ntoos hlav khau raj

Raws li peb tuaj yeem pom, daim ntawv thov txheej ua ib feem tseem ceeb ntawm daim duab loj. Peb xav txo qhov luaj li cas ntawm cov txheej no hauv cov ntu hauv qab no ua ib feem ntawm peb qhov kev ua kom zoo.

Tsim ib lub thawv duab siv Buildpack

Cov pob khoom sib dhos (Buildpacks) yog ib lo lus uas siv los ntawm ntau lub Platform as a Service (PAAS) muab los tsim ib lub thawv duab los ntawm qhov chaws. Nws tau tsim los ntawm Heroku hauv 2011 thiab txij li tau txais los ntawm Huab Foundry, Google App Engine, Gitlab, Knative thiab ob peb lwm tus.

Tsim kom zoo Docker duab rau daim ntawv thov caij nplooj ntoos hlav khau raj

Qhov zoo ntawm Cloud Build Packages

Ib qho txiaj ntsig tseem ceeb ntawm kev siv Buildpack los tsim cov duab yog qhov ntawd Cov duab hloov pauv tuaj yeem tswj hwm hauv nruab nrab (builder) thiab nthuav tawm rau txhua daim ntawv thov siv tus tsim.

Cov pob tsim tau nruj ua ke rau lub platform. Cloud-Native Buildpacks muab kev tsim qauv thoob plaws lub platform los ntawm kev txhawb nqa OCI duab hom, uas ua kom cov duab tuaj yeem khiav los ntawm Docker cav.

Siv lub Spring Boot Plugin

Lub Caij Nplooj Ntoos Hlav plugin tsim OCI cov duab los ntawm qhov chaw siv Buildpack. Cov duab yog tsim los siv bootBuildImageua hauj lwm (Gradle) los yog spring-boot:build-imagephiaj (Maven) thiab lub zos Docker installation.

Peb tuaj yeem kho lub npe ntawm daim duab xav tau los thawb rau Docker npe los ntawm kev qhia lub npe hauv 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>

Cia peb siv Maven los ua kom tiav build-imagecov hom phiaj tsim ib daim ntawv thov thiab tsim ib lub thawv duab. Peb tsis siv Dockerfiles nyob rau lub sijhawm no.

mvn spring-boot:build-image

Cov txiaj ntsig yuav yog qee yam zoo li no:

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

Los ntawm cov zis peb pom tias paketo Cloud-Native buildpacksiv los tsim cov duab OCI ua haujlwm. Raws li ua ntej, peb tuaj yeem pom cov duab teev ua Docker duab los ntawm kev khiav cov lus txib:

docker images 

Xaus:

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

Tsim ib lub thawv duab siv Jib

Jib yog daim duab sau plugin los ntawm Google uas muab lwm txoj hauv kev los tsim lub thawv duab los ntawm qhov chaw.

Kho jib-maven-pluginpom xml:

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

Tom ntej no, peb khiav Jib plugin siv cov lus txib Maven los tsim daim ntawv thov thiab tsim lub thawv duab. Raws li ua ntej, peb tsis siv cov ntaub ntawv Docker ntawm no:

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

Tom qab ua tiav cov lus txib Maven saum toj no, peb tau txais cov txiaj ntsig hauv qab no:

[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

Cov zis qhia tau hais tias cov duab ntim tau tsim thiab muab tso rau hauv daim ntawv teev npe.

Kev txhawb siab thiab txoj hauv kev los tsim cov duab zoo

Peb muaj ob lub ntsiab yog vim li cas rau optimization:

  • Tsim tau: Nyob rau hauv ib lub thawv orchestration system, ib lub thawv duab yog rub los ntawm daim ntawv teev npe mus rau tus tswv tsev khiav lub cav ntim. Cov txheej txheem no hu ua kev npaj. Rub cov duab loj los ntawm kev sau npe ua rau lub sijhawm teem sijhawm ntev hauv lub thawv orchestration systems thiab ntev tsim lub sijhawm hauv CI pipelines.
  • Kev ruaj ntseg: Cov duab loj kuj muaj thaj chaw loj rau qhov tsis zoo.

Daim duab Docker yog tsim los ntawm ib pawg ntawm txheej, txhua tus sawv cev rau nqe lus hauv peb Dockerfile. Txhua txheej sawv cev rau delta ntawm kev hloov pauv hauv cov txheej txheem hauv qab. Thaum peb rub Docker duab los ntawm kev sau npe, nws raug rub rau hauv txheej thiab cached ntawm tus tswv tsev.

Spring Boot siv "fat JAR" hauv raws li lub neej ntawd ntim hom ntawv. Thaum peb saib JAR rog, peb pom tias daim ntawv thov yog ib feem me me ntawm tag nrho JAR. Qhov no yog ib feem uas hloov ntau tshaj. Cov so muaj xws li Spring Framework dependencies.

Cov qauv kev ua kom zoo tshaj plaws nyob ib ncig ntawm kev sib cais ntawm daim ntawv thov ntawm qib sib cais los ntawm Spring Framework dependencies.

Cov txheej txheem kev vam khom, uas ua rau feem ntau ntawm cov ntaub ntawv JAR tuab, tsuas yog rub tawm ib zaug thiab cached ntawm tus tswv tsev.

Tsuas yog ib txheej nyias ntawm daim ntawv thov raug rub thaum lub sijhawm hloov kho daim ntawv thov thiab lub sijhawm teem lub thawv. raws li qhia hauv daim duab no:

Tsim kom zoo Docker duab rau daim ntawv thov caij nplooj ntoos hlav khau raj

Hauv ntu hauv qab no, peb yuav saib yuav ua li cas los tsim cov duab zoo rau lub caij nplooj ntoos hlav Boot daim ntawv thov.

Tsim ib lub thawv Optimized duab rau daim ntawv thov caij nplooj ntoos hlav siv Buildpack

Caij Nplooj Ntoos Hlav 2.3 txhawb nqa txheej los ntawm kev rho tawm qhov chaw ntawm cov ntaub ntawv JAR tuab rau hauv nyias txheej. Cov txheej txheem txheej yog neeg xiam los ntawm lub neej ntawd thiab yuav tsum tau ua kom meej meej siv lub caij nplooj ntoos hlav khau raj Maven plugin:

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

Peb yuav siv qhov kev teeb tsa no los tsim peb lub thawv duab ua ntej nrog Buildpack thiab tom qab ntawd nrog Docker hauv cov ntu hauv qab no.

Cia peb pib build-imageMaven lub hom phiaj los tsim lub thawv duab:

mvn spring-boot:build-image

Yog tias peb khiav Dive kom pom cov khaubncaws sab nraud povtseg hauv cov duab uas tau tshwm sim, peb tuaj yeem pom tias daim ntawv thov txheej (circled hauv liab) yog me dua nyob rau hauv ntau kilobyte piv rau qhov peb tau txais siv cov tuab JAR hom:

Tsim kom zoo Docker duab rau daim ntawv thov caij nplooj ntoos hlav khau raj

Tsim ib lub thawv Optimized duab rau daim ntawv thov caij nplooj ntoos hlav siv Docker

Hloov chaw ntawm kev siv Maven lossis Gradle plugin, peb tuaj yeem tsim cov duab Docker JAR nrog cov ntaub ntawv Docker.

Thaum peb siv Docker, peb yuav tsum ua ob kauj ruam ntxiv los rho tawm cov txheej txheem thiab luam tawm rau hauv daim duab kawg.

Cov ntsiab lus ntawm qhov tshwm sim JAR tom qab lub tsev nrog Maven nrog txheej txheej yuav zoo li no:

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

Cov zis qhia tau tias muaj JAR ntxiv npe spring-boot-jarmode-layertoolsΠΈ layersfle.idxntaub ntawv. Cov ntaub ntawv JAR ntxiv no muab cov peev txheej ua tiav, raws li tau piav qhia hauv ntu tom ntej.

Extract dependencies ntawm nyias txheej

Txhawm rau saib thiab rho tawm cov txheej txheem los ntawm peb cov txheej txheem JAR, peb siv cov cuab yeej system -Djarmode=layertoolspib spring-boot-jarmode-layertoolsJAR es tsis txhob siv:

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

Khiav cov lus txib no ua rau cov zis uas muaj cov kev xaiv hais kom ua:

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

Cov zis qhia tau hais tias cov lus txib listextractΠΈ helpс helpua lub neej ntawd. Cia peb khiav cov lus txib nrog listkev xaiv:

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

Peb pom ib daim ntawv teev cov dependencies uas tuaj yeem muab ntxiv ua cov khaubncaws sab nraud povtseg.

Layers los ntawm lub neej ntawd:

Lub npe txheej

Txheem

dependencies

ib qho kev vam khom uas nws version tsis muaj SNAPSHOT

spring-boot-loader

JAR Loader Chav Kawm

snapshot-dependencies

ib qho kev vam khom uas nws cov version muaj SNAPSHOT

application

cov chav kawm ntawv thiab cov peev txheej

Cov txheej txheem yog txhais nyob rau hauv layers.idxcov ntaub ntawv nyob rau hauv qhov kev txiav txim lawv yuav tsum tau ntxiv rau Docker duab. Cov khaubncaws sab nraud povtseg yog cached nyob rau hauv lub party tom qab thawj retrieval vim lawv tsis hloov. Tsuas yog cov txheej txheem tshiab tau rub tawm mus rau tus tswv tsev, uas yog nrawm dua vim qhov txo qis .

Tsim ib daim duab nrog dependencies muab rho tawm rau hauv nyias txheej

Peb yuav tsim cov duab kawg hauv ob theem uas siv ib txoj kev hu ua ntau theem sib dhos . Nyob rau hauv thawj kauj ruam peb yuav rho tawm cov dependencies thiab nyob rau hauv lub thib ob kauj ruam peb yuav luam the extracted dependencies mus rau qhov kawg.

Cia peb hloov peb Dockerfile rau ntau theem tsim:

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

Peb khaws qhov kev teeb tsa no rau hauv ib daim ntawv cais - Dockerfile2.

Peb tsim cov duab Docker siv cov lus txib:

docker build -f Dockerfile2 -t usersignup:v1 .

Tom qab khiav cov lus txib no peb tau txais cov zis hauv qab no:

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

Peb tuaj yeem pom tias daim duab Docker yog tsim nrog tus duab ID thiab tom qab ntawd tagged.

Thaum kawg, peb khiav Dive hais kom ua ua ntej los tshuaj xyuas cov txheej hauv cov duab Docker tsim. Peb tuaj yeem muab cov duab ID lossis tag raws li kev nkag mus rau Dive hais kom ua:

dive userssignup:v1

Raws li koj tuaj yeem pom hauv cov zis, cov txheej txheem uas muaj daim ntawv thov tam sim no tsuas yog 11 KB, thiab cov kev vam khom tau cached nyob rau hauv nyias txheej. 

Tsim kom zoo Docker duab rau daim ntawv thov caij nplooj ntoos hlav khau raj

Extracting internal dependencies ntawm tus kheej txheej

Peb tuaj yeem txo qhov loj ntawm daim ntawv thov txheej los ntawm kev rho tawm ib qho ntawm peb cov kev cai dependencies mus rau hauv ib txheej nyias es tsis txhob ntim lawv nrog daim ntawv thov los ntawm kev tshaj tawm lawv hauv ymlzoo sib xws cov ntaub ntawv npe 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/"

Hauv cov ntaub ntawv no layers.idxpeb tau ntxiv ib qho kev vam khom npe hu ua, io.myorgmuaj cov koom haum dependencies tau muab los ntawm ib qho chaw khaws cia.

xaus

Hauv tsab xov xwm no, peb tau saib ntawm kev siv Cloud-Native Buildpacks los tsim lub thawv duab ncaj qha los ntawm qhov chaws. Qhov no yog lwm txoj hauv kev siv Docker los tsim lub thawv duab raws li ib txwm muaj: ua ntej tsim cov ntaub ntawv JAR tuab thiab tom qab ntawd ntim rau hauv lub thawv duab los ntawm kev qhia cov lus qhia hauv Docker cov ntaub ntawv.

Peb kuj tau saib kev ua kom zoo dua peb lub thawv los ntawm kev suav nrog cov txheej txheem txheej txheem uas tshem tawm cov kev vam khom rau hauv cov txheej txheem sib cais uas yog cached ntawm tus tswv tsev thiab cov txheej txheem nyias nyias yog thauj khoom ntawm lub sijhawm teem sijhawm hauv lub thawv ua tiav tshuab.

Koj tuaj yeem pom tag nrho cov cai siv hauv kab lus ntawm github .

Lus txib siv

Nov yog cov ntsiab lus ntawm cov lus txib uas peb tau siv hauv kab lus no rau kev siv ceev.

Cov ntsiab lus clearing:

docker system prune -a

Tsim ib lub thawv duab siv Docker cov ntaub ntawv:

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

Tsim lub thawv duab los ntawm qhov chaw (tsis muaj Dockerfile):

mvn spring-boot:build-image

Saib cov khaubncaws sab nraud povtseg. Ua ntej tsim daim ntawv thov JAR cov ntaub ntawv, xyuas kom meej tias cov txheej txheem txheej tau qhib rau lub caij nplooj ntoos hlav-boot-maven-plugin:

java -Djarmode=layertools -jar application.jar list

Extracting txheej txheej. Ua ntej tsim daim ntawv thov JAR cov ntaub ntawv, xyuas kom meej tias cov txheej txheem txheej tau qhib rau lub caij nplooj ntoos hlav-boot-maven-plugin:

 java -Djarmode=layertools -jar application.jar extract

Saib daim ntawv teev cov duab thawv

docker images

Saib ntawm sab laug hauv lub thawv duab (kom paub tseeb tias cov cuab yeej dhia dej tau teeb tsa):

dive <image ID or image tag>

Tau qhov twg los: www.hab.com