Fausia ata o Docker sili ona lelei mo se Spring Boot Application

O koneteina ua avea ma auala sili ona lelei e afifiina ai se talosaga ma ana polokalama faakomepiuta ma fa'agaioiga faiga fa'alagolago ona tu'uina atu lea i siosiomaga eseese.

O lenei tusiga e aofia ai auala eseese e faʻapipiʻi ai se talosaga Spring Boot:

  • fatuina o se ata Docker e faʻaaoga ai se faila Docker,
  • fatuina o se ata OCI mai le punavai e faʻaaoga ai le Cloud-Native Buildpack,
  • ma fa'ata'ita'iga fa'ata'ita'i taimi e ala i le tu'u'ese'ese o vaega o le JAR i fa'avae eseese e fa'aaoga ai meafaigaluega e tele-tier.

 Fa'ata'ita'iga code

O lenei tusiga o loʻo faʻatasi ma se faʻataʻitaʻiga code galue i luga ole GitHub .

Fa'aupuga o pusa

O le a tatou amata i le container terminology o loʻo faʻaaogaina i le tusiga:

  • Ata o koneteina: faila o se faatulagaga patino. O le a matou faaliliuina a matou talosaga i se ata atigipusa e ala i le faʻaogaina o le meafaigaluega faufale.
  • Pusa: O se fa'ata'ita'iga fa'atinoina o le ata o le koneteina.
  • Inisinia pusa: O le faiga o le daemon e nafa ma le faʻaogaina o le koneteina.
  • Fale fa'aputu: Le komepiuta talimalo o loʻo faʻaogaina ai le afi pusa.
  • Resitala pusa: Le nofoaga lautele na faʻaaogaina e faʻasalalau ma tufatufa ai le ata o pusa.
  • OCI tulagaTatala Container Initiative (OCI) ose fa'atonuga mama, matala fa'apulepule fa'avae i totonu ole Linux Foundation. O le OCI Image Specification o loʻo faʻamalamalamaina tulaga faʻapitoa mo ata atigipusa ma faʻasologa taimi e faʻamautinoa ai e mafai e masini pusa uma ona faʻatautaia ata o pusa na faia e soʻo se meafaigaluega faufale.

Ina ia fa'aputuina se talosaga, matou te afifiina la matou talosaga i se ata fa'akomupiuta ma fa'asalalau lea ata i se resitala fa'asoa. O le taimi fa'agasolo o koneteina e toe aumai le ata lea mai le resitala, tatala, ma fa'agasolo le talosaga i totonu.

Fa'aliliuga 2.3 o Spring Boot e tu'uina atu fa'apipi'i mo le fa'atupuina o ata OCI.

Docker o le faʻaaogaina o koneteina e masani ona faʻaaogaina, ma matou te faʻaogaina le Docker i a matou faʻataʻitaʻiga, o lea o faʻamatalaga uma o pusa i totonu o lenei tusiga o le a faasino ia Docker.

Fausia se ata atigipusa i le auala masani

Fausia ata Docker mo Spring Boot talosaga e matua faigofie lava i le faʻaopoopoina o nai faʻatonuga i le faila Docker.

Matou te fatuina muamua se faila JAR e mafai ona faʻaaogaina ma, o se vaega o le faila faila a Docker, kopi le faila JAR faʻapipiʻi i luga o le ata JRE faavae pe a uma ona faʻaogaina tulaga talafeagai.

Se'i fai la tatou talosaga Spring i luga Spring Initializr ma fa'alagolago weblombokи actuator. O loʻo matou faʻaopoopoina foʻi se pule malolo e tuʻuina atu ai se API GETauala.

Fausia se Dockerfile

Ona matou teuina lea o lenei talosaga e ala i le faaopoopo Dockerfile:

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

O la matou faila Docker o loʻo i ai se ata faʻavae mai adoptopenjdk, i luga o le mea matou te kopiina le faila JAR ona tatala lea o le taulaga, 8080lea o le a faalogo mo talosaga.

Fausia le talosaga

Muamua e tatau ona e fatuina se talosaga e faʻaaoga ai Maven poʻo Gradle. O iinei matou te faʻaaogaina Maven:

mvn clean package

Ole mea lea e faia ai se faila JAR fa'atinoina mo le talosaga. Matou te manaʻomia le faʻaliliuina o lenei JAR faʻatinoina i se ata Docker e taʻavale i luga o le Docker engine.

Fausia se ata o pusa

Ona matou tuʻuina lea o le faila JAR faʻaaogaina i le ata Docker e ala i le faʻatonuina o le poloaiga docker buildmai le lisi autu o le poloketi o loʻo i ai le Dockerfile na faia muamua:

docker build  -t usersignup:v1 .

E mafai ona tatou vaʻai i la tatou ata i le lisi e faʻaaoga ai le poloaiga:

docker images 

O le gaioiga o le poloaiga i luga e aofia ai la tatou ata usersignupfaatasi ai ma le ata faavae, adoptopenjdkfaʻamaonia i la matou faila Docker.

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

Va'ai laulau i totonu o se ata koneteina

Se'i o tatou va'ai i le fa'aputuga o fa'alava i totonu o le ata. O le a matou faʻaaogaina mea faifaaili  maulu e va'ai i laulau nei:

dive usersignup:v1

O se vaega lenei o le gaioiga mai le Dive command: 

Fausia ata o Docker sili ona lelei mo se Spring Boot Application

E pei ona mafai ona tatou vaʻaia, o le faʻapipiʻi talosaga e faia ai se vaega taua o le tele o ata. Matou te mananaʻo e faʻaititia le tele o lenei laulau i vaega o loʻo mulimuli mai o se vaega o la matou faʻataʻitaʻiga.

Fausia se ata atigipusa e faʻaaoga ai le Buildpack

Fonotaga afifi (Buildpacks) o se faaupuga lautele e faʻaaogaina e le tele o Platform as a Service (PAAS) ofo e fatu ai se ata atigipusa mai le code source. Na faʻalauiloaina e Heroku i le 2011 ma talu mai lena taimi na faʻaaogaina e Cloud Foundry, Google App Engine, Gitlab, Knative ma le tele o isi.

Fausia ata o Docker sili ona lelei mo se Spring Boot Application

Le lelei o afifi fausia ao

O se tasi o faʻamanuiaga autu o le faʻaaogaina o le Buildpack e fatu ai ata o lena E mafai ona pulea fa'atotonugalemu suiga fa'atulagaina o ata (fausiaina) ma fa'asalalau i talosaga uma e fa'aoga ai le faufale.

O afifi faufale sa fa'apipi'i lelei i le tulaga. Cloud-Native Buildpacks e tuʻuina atu faʻasalalauga i luga o faʻasalalauga e ala i le lagolagoina o le ata o le OCI, lea e faʻamautinoa ai e mafai ona faʻatautaia le ata e le Docker engine.

Fa'aaogaina o le Spring Boot plugin

O le Spring Boot plugin e fausia ai ata OCI mai le puna e faʻaaoga ai le Buildpack. E faia ata e fa'aoga ai bootBuildImagegaluega (Gradle) po'o spring-boot:build-imagesini (Maven) ma faʻapipiʻi Docker i le lotoifale.

E mafai ona matou faʻavasegaina le igoa o le ata e manaʻomia e tulei i le Docker resitala e ala i le faʻamaonia o le igoa i totonu 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>

Tatou faaaoga Maven e fai ai build-imagesini mo le fatuina o se talosaga ma le fatuina o se ata atigipusa. Matou te le faʻaaogaina soʻo se Dockerfiles i le taimi nei.

mvn spring-boot:build-image

O le taunuuga o le a pei o lenei:

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

Mai le fa'aaliga ua tatou va'ai i ai paketo Cloud-Native buildpackfaʻaaoga e fatu ai se ata OCI galue. E pei o le taimi muamua, e mafai ona tatou vaʻai i le ata o loʻo lisiina o se ata Docker e ala i le faʻatonuina o le poloaiga:

docker images 

Faaiuga:

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

Fausia se ata atigipusa e faʻaaoga ai Jib

Jib o se faʻapipiʻi faʻapipiʻi ata mai Google lea e maua ai se isi auala mo le fatuina o se atigipusa ata mai le code source.

Faʻatulagaina jib-maven-plugini le pom.xml:

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

Le isi, matou te faʻaogaina le Jib plugin e faʻaaoga ai le Maven poloaiga e fausia ai le talosaga ma fatuina se ata atigipusa. E pei o le taimi muamua, matou te le o faʻaogaina soʻo se Docker faila iinei:

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

A maeʻa ona faʻatinoina le poloaiga a Maven o loʻo i luga, matou te maua le gaioiga lea:

[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

O le gaioiga o loʻo faʻaalia ai na faia le ata o pusa ma tuʻu i totonu o le resitala.

Fa'aosofiaga ma metotia mo le fatuina o ata sili ona lelei

E lua a matou mafuaaga autu mo le faʻaleleia atili:

  • Gaioiga: I totonu o se faiga faʻapipiʻi koneteina, e maua mai se ata atigipusa mai le resitara ata i le tagata talimalo o loʻo faʻaogaina le afi pusa. O lenei faiga e ta'ua o le fuafuaina. O le tosoina o ata tetele mai le resitala e maua ai taimi umi o taimi faatulagaina i totonu o pusa faʻapipiʻi faiga ma umi taimi fau i paipa CI.
  • Puipuiga: O ata tetele e iai fo'i se vaega tele mo fa'aletonu.

O se ata Docker e aofia ai se faaputuga o laulau, o ia mea taitasi e fai ma sui o se faʻatonuga i la matou Dockerfile. O vaega ta'itasi o lo'o fa'atusalia ai se delta o suiga i le fa'avae pito i lalo. A matou tosoina se ata Docker mai le resitala, e tosoina i luga o laulau ma faʻapipiʻi i luga o le talimalo.

Fa'aoga Spring Boot "JAR ga'o" i e pei o le tulaga fa'apipi'i fa'aletonu. A tatou vaʻavaʻai i le JAR mafiafia, tatou te iloa o le talosaga e faia ai se vaega itiiti o le JAR atoa. O le vaega lea e sui soo. O le vaega o totoe e aofia ai le Spring Framework fa'alagolago.

Ole fua fa'atatau e fa'atotonugalemu ile fa'aesea ole talosaga ile tulaga ese mai Spring Framework fa'alagolago.

O le faʻalagolago i luga ole laiga, lea e fausia ai le tele o le faila JAR mafiafia, e naʻo le tasi e sii mai ma teu i luga o le polokalama talimalo.

Na'o se vaega manifinifi o le talosaga e toso i le taimi o fa'afouga o talosaga ma le fa'atulagaina o pusa. e pei ona faaalia i lenei ata:

Fausia ata o Docker sili ona lelei mo se Spring Boot Application

I vaega o loʻo mulimuli mai, o le a tatou vaʻavaʻai pe faʻapefea ona fatuina nei ata sili ona lelei mo se talosaga Spring Boot.

Fausiaina o se Ata Fa'atosina Fa'alelei mo se Talosaga Fa'ato'aga e Fa'aaoga ai le Buildpack

O le Spring Boot 2.3 e lagolagoina le fa'apipi'iina e ala i le su'eina o vaega o se faila mafiafia JAR i fa'a eseese. O le vaega faʻapipiʻi e le mafai ona faʻaogaina ma e tatau ona faʻaalia manino e faʻaaoga ai le Spring Boot Maven plugin:

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

O le a matou faʻaogaina lenei faʻatulagaga e fausia muamua ai le matou atigipusa ata ma Buildpack ona sosoo ai lea ma Docker i vaega nei.

Tatou amata build-imageMaven sini mo le fatuina o ata atigipusa:

mvn spring-boot:build-image

Afai tatou te tamoʻe le Dive e vaʻai i luga o le ata o loʻo i ai, e mafai ona tatou vaʻaia o le laupepa talosaga (faʻamatala i le mumu) e sili atu ona laʻititi i le kilobyte range pe a faʻatusatusa i mea na matou maua i le faʻaogaina o le JAR format:

Fausia ata o Docker sili ona lelei mo se Spring Boot Application

Fausiaina o se Ata Fa'atosina lelei mo se Talosaga Fa'ato'aga Fa'aoga Fa'aaoga Docker

Nai lo le faʻaaogaina o se Maven poʻo Gradle plugin, e mafai foi ona tatou fatuina se ata Docker JAR faʻapipiʻi ma se faila Docker.

A matou faʻaogaina Docker, matou te manaʻomia le faia o ni laasaga faaopoopo se lua e faʻapipiʻi ai laulau ma kopi i le ata mulimuli.

O mea o loʻo maua i le JAR pe a maeʻa le fausiaina o le Maven ma faʻaogaina le faʻaogaina o le a pei o lenei:

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

O lo'o fa'aalia e le fa'aaliga se isi JAR ua ta'ua spring-boot-jarmode-layertoolsи layersfle.idxfaila. O lenei faila JAR fa'aopoopo e tu'uina atu ai agava'a fa'apipi'i, e pei ona fa'amatalaina i le isi vaega.

Ave'esea fa'alagolago i luga ole laiga ta'itasi

Ina ia va'ai ma fa'apipi'i 'ese'ese mai le matou JAR fa'apipi'i, matou te fa'aogaina le meatotino -Djarmode=layertoolsmo le amataga spring-boot-jarmode-layertoolsJAR nai lo le talosaga:

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

O le faʻatinoina o lenei faʻatonuga e maua ai le gaioiga o loʻo i ai avanoa faʻatonuga avanoa:

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

O le fa'aaliga o lo'o fa'aalia ai fa'atonuga listextractи helpс helpavea ma faaletonu. Tatou fa'agasolo le fa'atonuga ma listfilifiliga:

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

Matou te vaʻai i se lisi o faʻalagolago e mafai ona faʻaopoopoina o ni laulau.

Laega fa'aletonu:

Igoa apa

Mataupu

dependencies

so'o se fa'alagolago e lē o iai le SNAPSHOT

spring-boot-loader

Vasega JAR Loader

snapshot-dependencies

so'o se fa'alagolago o lona fa'amatalaga o lo'o iai le SNAPSHOT

application

vasega talosaga ma punaoa

Lays ua faauigaina i layers.idxfaila i le faasologa e tatau ona faʻaopoopoina i le ata Docker. O nei laulau e teu i totonu o le talimalo pe a maeʻa le toe maua muamua aua latou te le suia. Na'o le fa'afou fa'apolokalame fa'apipi'i e la'u mai i le talimalo, lea e vave ona fa'aitiitia le tele .

Fausiaina o se ata ma fa'alagolago e fa'apipi'iina i ni fa'avae eseese

O le a matou fausia le ata mulimuli i ni vaega se lua e faʻaaoga ai se metotia e taʻua fa'apotopotoga fa'atele . I le laasaga muamua o le a tatou faʻapipiʻi faʻalagolago ma i le laasaga lona lua o le a tatou kopiina ai faʻalagolago i le ata mulimuli.

Sei o tatou suia a tatou Dockerfile mo se fausaga e tele:

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

Matou te faʻasaoina lenei faʻatulagaga i se faila ese - Dockerfile2.

Matou te fausia le ata Docker e faʻaaoga ai le poloaiga:

docker build -f Dockerfile2 -t usersignup:v1 .

A maeʻa le faʻatonuina o lenei poloaiga matou te maua le gaioiga lea:

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

E mafai ona tatou vaʻaia o se ata Docker ua faia ma se ID ata ona faʻailogaina.

Ma le mea mulimuli, matou te faʻatautaia le Dive command e pei ona muamua e asiasia laulau i totonu o le ata Docker na gaosia. E mafai ona matou tuʻuina atu se ID ata poʻo se pine e fai ma faʻaoga i le Dive command:

dive userssignup:v1

E pei ona mafai ona e vaʻai i le gaioiga, o le laulau o loʻo i ai le talosaga ua naʻo le 11 KB, ma o faʻalagolago o loʻo faʻapipiʻiina i ni vaega eseese. 

Fausia ata o Docker sili ona lelei mo se Spring Boot Application

Ave'esea fa'alagolago i totonu i luga ole laiga ta'itasi

E mafai ona tatou fa'aititia atili le tele o le vaega o talosaga e ala i le aveesea o so'o se a tatou fa'alagolago fa'ale-aganu'u i se isi vaega nai lo le afifiina i le talosaga e ala i le fa'ailoaina i totonu. ymlfaila tutusa e igoa 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/"

I lenei faila layers.idxua matou fa'aopoopoina se fa'alagolago fa'ale-aganu'u e igoa, io.myorgo lo'o iai fa'alapotopotoga fa'alagolago na maua mai i se fa'amaumauga fa'asoa.

iʻuga

I lenei tusiga, na matou vaʻavaʻai i le faʻaaogaina o Cloud-Native Buildpacks e fausia ai se ata atigipusa saʻo mai le code source. O se isi mea lea i le faʻaaogaina o Docker e fatu ai se ata atigipusa i le auala masani: muamua fatuina se faila JAR mafiafia faʻapipiʻi ona faʻapipiʻiina lea i totonu o se ata atigipusa e ala i le faʻamaonia o faatonuga i le faila Docker.

Na matou vaʻavaʻai foʻi i le faʻaleleia atili o la matou koneteina e ala i le faʻatagaina o se vaega faʻapipiʻi e tosoina ai faʻalagolago i ni laulau eseese o loʻo teuina i luga o le talimalo ma o se vaega manifinifi o le talosaga e utaina i le taimi faʻatulagaina i masini faʻataunuʻu o le koneteina.

E mafai ona e mauaina uma le source code o loʻo faʻaaogaina i le tusiga i Github .

Fa'asinoga poloa'iga

Ole fa'asologa vave lea o fa'atonuga na matou fa'aogaina i lenei tusiga.

Fa'amama fa'amatalaga:

docker system prune -a

Fausia se ata atigipusa e faʻaaoga ai se faila Docker:

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

Matou te fausia le ata atigipusa mai le code source (e aunoa ma Dockerfile):

mvn spring-boot:build-image

Va'ai laulau fa'alagolago. Aʻo leʻi fauina le faila JAR talosaga, ia mautinoa o loʻo mafai ona faʻaogaina le faʻaogaina i le spring-boot-maven-plugin:

java -Djarmode=layertools -jar application.jar list

Ave'esega fa'alagolago. Aʻo leʻi fauina le faila JAR talosaga, ia mautinoa o loʻo mafai ona faʻaogaina le faʻaogaina i le spring-boot-maven-plugin:

 java -Djarmode=layertools -jar application.jar extract

Va'ai se lisi o ata atigipusa

docker images

Va'ai i le agavale i totonu o le atigipusa ata (ia mautinoa o lo'o fa'apipi'i le meafaigaluega maulu):

dive <image ID or image tag>

puna: www.habr.com