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:
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 txheem: Qhib 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.
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 web, lombokΠΈ 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:
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:
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:
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.
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:
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.
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:
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.
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:
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:
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:
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 list, extractΠΈ 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
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.
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:
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: