Ho theha Litšoantšo tsa Optimized Docker bakeng sa Sesebelisoa sa Boot Boot

Li-container e se e le mokhoa o ratoang oa ho paka sesebelisoa ka lisebelisoa tsohle tsa eona tsa software le sistimi ea ts'ebetso ebe o li isa libakeng tse fapaneng.

Sengoliloeng sena se bua ka mekhoa e fapaneng ea ho kenya ts'ebeliso ea Spring Boot:

  • ho theha setšoantšo sa Docker ho sebelisa faele ea Docker,
  • ho theha setšoantšo sa OCI ho tsoa mohloling o sebelisa Cloud-Native Buildpack,
  • le ho ntlafatsa setšoantšo sa nako ea nako ka ho arola likarolo tsa JAR ka mekhahlelo e fapaneng ho sebelisa lisebelisoa tse nang le mekhahlelo e mengata.

 Khoutu Mohlala

Sengoliloeng sena se tsamaisana le mohlala oa khoutu ea ho sebetsa ho GitHub .

Mareo a setshelo

Re tla qala ka poleloana ea sets'oants'o e sebelisitsoeng sengolong:

  • Setšoantšo sa setshelo: faele ea sebopeho se itseng. Re tla fetolela kopo ea rona hore e be setšoantšo sa setshelo ka ho sebelisa sesebelisoa sa ho aha.
  • Setshelo: Mohlala o ka phethisoang oa setšoantšo sa setshelo.
  • Enjene ea setshelo: Ts'ebetso ea daemon e ikarabellang bakeng sa ho tsamaisa setshelo.
  • Moamoheli oa setshelo: Khomphuta e amohelang moo enjene ea setshelo e sebetsang ho eona.
  • Ngoliso ea setshelo: Sebaka se akaretsang se sebelisoang ho phatlalatsa le ho aba setšoantšo sa setshelo.
  • OCI e tloaelehilengOpen Container Initiative (OCI) ke mokhoa o bobebe, o bulehileng oa puso o thehiloeng ka har'a Linux Foundation. The OCI Image Specification e hlalosa litekanyetso tsa indasteri bakeng sa litšoantšo tsa setshelo le liforomo tsa nako ea ho sebetsa ho netefatsa hore lienjineri tsohle tsa lijana li ka tsamaisa litšoantšo tsa setshelo tse entsoeng ke sesebelisoa leha e le sefe sa ho haha.

Ho kenya kopo, re thatela kopo ea rona ka setšoantšo sa setshelo ebe re phatlalatsa setšoantšo seo ho ngoliso e arolelanoang. Nako ea ho sebetsa ea setshelo e lata setšoantšo sena ho tsoa ho registry, ea se manolla, ebe se tsamaisa sesebelisoa ka har'a sona.

Mofuta oa 2.3 oa Spring Boot o fana ka li-plugins bakeng sa ho etsa litšoantšo tsa OCI.

Docker ke ts'ebetsong ea lijana tse sebelisoang haholo, 'me re sebelisa Docker mehlaleng ea rona, kahoo litšupiso tsohle tse latelang tsa sengoloa sengolong sena li tla bua ka Docker.

Ho haha ​​setšoantšo sa setshelo ka mokhoa oa setso

Ho theha litšoantšo tsa Docker bakeng sa lits'ebetso tsa Spring Boot ho bonolo haholo ka ho kenyelletsa litaelo tse 'maloa faeleng ea Docker.

Re qala ka ho theha faele ea JAR e sebetsang, 'me, e le karolo ea litaelo tsa faele ea Docker, re kopitsa faele ea JAR e sebetsang ka holim'a setšoantšo sa JRE ka mor'a ho sebelisa litlhophiso tse hlokahalang.

Ha re theheng kopo ea rona ea Selemo ka Qalong ea selemo ka ho itshetleha weblombokи actuator. Re boetse re eketsa taolo ea ho phomola ho fana ka API GETmokhoa.

Ho theha Dockerfile

Ebe re kenya kopo ena ka ho eketsa Dockerfile:

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

Faele ea rona ea Docker e na le setšoantšo sa motheo se tsoang ho adoptopenjdk, ka holim'a eona re kopitsa faele ea rona ea JAR ebe re bula boema-kepe, 8080e tla mamela dikopo.

Ho aha kopo

Pele o hloka ho etsa kopo o sebelisa Maven kapa Gradle. Mona re sebelisa Maven:

mvn clean package

Sena se theha faele ea JAR e sebetsang bakeng sa ts'ebeliso. Re hloka ho fetolela JAR ena e sebetsang hore e be setšoantšo sa Docker ho sebetsa enjene ea Docker.

Ho theha setšoantšo sa setshelo

Ebe re kenya faele ena e sebetsang ea JAR setšoantšong sa Docker ka ho tsamaisa taelo docker buildho tsoa bukeng ea motso oa projeke e nang le Dockerfile e entsoeng pejana:

docker build  -t usersignup:v1 .

Re ka bona setšoantšo sa rona lenaneng re sebelisa taelo:

docker images 

Sephetho sa taelo e ka holimo se kenyelletsa setšoantšo sa rona usersignuphammoho le setšoantšo sa motheo, adoptopenjdke boletsoeng faeleng ea rona ea Docker.

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

Sheba likarolo ka har'a setšoantšo sa sets'oants'o

Ha re shebeng qubu ea lera ka har'a setšoantšo. Re tla sebelisa sesebelisoa  qoela ho sheba lihlopha tsena:

dive usersignup:v1

Mona ke karolo ea tlhahiso e tsoang ho taelo ea Dive: 

Ho theha Litšoantšo tsa Optimized Docker bakeng sa Sesebelisoa sa Boot Boot

Joalokaha re bona, lera la kopo le etsa karolo ea bohlokoa ea boholo ba setšoantšo. Re batla ho fokotsa boholo ba lera lena likarolong tse latelang e le karolo ea ntlafatso ea rona.

Ho theha setšoantšo sa setshelo ho sebelisa Buildpack

Liphutheloana tsa kopano (Li-buildpacks) ke lentsoe le akaretsang le sebelisoang ke Platform e fapaneng e le linyehelo tsa Tšebeletso (PAAS) ho etsa setšoantšo sa setshelo ho tloha khoutu ea mohloli. E thehiloe ke Heroku ka 2011 mme esale e amoheloa ke Cloud Foundry, Google App Engine, Gitlab, Knative le ba bang ba 'maloa.

Ho theha Litšoantšo tsa Optimized Docker bakeng sa Sesebelisoa sa Boot Boot

Molemo oa ho haha ​​​​liphutheloana tsa leru

O mong oa melemo ea mantlha ea ho sebelisa Buildpack ho etsa litšoantšo ke hore Liphetoho tsa tlhophiso ea litšoantšo li ka laoloa bohareng (sehahi) 'me tsa phatlalatsoa lits'ebetsong tsohle tse sebelisang sehahi.

Liphutheloana tsa kaho li ne li kopantsoe ka thata sethaleng. Cloud-Native Buildpacks e fana ka maemo ho li-platform ka ho ts'ehetsa sebopeho sa setšoantšo sa OCI, se netefatsang hore setšoantšo se ka tsamaisoa ke enjene ea Docker.

Ho sebelisa plugin ea Spring Boot

Plugin ea Spring Boot e haha ​​​​lits'oants'o tsa OCI ho tsoa mohloling o sebelisa Buildpack. Litšoantšo li entsoe ho sebelisoa bootBuildImagemesebetsi (Gradle) kapa spring-boot:build-imagetargets (Maven) le ho kenya Docker ea lehae.

Re ka etsa lebitso la setšoantšo se hlokahalang ho sutumelletsa ho ngoliso ea Docker ka ho hlakisa lebitso ho 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>

Ha re sebeliseng Maven ho e etsa build-imagelipakane tsa ho theha kopo le ho theha setšoantšo sa setshelo. Ha re sebelise li-Dockerfiles ka nako ena.

mvn spring-boot:build-image

Sephetho e tla ba ntho e kang ena:

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

Ho tswa ho tlhahiso re bona seo paketo Cloud-Native buildpacke sebelisitsoeng ho etsa setšoantšo sa OCI se sebetsang. Joalo ka pele, re ka bona setšoantšo se thathamisitsoeng e le setšoantšo sa Docker ka ho tsamaisa taelo:

docker images 

Qetello:

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

Ho etsa setšoantšo sa setshelo ho sebelisa Jib

Jib ke plugin ea ho theha litšoantšo ho tsoa ho Google e fanang ka mokhoa o mong oa ho theha setšoantšo sa setshelo ho tsoa khoutu ea mohloli.

Ho a hlophisa jib-maven-pluginka pom.xml:

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

Ka mor'a moo, re tsamaisa plugin ea Jib re sebelisa taelo ea Maven ho aha kopo le ho etsa setšoantšo sa setshelo. Joalo ka pele, ha re sebelise lifaele tsa Docker mona:

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

Kamora ho etsa taelo e kaholimo ea Maven, re fumana tlhahiso e latelang:

[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

Sephetho se bonts'a hore setšoantšo sa setshelo se entsoe mme se behiloe ho registry.

Litšusumetso le mekhoa ea ho theha litšoantšo tse ntlafalitsoeng

Re na le mabaka a mabeli a mantlha a ho ntlafatsa:

  • Tlhahiso: Ka har'a sistimi ea 'mino oa sets'oants'o, sets'oants'o sa setshelo se tla khutlisoa ho tsoa ho ngoliso ea litšoantšo ho ea ho moamoheli ea tsamaisang enjene ea setshelo. Mokhoa ona o bitsoa moralo. Ho hula litšoantšo tse kholo ho tsoa ho registry ho fella ka nako e telele ea ho hlophisa lits'ebetsong tsa 'mino oa lijana le linako tse telele tsa ho aha liphaepheng tsa CI.
  • Tshireletso: Litšoantšo tse kholo li boetse li na le sebaka se seholo sa bofokoli.

Setšoantšo sa Docker se na le letoto la likarolo, tseo e 'ngoe le e' ngoe e emelang litaelo ho Dockerfile ea rona. Lera le leng le le leng le emela karoloana ea liphetoho lera le ka tlase. Ha re hula setšoantšo sa Docker ho tsoa ho registry, se huloa ka mekhahlelo ebe se ts'oaroa ho moamoheli.

Spring Boot e sebelisoa "mafura a JAR" ka joalo ka mokhoa oa kamehla oa ho paka. Ha re sheba JAR e teteaneng, re bona hore ts'ebeliso e etsa karolo e nyane haholo ea JAR kaofela. Ena ke karolo e fetohang hangata. Karolo e setseng e na le litšepeho tsa Moralo oa Selemo.

Foromo ea ntlafatso e mabapi le ho arola ts'ebeliso maemong a fapaneng le ho its'etleha ka Moralo oa Selemo.

The dependent layer, e etsang bongata ba faele e teteaneng ea JAR, e jarollotsoe hang feela ebe e bolokoa ho sistimi ea moamoheli.

Ke karolo e nyane feela ea ts'ebeliso e huloang nakong ea liapdeite tsa ts'ebeliso le kemiso ea setshelo. joalokaha ho bontšitsoe setšoantšong sena:

Ho theha Litšoantšo tsa Optimized Docker bakeng sa Sesebelisoa sa Boot Boot

Likarolong tse latelang, re tla sheba mokhoa oa ho etsa litšoantšo tsena tse ntlafalitsoeng bakeng sa sesebelisoa sa Spring Boot.

Ho theha Sets'oants'o sa Sets'oants'o se ntlafalitsoeng bakeng sa Kopo ea Boot ea Spring U sebelisa Buildpack

Spring Boot 2.3 e ts'ehetsa ho beha likarolo ka ho ntša likarolo tsa faele e teteaneng ea JAR ka likarolo tse arohaneng. Karolo ea layering e holofalitsoe ke kamehla mme e tlameha ho nolofalloa ka ho hlaka ho sebelisoa plugin ea Spring Boot Maven:

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

Re tla sebelisa tlhophiso ena ho aha setšoantšo sa setshelo sa rona pele ka Buildpack ebe ka Docker likarolong tse latelang.

Ha re qaleng build-imageSepheo sa Maven bakeng sa ho theha setšoantšo sa setshelo:

mvn spring-boot:build-image

Haeba re matha Dive ho bona likarolo setšoantšong se hlahisoang, re ka bona hore karolo ea kopo (e hlalositsoeng ka bofubelu) e nyane haholo ka mefuta ea kilobyte ha e bapisoa le eo re e fumaneng ka mokhoa oa mafura oa JAR:

Ho theha Litšoantšo tsa Optimized Docker bakeng sa Sesebelisoa sa Boot Boot

Ho theha Sets'oants'o sa Sets'oants'o se ntlafalitsoeng bakeng sa Kopo ea Boot ea Spring U sebelisa Docker

Sebakeng sa ho sebelisa plugin ea Maven kapa Gradle, re ka boela ra theha setšoantšo sa Docker JAR se khabisitsoeng ka faele ea Docker.

Ha re sebelisa Docker, re hloka ho etsa mehato e 'meli e meng ea ho ntša likarolo le ho li kopitsa setšoantšong sa ho qetela.

Likahare tsa JAR e hlahisitsoeng kamora ho aha o sebelisa Maven e nang le layering e nolofalitsoeng li tla shebahala tjena:

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

Sephetho se bonts'a JAR e eketsehileng e bitsoang spring-boot-jarmode-layertoolsи layersfle.idxfaele. Faele ena e eketsehileng ea JAR e fana ka bokhoni ba ho sebetsana le maemo, joalo ka ha ho hlalositsoe karolong e latelang.

Ho ntša litšepe holim'a lihlopha tse ikemetseng

Ho sheba le ho ntša lilae ho JAR ea rona, re sebelisa thepa ea sistimi -Djarmode=layertoolsbakeng sa ho qala spring-boot-jarmode-layertoolsJAR sebakeng sa ts'ebeliso:

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

Ho tsamaisa taelo ena ho hlahisa tlhahiso e nang le likhetho tse fumanehang tsa taelo:

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

Sephetho se bonts'a litaelo listextractи helpс helpe be ea kamehla. Ha re tsamaiseng taelo ka listkhetho:

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

Re bona lethathamo la lintho tse itšetlehileng ka tsona tse ka kenyelletsoang e le lihlopha.

Mekhahlelo ea kamehla:

Lebitso la lera

Tse ka hare

dependencies

leha e le efe eo phetolelo ea eona e se nang SNAPSHOT

spring-boot-loader

Lihlopha tsa JAR Loader

snapshot-dependencies

efe kapa efe eo mofuta oa eona o nang le SNAPSHOT

application

litlelase tsa kopo le lisebelisoa

Melao e hlalositsoe ka hare layers.idxfaele ka tatellano eo li lokelang ho eketsoa ho setšoantšo sa Docker. Likarolo tsena li bolokiloe ho moamoheli ka mor'a ho khutlisa pele hobane ha li fetohe. Ke feela sebaka se ntlafalitsoeng sa kopo se jarollotsoeng ho moamoheli, e potlakileng ka lebaka la boholo bo fokotsehileng .

Ho aha setšoantšo se nang le litšepe tse ntšitsoeng ka mekhahlelo e fapaneng

Re tla haha ​​setšoantšo sa ho qetela ka mekhahlelo e 'meli re sebelisa mokhoa o bitsoang kopano ya mekhahlelo e mengata . Mohato oa pele re tla ntša litšepe 'me mohatong oa bobeli re tla kopitsa litšepiso tse nkiloeng setšoantšong sa ho qetela.

Ha re fetoleng Dockerfile ea rona bakeng sa moaho oa mekhahlelo e mengata:

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

Re boloka tlhophiso ena faeleng e fapaneng - Dockerfile2.

Re theha setšoantšo sa Docker ho sebelisa taelo:

docker build -f Dockerfile2 -t usersignup:v1 .

Ka mor'a ho tsamaisa taelo ena re fumana tlhahiso e latelang:

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

Re ka bona hore setšoantšo sa Docker se entsoe ka ID ea setšoantšo ebe se tšoauoa.

Qetellong, re tsamaisa taelo ea Dive joalo ka pele ho hlahloba likarolo tse ka hare ho setšoantšo sa Docker se hlahisitsoeng. Re ka fana ka ID ea setšoantšo kapa tag e le kenyelletso ho taelo ea Dive:

dive userssignup:v1

Joalo ka ha u bona sephethong, lera le nang le ts'ebeliso e se e le 11 KB feela, 'me litšepe li bolokiloe ka mekhahlelo e fapaneng. 

Ho theha Litšoantšo tsa Optimized Docker bakeng sa Sesebelisoa sa Boot Boot

Ho ntša litšepe ka hare ho lihlopha tse ikemetseng

Re ka tsoela pele ho fokotsa boholo ba sekhahla sa ts'ebeliso ka ho hula litšepiso life kapa life tsa rona sebakeng se arohaneng ho fapana le ho li paka ka ts'ebeliso ka ho li phatlalatsa. ymlfaele e tšoanang e bitsoang 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/"

Faeleng ena layers.idxre ekelitse ho itšetleha ka tloaelo ho bitsoang, io.myorge nang le litšepiso tsa mokhatlo tse nkiloeng polokelong e arolelanoang.

fihlela qeto e

Sehloohong sena, re shebile ho sebelisa Cloud-Native Buildpacks ho aha setšoantšo sa setshelo ka kotloloho ho tsoa ho khoutu ea mohloli. Ena ke mokhoa o mong oa ho sebelisa Docker ho etsa setšoantšo sa setshelo ka tsela e tloaelehileng: qala ka ho theha faele e tenya e sebetsang ea JAR ebe o e kenya setšoantšong sa setshelo ka ho hlakisa litaelo faeleng ea Docker.

Re boetse re shebile ho ntlafatsa sets'oants'o sa rona ka ho etsa hore karolo ea layering e huleleng litšepe ka likarolo tse arohaneng tse bolokiloeng ho moamoheli mme karolo e tšesaane ea kopo e kenngoe ka nako ea ho hlophisa lienjineng tsa ts'ebetso ea setshelo.

U ka fumana khoutu eohle ea mohloli e sebelisitsoeng sengolong ho Github .

Referense ea litaelo

Mona ke tlhaloso e potlakileng ea litaelo tseo re li sebelisitseng sehloohong sena.

Ho hlakola litaba:

docker system prune -a

Ho theha setšoantšo sa setshelo ho sebelisa faele ea Docker:

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

Re theha setšoantšo sa setshelo ho tsoa khoutu ea mohloli (ntle le Dockerfile):

mvn spring-boot:build-image

Sheba lihlopha tse itšetlehileng ka tsona. Pele o theha faele ea JAR ea kopo, etsa bonnete ba hore karolo ea layering e nolofalitsoe ho spring-boot-maven-plugin:

java -Djarmode=layertools -jar application.jar list

Ho ntša likarolo tsa ho itšetleha. Pele o theha faele ea JAR ea kopo, etsa bonnete ba hore karolo ea layering e nolofalitsoe ho spring-boot-maven-plugin:

 java -Djarmode=layertools -jar application.jar extract

Sheba lenane la litšoantšo tsa setshelo

docker images

Sheba ka ho le letšehali ka har'a setšoantšo sa setshelo (etsa bonnete ba hore sesebelisoa sa ho qoela se kentsoe):

dive <image ID or image tag>

Source: www.habr.com