Ke kūkulu ʻana i nā kiʻi Docker Optimized no kahi noi Spring Boot
Ua lilo nā pahu i mea i makemake ʻia no ka hoʻopaʻa ʻana i kahi noi me kāna mau polokalamu a me nā ʻōnaehana hana hilinaʻi a laila hāʻawi iā lākou i nā kaiapuni like ʻole.
Hoʻopili kēia ʻatikala i nā ala like ʻole e hoʻopaʻa ai i kahi noi Spring Boot:
ka hana ʻana i kahi kiʻi Docker me ka hoʻohana ʻana i kahi faila Docker,
ke kūkulu ʻana i kiʻi OCI mai ke kumu me ka hoʻohana ʻana i Cloud-Native Buildpack,
a me ka hoʻolālā kiʻi i ka wā holo ma o ka hoʻokaʻawale ʻana i nā ʻāpana JAR i nā pae like ʻole me ka hoʻohana ʻana i nā mea hana papa.
Laʻana code
Hoʻopili ʻia kēia ʻatikala me kahi laʻana code hana ma GitHub .
Hua'ōlelo pahu
E hoʻomaka mākou me nā huaʻōlelo pahu i hoʻohana ʻia ma ka ʻatikala:
Kiʻi pahu: he waihona o kahi ʻano kikoʻī. Hoʻololi mākou i kā mākou noi i kahi kiʻi pahu ma ka holo ʻana i ka mea hana kūkulu.
Container: He mea hoʻokō o ke kiʻi pahu.
ʻenekini pahu pahu: ʻO ke kaʻina hana daemon ke kuleana no ka holo ʻana i ka ipu.
Mea hoʻokipa pahu: ʻO ka mīkini hoʻokipa kahi e holo ai ka mīkini pahu.
Kakau waihona: Ka wahi maʻamau i hoʻohana ʻia no ka paʻi ʻana a me ka puʻunaue ʻana i ke kiʻi pahu.
OCI maʻamau: Open Container Initiative (OCI) he papa hana hoʻokele māmā a wehe ʻia e ka Linux Foundation. Hōʻike ka OCI Image Specification i nā kūlana ʻoihana no nā kiʻi pahu pahu a me ka manawa holo e hōʻoia i hiki i nā mīkini pahu āpau ke holo i nā kiʻi ipu i hana ʻia e kekahi mea hana.
No ka hoʻopaʻa ʻana i kahi palapala noi, kāʻei mākou i kā mākou palapala noi i kahi kiʻi pahu a hoʻolaha i kēlā kiʻi i ka papa inoa o ka lehulehu. Hoʻihoʻi ka pahu runtime i kēia kiʻi mai ka papa inoa, wehe iā ia, a holo i ka noi i loko.
Hāʻawi ka mana 2.3 o Spring Boot i nā plugins no ke kūkulu ʻana i nā kiʻi OCI.
Docker ʻo ia ka hoʻokō maʻamau o ka pahu, a hoʻohana mākou iā Docker i kā mākou mau hiʻohiʻona, no laila e pili ana nā kuhikuhi pahu a pau i kēia ʻatikala iā Docker.
Ke kūkulu ʻana i kiʻi ipu ma ke ʻano kuʻuna
Maʻalahi loa ke kūkulu ʻana i nā kiʻi Docker no nā noi Spring Boot ma ka hoʻohui ʻana i kekahi mau ʻōlelo kuhikuhi i kāu Dockerfile.
Hana mua mākou i kahi JAR hiki ke hoʻokō a, ma ke ʻano he ʻāpana o nā ʻōlelo Dockerfile, kope i ka JAR executable ma luna o ke kiʻi JRE kumu ma hope o ka hoʻohana ʻana i nā hana maʻamau.
E hana mākou i kā mākou polokalamu Spring ma Puna Initializr me nā mea hilinaʻi web, lombokи actuator. Hoʻohui pū mākou i kahi mea hoʻomaha hoʻomaha e hāʻawi i kahi API me GETʻano hana.
Ke hana nei i kahi Dockerfile
A laila hoʻokomo mākou i kēia noi i loko o kahi pahu me ka hoʻohui Dockerfile:
Loaʻa i kā mākou Dockerfile kahi kiʻi kumu, mai adoptopenjdk, ma luna a mākou e kope ai i kā mākou faila JAR a laila wehe i ke awa, 8080ka mea e hoolohe i na noi.
Hui noi
Pono mua ʻoe e hana i kahi noi me ka hoʻohana ʻana iā Maven a i ʻole Gradle. Eia mākou e hoʻohana nei iā Maven:
mvn clean package
Hoʻokumu kēia i kahi faila JAR hoʻokō no ka noi. Pono mākou e hoʻololi i kēia JAR hoʻokō i kahi kiʻi Docker e holo ma ka mīkini Docker.
E hana i kahi kiʻi pahu
A laila hoʻokomo mākou i kēia JAR i hoʻokō ʻia i ke kiʻi Docker ma ka holo ʻana i ke kauoha docker buildmai ka papa kuhikuhi kumu papahana i loaʻa ka Dockerfile i hana mua ʻia:
docker build -t usersignup:v1 .
Hiki iā mākou ke ʻike i kā mākou kiʻi ma ka papa inoa me ke kauoha:
docker images
ʻO ka hoʻopuka o ke kauoha i luna me kā mākou kiʻi usersignupme ke kiʻi kumu, adoptopenjdki kuhikuhi ʻia ma kā mākou Dockerfile.
REPOSITORY TAG SIZE
usersignup v1 249MB
adoptopenjdk 11-jre-hotspot 229MB
Nānā i nā papa i loko o kahi kiʻi ipu
E nānā kākou i ka ahu o nā papa i loko o ke kiʻi. E hoʻohana mākou mea kani luʻu e nānā i kēia mau papa:
dive usersignup:v1
Eia kekahi ʻāpana o ka puka o ke kauoha Dive:
E like me kā mākou e ʻike ai, hana ka papa noi i kahi ʻāpana nui o ka nui o ke kiʻi. Makemake mākou e hoʻemi i ka nui o kēia papa ma nā ʻāpana aʻe ma ke ʻano o kā mākou loiloi.
Ke hana ʻana i kahi kiʻi pahu me ka hoʻohana ʻana iā Buildpack
Nā pūʻolo hui (Buildpacks) he huaʻōlelo maʻamau i hoʻohana ʻia e nā makana Platform as a Service (PAAS) e hana i kahi kiʻi pahu mai ka code kumu. Ua hoʻokuʻu ʻia e Heroku i ka makahiki 2011 a ua lawe ʻia e Cloud Foundry, Google App Engine, Gitlab, Knative a me kekahi mau mea ʻē aʻe.
Pōmaikaʻi o Cloud Build Packages
ʻO kekahi o nā pono nui o ka hoʻohana ʻana iā Buildpack e kūkulu i nā kiʻi ʻo ia Hiki ke mālama ʻia nā hoʻololi hoʻonohonoho kiʻi ma ke kikowaena (mea kūkulu hale) a hoʻolaha i nā noi āpau me ka hoʻohana ʻana i ka mea hana.
Ua pili pono nā pūʻolo kūkulu i ka paepae. Hāʻawi ʻo Cloud-Native Buildpacks i ka standardization ma waena o nā paepae ma ke kākoʻo ʻana i ke ʻano kiʻi kiʻi OCI, e hōʻoiaʻiʻo ana e hiki ke holo ʻia ke kiʻi e ka mīkini Docker.
Ke hoʻohana nei i ka Spring Boot Plugin
Hoʻokumu ka Spring Boot plugin i nā kiʻi OCI mai ke kumu me Buildpack. Hana ʻia nā kiʻi me ka hoʻohana ʻana bootBuildImagenā hana (Gradle) a i ʻole spring-boot:build-imagetarget (Maven) a me ka hoʻonohonoho Docker kūloko.
Hiki iā mākou ke hana i ka inoa o ke kiʻi e pono ai mākou e pana i ka Docker registry ma ke kuhikuhi ʻana i ka inoa i loko image tag:
E hoʻohana kākou iā Maven e hoʻokō build-imagenā pahuhopu no ka hana ʻana i kahi noi a me ka hana ʻana i kahi kiʻi pahu. ʻAʻole mākou e hoʻohana nei i nā Dockerfiles.
Mai ka hopena, ʻike mākou i kēlā paketo Cloud-Native buildpackhoʻohana ʻia e hana i kahi kiʻi OCI hana. E like me ka wā ma mua, hiki iā mākou ke ʻike i ke kiʻi i helu ʻia ma ke ʻano he kiʻi Docker ma ka holo ʻana i ke kauoha:
A laila, holo mākou i ka plugin Jib me ka hoʻohana ʻana i ke kauoha Maven e kūkulu i ka noi a hana i ke kiʻi pahu. E like me ka wā ma mua, ʻaʻole mākou e hoʻohana i nā Dockerfiles ma aneʻi:
Ma hope o ka hoʻokō ʻana i ke kauoha Maven i luna, loaʻa iā mākou ka hopena aʻe:
[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
Hōʻike ka mea hoʻopuka ua hana ʻia ke kiʻi pahu a waiho ʻia i loko o ka papa inoa.
Nā hoʻoikaika a me nā ʻano hana no ka hana ʻana i nā kiʻi i hoʻopaʻa ʻia
Loaʻa iā mākou ʻelua kumu nui no ka hoʻonui ʻana:
'Ohanahana: I loko o kahi ʻōnaehana hoʻokani pahu, kiʻi ʻia kahi kiʻi pahu mai ka papa inoa kiʻi i ka mea hoʻokipa e holo ana i ka mīkini pahu. Kapa ʻia kēia kaʻina hana hoʻolālā. ʻO ka huki ʻana i nā kiʻi nui mai ka papa inoa e hopena i nā manawa hoʻonohonoho lōʻihi i nā ʻōnaehana orchestration pahu a me nā manawa kūkulu lōʻihi i nā pipeline CI.
Ka maluhia: Loaʻa i nā kiʻi ʻoi aku kahi ʻāpana nui no nā nāwaliwali.
Hoʻokumu ʻia kahi kiʻi Docker i kahi papa o nā papa, kēlā me kēia mea e hōʻike ana i kahi ʻōlelo i kā mākou Dockerfile. Hōʻike kēlā me kēia papa i ka delta o nā hoʻololi i ka papa lalo. Ke huki mākou i kahi kiʻi Docker mai ka papa inoa, huki ʻia i nā papa a hūnā ʻia ma ka host.
Hoʻohana ʻia ka Spring Boot "momona JAR" ma e like me ke ʻano paʻa paʻa. Ke nānā mākou i kahi JAR momona, ʻike mākou he wahi liʻiliʻi loa ka noi o ka JAR holoʻokoʻa. ʻO kēia ka ʻāpana e hoʻololi loa. Aia ke koena i nā hilinaʻi Spring Framework.
Hoʻokumu ʻia ke ʻano hoʻohālikelike i ka hoʻokaʻawale ʻana i ka noi ma kahi pae ʻokoʻa mai nā hilinaʻi Spring Framework.
Hoʻoiho ʻia ka papa hilinaʻi e hoʻokumu i ka nui o ka faila JAR mānoanoa i hoʻokahi wale nō a hūnā ʻia ma ka ʻōnaehana hoʻokipa.
ʻO kahi ʻāpana lahilahi wale nō o ka app i huki ʻia i ka wā o ka hoʻonui ʻana i ka app a me ka hoʻonohonoho pahu, e like me ka mea i hoikeia ma keia kii:
Ma nā ʻāpana aʻe, e nānā mākou i ka hana ʻana i kēia mau kiʻi i hoʻopaʻa ʻia no kahi noi Spring Boot.
Ke kūkulu ʻana i kahi kiʻi pahu i hoʻopaʻa ʻia no kahi noi pūnāwai me Buildpack
Kākoʻo ʻo Spring Boot 2.3 i ka waiho ʻana ma ka unuhi ʻana i nā ʻāpana o kahi faila JAR mānoanoa i nā papa ʻokoʻa. Hoʻopau ʻia ka hiʻohiʻona layering ma ka paʻamau a pono e hoʻohana ʻia me ka hoʻohana ʻana i ka plugin Spring Boot Maven:
E hoʻohana mākou i kēia hoʻonohonoho e kūkulu mua i kā mākou kiʻi pahu me Buildpack a laila me Docker ma nā ʻāpana aʻe.
E holo kāua build-imagePahu maven no ka hana ʻana i ke kiʻi pahu:
mvn spring-boot:build-image
Inā mākou e holo i ka Dive e ʻike i nā ʻāpana o ke kiʻi i loaʻa, ʻike mākou he ʻoi aku ka liʻiliʻi o ka papa noi (a puni i ka ʻulaʻula) i ka laulā kilobyte i hoʻohālikelike ʻia i ka mea i loaʻa iā mākou me ka hoʻohana ʻana i ka format JAR mānoanoa:
Ke kūkulu ʻana i kahi kiʻi i hoʻopaʻa ʻia no kahi noi Spring Boot me Docker
Ma kahi o ka hoʻohana ʻana i kahi plugin Maven a Gradle, hiki iā mākou ke hana i kahi kiʻi Docker JAR layered me kahi faila Docker.
Ke hoʻohana mākou iā Docker, pono mākou e hana i ʻelua mau ʻanuʻu hou e unuhi i nā papa a kope iā lākou i ke kiʻi hope loa.
ʻO nā ʻike o ka JAR i loaʻa ma hope o ke kūkulu ʻana me ka hoʻohana ʻana iā Maven me ka layering enabled e like me kēia:
Hōʻike ka hopena i kahi JAR hou i kapa ʻia spring-boot-jarmode-layertoolsи layersfle.idxwaihona. Hāʻawi kēia waihona JAR hou i nā hiki ke hoʻoili ʻia, e like me ka wehewehe ʻana ma ka ʻāpana aʻe.
Ka unuhi ʻana i nā hilinaʻi ma nā papa pākahi
No ka nānā ʻana a me ka unuhi ʻana i nā papa mai kā mākou JAR layered, hoʻohana mākou i ka waiwai ʻōnaehana -Djarmode=layertoolsno ka hoomaka ana spring-boot-jarmode-layertoolsJAR ma kahi o ka noi:
ʻO ka holo ʻana i kēia kauoha e hoʻopuka i kahi huahana i loaʻa nā koho kauoha i loaʻa:
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
Hōʻike ka huahana i nā kauoha list, extractи helpс helpe lilo i mea paʻamau. E holo kāua i ke kauoha me listkoho:
java -Djarmode=layertools -jar target/usersignup-0.0.1-SNAPSHOT.jar list
ʻIke mākou i kahi papa inoa o nā hilinaʻi hiki ke hoʻohui ʻia ma ke ʻano he papa.
Nā papa ma ka paʻamau:
inoa papa
Nā mea
dependencies
kekahi hilinaʻi nona ka mana ʻaʻole i loaʻa iā SNAPSHOT
spring-boot-loader
Nā Papa Loader JAR
snapshot-dependencies
kekahi hilinaʻi nona ka mana i loaʻa iā SNAPSHOT
application
nā papa noi a me nā kumuwaiwai
Ua wehewehe ʻia nā papa ma layers.idxfaila i ke kauoha e hoʻohui ʻia i ke kiʻi Docker. Hoʻopili ʻia kēia mau papa i loko o ka mea hoʻokipa ma hope o ka loaʻa mua ʻana no ka mea ʻaʻole lākou e loli. Hoʻoiho wale ʻia ka papa noi hou i ka host, ʻoi aku ka wikiwiki ma muli o ka liʻiliʻi .
Ke kūkulu ʻana i kiʻi me nā hilinaʻi i unuhi ʻia i loko o nā papa ʻokoʻa
E kūkulu mākou i ke kiʻi hope i ʻelua mau ʻanuʻu me ka hoʻohana ʻana i kahi ala i kapa ʻia hui nui-pae . Ma ka hana mua e unuhi mākou i nā hilinaʻi a ma ka ʻanuʻu ʻelua e kope mākou i nā hilinaʻi i unuhi ʻia i ke kiʻi hope.
E hoʻololi i kā mākou Dockerfile no kahi kūkulu ʻana i nā pae he nui:
# 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"]
Mālama mākou i kēia hoʻonohonoho i kahi faila ʻokoʻa - Dockerfile2.
Kūkulu mākou i ke kiʻi Docker me ke kauoha:
docker build -f Dockerfile2 -t usersignup:v1 .
Ma hope o ka hoʻokō ʻana i kēia kauoha, loaʻa iā mākou ka hopena aʻe:
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
Hiki iā mākou ke ʻike ua hana ʻia ke kiʻi Docker me kahi ID kiʻi a laila kau inoa ʻia.
ʻO ka hope, holo mākou i ke kauoha Dive e like me ka wā ma mua e nānā i nā papa i loko o ke kiʻi Docker i hana ʻia. Hiki iā mākou ke hāʻawi i kahi kiʻi kiʻi a i ʻole hōʻailona ma ke ʻano he hoʻokomo i ke kauoha Dive:
dive userssignup:v1
E like me kāu e ʻike ai mai ka hoʻopuka ʻana, ʻo 11 KB wale nō ka papa i loaʻa i ka noi a ua hūnā ʻia nā mea hilinaʻi i nā papa ʻokoʻa.
Wehe i nā hilinaʻi kūloko ma nā papa ʻokoʻa
Hiki iā mākou ke hōʻemi hou i ka nui o ka papa noi ma ka unuhi ʻana i kekahi o kā mākou mau hilinaʻi maʻamau i kahi papa ʻokoʻa ma mua o ka hoʻopili ʻana iā lākou me ka noi ma ka haʻi ʻana iā lākou i loko. ymlfile like i kapa ʻia layers.idx:
Ma keia waihona layers.idxua hoʻohui mākou i kahi hilinaʻi maʻamau i kapa ʻia, io.myorgloaʻa nā hilinaʻi o ka hui i kiʻi ʻia mai kahi waihona waihona.
hopena
Ma kēia ʻatikala, ua nānā mākou i ka hoʻohana ʻana i Cloud-Native Buildpacks e kūkulu i kahi kiʻi pahu mai ke kumu. He mea ʻokoʻa kēia i ka hoʻohana ʻana iā Docker e hana i kahi kiʻi pahu ma ke ʻano maʻamau: ʻo ka mea mua, hana ʻia kahi faila JAR hiki ke hoʻokō ʻia a laila hoʻopili ʻia i loko o kahi kiʻi pahu ma ke kuhikuhi ʻana i nā kuhikuhi i ka Dockerfile.
Ua nānā pū mākou i ka hoʻomaikaʻi ʻana i kā mākou pahu ma ka hoʻokomo ʻana i kahi hiʻohiʻona layering e unuhi i nā hilinaʻi i nā ʻāpana ʻokoʻa i hūnā ʻia ma ka host a ua hoʻouka ʻia kahi papa noi lahilahi i ka manawa hoʻonohonoho i nā mīkini hoʻokō o ka ipu.
Hiki iā ʻoe ke loaʻa nā code kumu a pau i hoʻohana ʻia ma ka ʻatikala ma Github .
Kuhikuhi Kauoha
Eia kahi papa kuhikuhi wikiwiki o nā kauoha a mākou i hoʻohana ai ma kēia ʻatikala.
Ka hoʻomaʻemaʻe ʻana i ka pōʻaiapili:
docker system prune -a
Ke hana nei i kahi kiʻi pahu e hoʻohana ana i kahi faila Docker:
docker build -f <Docker file name> -t <tag> .
E kūkulu i ke kiʻi pahu mai ke kumu (me ka ʻole Dockerfile):
mvn spring-boot:build-image
Nānā i nā papa hilinaʻi. Ma mua o ke kūkulu ʻana i ka faila jar app, e hōʻoia i ka hiki ʻana o ka hiʻohiʻona layering i ka spring-boot-maven-plugin:
java -Djarmode=layertools -jar application.jar list
Wehe i nā papa hilinaʻi. Ma mua o ke kūkulu ʻana i ka faila jar app, e hōʻoia i ka hiki ʻana o ka hiʻohiʻona layering i ka spring-boot-maven-plugin: