Mamorona sary Docker Optimized ho an'ny fampiharana Lohataona

Ny kaontenera dia lasa fitaovana tiany indrindra amin'ny famenoana rindranasa miaraka amin'ny rindrambaiko sy rafitra fiasa rehetra miankina aminy ary avy eo dia mandefa azy ireo amin'ny tontolo samihafa.

Ity lahatsoratra ity dia mirakitra fomba samihafa amin'ny fametrahana ny fampiharana Spring Boot:

  • mamorona sary Docker mampiasa rakitra Docker,
  • mamorona sary OCI avy amin'ny loharano mampiasa Cloud-Native Buildpack,
  • ary fanatsarana ny sary amin'ny fotoana fandehanana amin'ny fanasarahana ny ampahany amin'ny JAR ho sosona samihafa amin'ny fampiasana fitaovana maromaro.

 Ohatra Code

Ity lahatsoratra ity dia miaraka amin'ny ohatra kaody miasa amin'ny GitHub .

Terminologie container

Hanomboka amin'ny teny hoe container ampiasaina amin'ny lahatsoratra isika:

  • Sary fitoeran-javatra: rakitra manana endrika manokana. Hanova ny fampiharanay ho sarin'ny fitoeran-javatra izahay amin'ny alàlan'ny fampandehanana ny fitaovana fananganana.
  • fitoeran-javatra: Ohatra azo tanterahina amin'ny sary fitoeran-javatra.
  • maotera kaontenera: Ny fizotry ny daemon tompon'andraikitra amin'ny fampandehanana ny kaontenera.
  • mpampiantrano kaontenera: Solosaina mpampiantrano izay iasan'ny maotera fitoeran-javatra.
  • Rejistra kaontenera: Ny toerana ankapobeny ampiasaina hamoahana sy hizarana ny sary fitoeran-javatra.
  • OCI standardOpen Container Initiative (OCI) dia rafitra fitantanana maivana sy misokatra miforona ao anatin'ny Linux Foundation. Ny OCI Image Specification dia mamaritra ny fenitry ny indostria ho an'ny sarin'ny kaontenera sy ny endrika fampandehanana mba hahazoana antoka fa ny maotera container rehetra dia afaka mitondra sary fitoeran-javatra noforonin'ny fitaovana fananganana rehetra.

Mba hamehezana ny fampiharana, dia fonosinay ao anaty sarin'ny fitoeran-javatra ny fampiharana anay ary avoakanay amin'ny rejisitra iombonana izany sary izany. Ny fampandehanana ny container dia maka ity sary ity ao amin'ny rejisitra, mamoha azy ary mampandeha ny fampiharana ao anatiny.

Ny dikan-teny 2.3 an'ny Spring Boot dia manome plugins hamoronana sary OCI.

Docker no fampiharana container fampiasa matetika indrindra, ary mampiasa Docker amin'ny ohatra ataontsika isika, ka ny fanondroana container manaraka ato amin'ity lahatsoratra ity dia manondro an'i Docker.

Manangana sary kaontenera amin'ny fomba mahazatra

Ny famoronana sary Docker ho an'ny rindranasa Spring Boot dia tena mora amin'ny fampidirana torolàlana vitsivitsy amin'ny rakitra Docker.

Mamorona rakitra JAR azo tanterahana aloha izahay ary, ao anatin'ny torolàlana momba ny docker Docker, dia mandika ny rakitra JAR azo tanterahana eo an-tampon'ny sary JRE fototra rehefa avy nampihatra ny fanovana ilaina.

Andao hamorona ny fampiharana Lohataona amin'ny Lohataona Initializr miaraka amin'ny fiankinan-doha weblombokи actuator. Manampy mpifehy fitsaharana ihany koa izahay mba hanomezana API GETfomba.

Mamorona Dockerfile

Ampidirinay ao anaty container ity fampiharana ity avy eo Dockerfile:

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

Ny rakitra Docker dia misy sary fototra avy amin'ny adoptopenjdk, eo amboniny dia mandika ny rakitra JAR izahay ary sokafy ny seranan-tsambo, 8080izay hihaino ny fangatahana.

Manorina ny fampiharana

Voalohany dia mila mamorona fampiharana mampiasa Maven na Gradle ianao. Eto izahay dia mampiasa Maven:

mvn clean package

Izany dia mamorona rakitra JAR azo tanterahana ho an'ny fampiharana. Mila mamadika ity JAR azo tanterahana ity ho sary Docker isika mba handehanana amin'ny motera Docker.

Mamorona sary container

Avy eo dia apetrakay ao amin'ny sary Docker ity rakitra JAR ity amin'ny alàlan'ny fampandehanana ny baiko docker buildavy amin'ny lahatahiry fakan'ny tetikasa misy ny Dockerfile noforonina teo aloha:

docker build  -t usersignup:v1 .

Hitantsika ao amin'ny lisitra ny sarinay amin'ny fampiasana ny baiko:

docker images 

Ny famoahana ny baiko etsy ambony dia ahitana ny sarintsika usersignupmiaraka amin'ny sary fototra, adoptopenjdkvoatondro ao amin'ny rakitra Docker.

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

Jereo ny sosona ao anaty sary fitoeran-javatra

Andeha hojerentsika ny fitambaran'ny sosona ao anatin'ilay sary. Hampiasaintsika fitaovana  manao antsitrika mba hijerena ireto sosona ireto:

dive usersignup:v1

Ity ny ampahany amin'ny vokatra avy amin'ny baiko Dive: 

Mamorona sary Docker Optimized ho an'ny fampiharana Lohataona

Araka ny hitantsika, ny sosona fampiharana dia mahaforona ampahany lehibe amin'ny haben'ny sary. Te hampihena ny haben'ity sosona ity izahay amin'ny fizarana manaraka ho ampahany amin'ny fanatsarana ataonay.

Mamorona sary fitoeran-javatra mampiasa Buildpack

Fonosana fivoriambe (Buildpacks) dia teny ankapobe ampiasain'ny tolotra isan-karazany ho an'ny serivisy (PAAS) mba hamoronana sary fitoeran-javatra avy amin'ny kaody loharano. Navoakan'i Heroku tamin'ny taona 2011 izy io ary noraisin'ny Cloud Foundry, Google App Engine, Gitlab, Knative ary maro hafa.

Mamorona sary Docker Optimized ho an'ny fampiharana Lohataona

Ny tombony amin'ny fonosana fananganana rahona

Ny iray amin'ireo tombony lehibe amin'ny fampiasana Buildpack hamoronana sary dia izany Ny fiovan'ny fanefena sary dia azo fehezina eo afovoany (mpanorina) ary aparitaka amin'ny fampiharana rehetra mampiasa mpanamboatra.

Nifamatotra mafy tamin'ny lampihazo ireo fonosana fananganana. Cloud-Native Buildpacks dia manome manara-penitra manerana ny sehatra amin'ny alàlan'ny fanohanana ny endrika sary OCI, izay miantoka fa ny motera Docker dia afaka mitantana ny sary.

Mampiasa plugin Spring Boot

Ny plugin Spring Boot dia manangana sary OCI avy amin'ny loharano mampiasa Buildpack. Ny sary dia noforonina amin'ny fampiasana bootBuildImageasa (Gradle) na spring-boot:build-imagetanjona (Maven) sy fametrahana Docker eo an-toerana.

Azontsika atao ny mampifanaraka ny anaran'ny sary ilaina hanosehana ny rejisitra Docker amin'ny alàlan'ny famaritana ny anarana ao 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>

Andao hampiasa Maven hanaovana izany build-imagetanjona amin'ny famoronana fampiharana sy famoronana sary fitoeran-javatra. Tsy mampiasa Dockerfiles izahay amin'izao fotoana izao.

mvn spring-boot:build-image

Ny vokatra dia ho toy izao:

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

Avy amin'ny vokatra dia hitantsika izany paketo Cloud-Native buildpackampiasaina hamoronana sary OCI miasa. Toy ny teo aloha dia afaka mahita ny sary voatanisa ho sary Docker isika amin'ny alàlan'ny baiko:

docker images 

famaranana:

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

Mamorona sary fitoeran-javatra mampiasa Jib

Jib dia plugin famoronana sary avy amin'ny Google izay manome fomba hafa amin'ny famoronana sary fitoeran-javatra avy amin'ny kaody loharano.

Mampiendrika jib-maven-pluginao amin'ny pom.xml:

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

Manaraka, mihazakazaka ny Jib plugin izahay amin'ny fampiasana ny baiko Maven hananganana ny rindranasa ary hamorona sary misy container. Toy ny teo aloha, tsy mampiasa rakitra Docker eto izahay:

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

Aorian'ny fanatanterahana ny baiko Maven etsy ambony dia mahazo ity vokatra manaraka ity isika:

[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

Ny vokatra dia mampiseho fa ny sary kaontenera dia noforonina ary napetraka tao amin'ny rejisitra.

Motivation sy teknika hamoronana sary optimized

Manana antony roa lehibe amin'ny fanatsarana isika:

  • vokatra: Ao amin'ny rafitra orkestra kaontenera, misy sarin'ny kaontenera alaina avy amin'ny rejisitry ny sary mankany amin'ny mpampiantrano mitantana ny motera container. Ity dingana ity dia antsoina hoe drafitra. Ny fisintonana sary lehibe avy amin'ny rejisitra dia miteraka fotoana maharitra amin'ny rafitra orkestra kaontenera ary fotoana lava fanamboarana amin'ny fantsona CI.
  • fiarovana: Ny sary lehibe kokoa dia manana faritra lehibe kokoa ho an'ny vulnerability.

Ny sarin'ny Docker dia misy sosona maromaro, ny tsirairay amin'izy ireo dia maneho torolàlana ao amin'ny Dockerfile. Ny sosona tsirairay dia maneho delta amin'ny fiovan'ny sosona fototra. Rehefa misintona sary Docker avy amin'ny rejisitra isika, dia sintonina amin'ny sosona ary voatahiry ao amin'ny mpampiantrano.

Mampiasa ny Spring Boot "JAR matavy" in ho toy ny endrika fonosana default. Rehefa mijery ny JAR matevina isika dia mahita fa ny fampiharana dia mahaforona ampahany kely amin'ny JAR manontolo. Io no ampahany miova matetika. Ny ambiny dia misy ny fiankinan'ny Spring Framework.

Ny raikipohy fanatsarana dia mifantoka amin'ny fitokanana ny fampiharana amin'ny ambaratonga miavaka amin'ny fiankinan'ny Spring Framework.

Ny sosona fiankinan-doha, izay mahaforona ny ampahany betsaka amin'ny rakitra JAR matevina, dia alaina indray mandeha ary voatahiry ao amin'ny rafitra mpampiantrano.

Sosona manify amin'ny fampiharana ihany no sintonina mandritra ny fanavaozana ny fampiharana sy ny fandaharam-potoanan'ny fitoeran-javatra. araka ny aseho amin'ity kisary ity:

Mamorona sary Docker Optimized ho an'ny fampiharana Lohataona

Amin'ireto fizarana manaraka ireto dia hojerentsika ny fomba hamoronana ireo sary namboarina ho an'ny fampiharana Spring Boot.

Mamorona sarin'ny kaontenera optimisé ho an'ny fampiharana Lohataona amin'ny fampiasana Buildpack

Lohataona Boot 2.3 dia manohana ny sosona amin'ny alalan'ny fanesorana ny ampahany amin'ny rakitra JAR matevina ho sosona misaraka. Ny endri-javatra layering dia kilemaina amin'ny alàlan'ny default ary tsy maintsy alefa mazava amin'ny alàlan'ny plugin Spring Boot Maven:

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

Hampiasa an'io fanamafisana io izahay mba hananganana ny sarin'ny container voalohany miaraka amin'ny Buildpack ary avy eo miaraka amin'i Docker amin'ireto fizarana manaraka ireto.

Andao hanomboka build-imageTanjona maven hamorona sary fitoeran-javatra:

mvn spring-boot:build-image

Raha mihazakazaka Dive isika mba hijerena ireo sosona amin'ny sary vokarina, dia hitantsika fa ny sosona fampiharana (voasoritra amin'ny mena) dia kely kokoa amin'ny kilaobyte raha oharina amin'ny zavatra azonay tamin'ny fampiasana ny endrika JAR matavy:

Mamorona sary Docker Optimized ho an'ny fampiharana Lohataona

Mamorona sarin'ny kaontenera optimisé ho an'ny fampiharana Lohataona amin'ny fampiasana Docker

Raha tokony hampiasa plugin Maven na Gradle isika dia afaka mamorona sary Docker JAR misy sosona miaraka amin'ny rakitra Docker.

Rehefa mampiasa Docker isika dia mila manao dingana roa fanampiny hanesorana ireo sosona ary handika azy ireo amin'ny sary farany.

Ny votoatin'ny JAR vokarina aorian'ny fananganana mampiasa Maven miaraka amin'ny layering dia ho toy izao:

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

Ny vokatra dia mampiseho JAR fanampiny nomena anarana spring-boot-jarmode-layertoolsи layersfle.idxrakitra. Ity rakitra JAR fanampiny ity dia manome fahaiza-manao fanodinana sosona, araka ny voalaza ao amin'ny fizarana manaraka.

Fanalana fiankinana amin'ny sosona tsirairay

Raha hijery sy hanesorana ireo sosona avy amin'ny JAR misy sosona, dia mampiasa ny fananan'ny rafitra izahay -Djarmode=layertoolsho fanombohana spring-boot-jarmode-layertoolsJAR fa tsy fampiharana:

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

Ny fampandehanana ity baiko ity dia miteraka vokatra misy ny safidy baiko misy:

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

Ny vokatra dia mampiseho ny baiko listextractи helpс helpho default. Andeha hataontsika ny baiko miaraka amin'ny listsafidy:

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

Mahita lisitr'ireo fiankinana azo ampiana ho sosona izahay.

Sosona mahazatra:

Anaran'ny sosona

afa-po

dependencies

ny fiankinan-doha izay tsy misy SNAPSHOT ny dikan-teny

spring-boot-loader

Ny kilasy JAR Loader

snapshot-dependencies

izay fiankinan-doha izay misy ny dikan-teny misy SNAPSHOT

application

kilasy fampiharana sy loharanon-karena

Ny sosona dia voafaritra amin'ny layers.idxrakitra amin'ny filaharana tokony hampidirina amin'ny sary Docker. Ireo sosona ireo dia voatahiry ao amin'ny mpampiantrano aorian'ny fakana voalohany satria tsy miova izy ireo. Ny sosona fampiharana nohavaozina ihany no alaina any amin'ny mpampiantrano, izay haingana kokoa noho ny fihenan'ny habeny .

Manangana sary miaraka amin'ny fiankinan-doha nalaina ho sosona misaraka

Hanamboatra ny sary farany amin'ny dingana roa isika amin'ny fampiasana fomba iray antsoina hoe fihaonan-dalana maro . Amin'ny dingana voalohany dia hanesorana ny fiankinan-doha ary amin'ny dingana faharoa dia handika ny fiankinan-doha nalaina ho amin'ny sary farany.

Andao hanova ny Dockerfile ho fananganana dingana maromaro:

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

Tehirizinay ao anaty rakitra misaraka ity fikandrana ity - Dockerfile2.

Manorina ny sary Docker izahay amin'ny fampiasana ny baiko:

docker build -f Dockerfile2 -t usersignup:v1 .

Aorian'ny fampandehanana ity baiko ity dia mahazo ity vokatra manaraka ity izahay:

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

Hitantsika fa ny sary Docker dia noforonina miaraka amin'ny ID sary ary avy eo nasiana marika.

Farany, mihazakazaka ny baiko Dive toy ny teo aloha izahay mba hijery ireo sosona ao anatin'ilay sary Docker novokarina. Afaka manome ID na marika sary ho fampidirana ny baiko Dive izahay:

dive userssignup:v1

Araka ny hitanao amin'ny vokatra, ny sosona misy ny fampiharana dia 11 KB fotsiny izao, ary ny fiankinan-doha dia voatahiry ao anaty sosona misaraka. 

Mamorona sary Docker Optimized ho an'ny fampiharana Lohataona

Fanalana ny fiankinan-doha anatiny amin'ny sosona tsirairay

Afaka mampihena bebe kokoa ny haben'ny ambaratongan'ny rindranasa isika amin'ny alàlan'ny fanalana ny fiankinan-dohantsika amin'ny ambaratonga samihafa fa tsy ny famenoana azy amin'ny fampiharana amin'ny filazana azy ireo amin'ny ymlrakitra mitovy anarana 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/"

Amin'ity rakitra ity layers.idxnampiana fiankinan-doha mahazatra antsoina hoe, io.myorgmisy fiankinan'ny fikambanana nalaina tao amin'ny tahiry iombonana.

famaranana

Ato amin'ity lahatsoratra ity dia nijery ny fampiasana Cloud-Native Buildpacks izahay mba hananganana sary fitoeran-javatra mivantana avy amin'ny kaody loharano. Ity dia safidy hafa amin'ny fampiasana Docker mba hamoronana sarin'ny container amin'ny fomba mahazatra: mamorona rakitra JAR matevina azo tanterahina aloha ary avy eo mametaka azy ho sarin'ny container amin'ny alàlan'ny famaritana ny torolàlana ao amin'ny rakitra Docker.

Nijery ny fanatsarana ny fitahirizanay ihany koa izahay tamin'ny alàlan'ny fampandehanana endri-javatra sosona izay misintona ny fiankinan-doha amin'ny sosona misaraka izay voatahiry ao amin'ny mpampiantrano ary misy sosona manify amin'ny fampiharana no apetraka amin'ny fotoana voatondro ao amin'ny milina famonoana ny kaontenera.

Azonao atao ny mahita ny kaody loharano rehetra ampiasaina ao amin'ny lahatsoratra ao Github .

Fanondroana baiko

Ity misy famintinana haingana ny baiko nampiasainay tamin'ity lahatsoratra ity.

Famafana ny toe-javatra:

docker system prune -a

Mamorona sary container amin'ny alàlan'ny rakitra Docker:

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

Manorina ny sarin'ny kaontenera avy amin'ny kaody loharano izahay (tsy misy Dockerfile):

mvn spring-boot:build-image

Jereo ny sosona fiankinan-doha. Alohan'ny hananganana ny rakitra JAR fampiharana, ataovy azo antoka fa alefa amin'ny lohataona-boot-maven-plugin ny endri-javatra layering:

java -Djarmode=layertools -jar application.jar list

Fanalana sosona fiankinan-doha. Alohan'ny hananganana ny rakitra JAR fampiharana, ataovy azo antoka fa alefa amin'ny lohataona-boot-maven-plugin ny endri-javatra layering:

 java -Djarmode=layertools -jar application.jar extract

Jereo ny lisitry ny sary fitoeran-javatra

docker images

Jereo eo ankavia ao anatin'ny sarin'ny kaontenera (azo antoka fa napetraka ny fitaovana fitsirihana):

dive <image ID or image tag>

Source: www.habr.com