Ṣiṣẹda Awọn aworan Docker Iṣapeye fun Ohun elo Boot Orisun omi kan

Awọn apoti ti di ọna ayanfẹ ti iṣakojọpọ ohun elo pẹlu gbogbo sọfitiwia rẹ ati awọn igbẹkẹle ẹrọ ati lẹhinna jiṣẹ wọn si awọn agbegbe oriṣiriṣi.

Nkan yii ni wiwa awọn ọna oriṣiriṣi lati gba ohun elo Boot Orisun omi kan:

  • ṣiṣẹda aworan Docker nipa lilo faili Docker kan,
  • ṣiṣẹda aworan OCI lati orisun nipa lilo Cloud-Native Buildpack,
  • ati iṣapeye aworan akoko-ṣiṣe nipasẹ yiya sọtọ awọn ẹya ti JAR sinu awọn ipele oriṣiriṣi nipa lilo awọn irinṣẹ ipele pupọ.

 Apeere koodu

Nkan yii wa pẹlu apẹẹrẹ koodu iṣẹ lori GitHub .

Eiyan oro

A yoo bẹrẹ pẹlu awọn ọrọ-ọrọ eiyan ti a lo ninu nkan naa:

  • Aworan apoti: faili ti ọna kika kan pato. A yoo ṣe iyipada ohun elo wa sinu aworan eiyan nipa ṣiṣe ohun elo kikọ.
  • Apoti: An executable apeere ti eiyan image.
  • Eiyan engine: Awọn daemon ilana lodidi fun nṣiṣẹ eiyan.
  • Eiyan ogun: Awọn ogun kọmputa lori eyi ti awọn eiyan engine nṣiṣẹ.
  • Eiyan iforukọsilẹ: Ipo gbogbogbo ti a lo lati ṣe atẹjade ati pinpin aworan eiyan naa.
  • OCI boṣewaṢii Ibẹrẹ Apoti (OCI) jẹ iwuwo fẹẹrẹ, eto iṣakoso ṣiṣi silẹ ti a ṣẹda laarin Linux Foundation. Sipesifikesonu Aworan OCI n ṣalaye awọn iṣedede ile-iṣẹ fun aworan eiyan ati awọn ọna kika asiko lati rii daju pe gbogbo awọn ẹrọ eiyan le ṣiṣe awọn aworan eiyan ti o ṣẹda nipasẹ eyikeyi ohun elo kikọ.

Lati gba ohun elo kan, a fi ipari si ohun elo wa sinu aworan eiyan kan ati gbejade aworan yẹn si iforukọsilẹ pinpin. Akoko asiko ti apoti gba aworan yii lati iforukọsilẹ, ṣii rẹ, ati ṣiṣe ohun elo inu rẹ.

Ẹya 2.3 ti Orisun omi Boot pese awọn afikun fun ṣiṣẹda awọn aworan OCI.

Docker jẹ imuse eiyan ti o wọpọ julọ, ati pe a lo Docker ninu awọn apẹẹrẹ wa, nitorinaa gbogbo awọn itọkasi eiyan ti o tẹle ni nkan yii yoo tọka si Docker.

Ṣiṣe aworan eiyan ni ọna ibile

Ṣiṣẹda awọn aworan Docker fun awọn ohun elo Boot Orisun jẹ irọrun pupọ nipa fifi awọn ilana diẹ kun si faili Docker.

A kọkọ ṣẹda faili JAR ti o le ṣiṣẹ ati, gẹgẹbi apakan ti awọn ilana faili Docker, daakọ faili JAR ti o ṣiṣẹ lori oke aworan JRE ipilẹ lẹhin lilo awọn eto pataki.

Jẹ ki a ṣẹda ohun elo orisun omi wa lori Orisun omi Initializr pẹlu awọn igbẹkẹle weblombokи actuator. A tun n ṣafikun oludari isinmi lati pese API pẹlu GETọna.

Ṣiṣẹda Dockerfile kan

A ki o si eiyan yi ohun elo nipa fifi Dockerfile:

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

Faili Docker wa ni aworan ipilẹ kan ninu adoptopenjdk, lori oke ti a daakọ faili JAR wa lẹhinna ṣii ibudo, 8080eyi ti yoo gbọ awọn ibeere.

Ilé ohun elo

Ni akọkọ o nilo lati ṣẹda ohun elo kan nipa lilo Maven tabi Gradle. Nibi a lo Maven:

mvn clean package

Eyi ṣẹda faili JAR ti o le ṣiṣẹ fun ohun elo naa. A nilo lati yi JAR ti o le ṣiṣẹ pada si aworan Docker lati ṣiṣẹ lori ẹrọ Docker.

Ṣiṣẹda aworan eiyan

Lẹhinna a fi faili JAR ti o le ṣiṣẹ sinu aworan Docker nipa ṣiṣe aṣẹ naa docker buildlati inu ilana ilana gbongbo ise agbese ti o ni Dockerfile ti a ṣẹda tẹlẹ:

docker build  -t usersignup:v1 .

A le wo aworan wa ninu atokọ nipa lilo aṣẹ:

docker images 

Ijade ti aṣẹ ti o wa loke pẹlu aworan wa usersignuppẹlu aworan ipilẹ, adoptopenjdkpato ninu faili Docker wa.

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

Wo awọn ipele inu aworan apoti kan

Jẹ ki a wo akopọ ti awọn fẹlẹfẹlẹ inu aworan naa. A yoo lo irinṣẹ  besomi lati wo awọn ipele wọnyi:

dive usersignup:v1

Eyi ni apakan abajade lati aṣẹ Dive: 

Ṣiṣẹda Awọn aworan Docker Iṣapeye fun Ohun elo Boot Orisun omi kan

Gẹgẹbi a ti le rii, Layer ohun elo ṣe ipin pataki ti iwọn aworan naa. A fẹ lati dinku iwọn ti Layer yii ni awọn apakan atẹle gẹgẹbi apakan ti iṣapeye wa.

Ṣiṣẹda aworan eiyan nipa lilo Buildpack

Apejọ jo (Awọn idii ile) jẹ ọrọ gbogbogbo ti a lo nipasẹ ọpọlọpọ Platform gẹgẹbi awọn ọrẹ Iṣẹ (PAAS) lati ṣẹda aworan eiyan lati koodu orisun. Ti ṣe ifilọlẹ nipasẹ Heroku ni ọdun 2011 ati pe o ti gba nipasẹ Cloud Foundry, Google App Engine, Gitlab, Knative ati ọpọlọpọ awọn miiran.

Ṣiṣẹda Awọn aworan Docker Iṣapeye fun Ohun elo Boot Orisun omi kan

Awọn anfani ti awọn idii Kọ awọsanma

Ọkan ninu awọn anfani akọkọ ti lilo Buildpack lati ṣẹda awọn aworan ni pe Awọn ayipada iṣeto ni aworan le ṣee ṣakoso ni aarin (olukọle) ati ikede si gbogbo awọn ohun elo nipa lilo olupilẹṣẹ.

Awọn idii ti o kọ ni a so pọ mọ pẹpẹ. Awọsanma-Native Buildpacks n pese isọdiwọn kọja awọn iru ẹrọ nipasẹ atilẹyin ọna kika aworan OCI, eyiti o ni idaniloju pe aworan le ṣiṣẹ nipasẹ ẹrọ Docker.

Lilo orisun omi Boot itanna

Ohun itanna Boot Orisun omi kọ awọn aworan OCI lati orisun nipa lilo Buildpack. Awọn aworan ni a ṣẹda nipa lilo bootBuildImageawọn iṣẹ-ṣiṣe (Gradle) tabi spring-boot:build-imageawọn ibi-afẹde (Maven) ati fifi sori Docker agbegbe.

A le ṣe akanṣe orukọ aworan ti o nilo lati Titari si iforukọsilẹ Docker nipa sisọ orukọ naa sinu 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>

Jẹ ki a lo Maven lati ṣe build-imageawọn ibi-afẹde fun ṣiṣẹda ohun elo ati ṣiṣẹda aworan eiyan kan. A ko lo eyikeyi Dockerfiles ni akoko yii.

mvn spring-boot:build-image

Abajade yoo jẹ nkan bi eyi:

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

Lati inu abajade a rii iyẹn paketo Cloud-Native buildpacklo lati ṣẹda aworan OCI ti n ṣiṣẹ. Gẹgẹbi iṣaaju, a le rii aworan ti a ṣe akojọ si bi aworan Docker nipa ṣiṣe aṣẹ naa:

docker images 

Ipari:

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

Ṣiṣẹda aworan eiyan nipa lilo Jib

Jib jẹ ohun itanna ẹda aworan lati Google ti o pese ọna yiyan fun ṣiṣẹda aworan eiyan lati koodu orisun.

Tito leto jib-maven-pluginninu pom.xml:

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

Nigbamii ti, a nṣiṣẹ ohun itanna Jib nipa lilo aṣẹ Maven lati kọ ohun elo naa ati ṣẹda aworan eiyan kan. Gẹgẹbi iṣaaju, a ko lo awọn faili Docker eyikeyi nibi:

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

Lẹhin ṣiṣe pipaṣẹ Maven loke, a gba abajade atẹle:

[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

Ijade fihan pe a ti ṣẹda aworan eiyan ati gbe sinu iforukọsilẹ.

Awọn iwuri ati awọn ilana fun ṣiṣẹda awọn aworan iṣapeye

A ni awọn idi pataki meji fun iṣapeye:

  • Ise sise: Ni a eiyan orchestration eto, a eiyan aworan ti wa ni gba pada lati awọn aworan iforukọsilẹ si awọn ogun nṣiṣẹ awọn eiyan engine. Ilana yi ni a npe ni igbogun. Yiyọ awọn aworan nla lati awọn abajade iforukọsilẹ ni awọn akoko ṣiṣeto gigun ni awọn eto orchestration eiyan ati awọn akoko kikọ gigun ni awọn opo gigun ti CI.
  • Aabo: Awọn aworan ti o tobi tun ni agbegbe ti o tobi ju fun awọn ailagbara.

Aworan Docker kan ni akopọ ti awọn fẹlẹfẹlẹ, ọkọọkan eyiti o ṣe aṣoju itọnisọna kan ninu Dockerfile wa. Layer kọọkan ṣe aṣoju delta ti awọn ayipada ninu Layer ti o wa labẹ. Nigba ti a ba fa aworan Docker kan lati iforukọsilẹ, o fa ni awọn ipele ati ki o fipamọ sori agbalejo naa.

Orisun omi Boot nlo "JAR ti o sanra" ni bi awọn aiyipada apoti kika. Nigbati a ba wo JAR ti o nipọn, a rii pe ohun elo naa jẹ ipin kekere pupọ ti gbogbo JAR. Eyi ni apakan ti o yipada nigbagbogbo. Awọn iyokù ni awọn ipilẹ orisun orisun omi Framework.

Awọn ile-iṣẹ agbekalẹ ti o dara ju ni ayika yiya sọtọ ohun elo ni ipele lọtọ lati awọn igbẹkẹle Ipilẹ Orisun omi.

Layer ti o gbẹkẹle, eyiti o jẹ pupọ julọ ti faili JAR ti o nipọn, ti gba lati ayelujara ni ẹẹkan nikan ati ti fipamọ sori eto agbalejo.

Nikan Layer tinrin ti ohun elo ni a fa lakoko awọn imudojuiwọn ohun elo ati ṣiṣe eto eiyan. bi o ṣe han ninu aworan atọka yii:

Ṣiṣẹda Awọn aworan Docker Iṣapeye fun Ohun elo Boot Orisun omi kan

Ni awọn apakan atẹle, a yoo wo bii o ṣe le ṣẹda awọn aworan iṣapeye wọnyi fun ohun elo Boot Orisun omi kan.

Ṣiṣẹda Aworan Apoti Iṣapeye fun Ohun elo Boot Orisun omi Lilo Buildpack

Orisun omi Boot 2.3 ṣe atilẹyin fifin nipa yiyo awọn apakan ti faili JAR ti o nipọn sinu awọn fẹlẹfẹlẹ lọtọ. Ẹya Layer jẹ alaabo nipasẹ aiyipada ati pe o gbọdọ ṣiṣẹ ni gbangba ni lilo ohun itanna Orisun omi Boot Maven:

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

A yoo lo iṣeto ni lati kọ aworan eiyan wa ni akọkọ pẹlu Buildpack ati lẹhinna pẹlu Docker ni awọn apakan atẹle.

Jẹ ki a ṣe ifilọlẹ build-imageIbi-afẹde Maven fun ṣiṣẹda aworan apoti:

mvn spring-boot:build-image

Ti a ba ṣiṣẹ Dive lati wo awọn fẹlẹfẹlẹ ni aworan abajade, a le rii pe Layer ohun elo (ti a ṣe ilana ni pupa) kere pupọ ni iwọn kilobyte ni akawe si ohun ti a ni ni lilo ọna kika JAR ti o nipọn:

Ṣiṣẹda Awọn aworan Docker Iṣapeye fun Ohun elo Boot Orisun omi kan

Ṣiṣẹda Aworan Apoti Iṣapeye fun Ohun elo Boot Orisun omi Lilo Docker

Dipo lilo ohun itanna Maven tabi Gradle, a tun le ṣẹda aworan Docker JAR ti o fẹlẹfẹlẹ pẹlu faili Docker kan.

Nigba ti a ba lo Docker, a nilo lati ṣe awọn igbesẹ afikun meji lati yọkuro awọn fẹlẹfẹlẹ ati daakọ wọn sinu aworan ikẹhin.

Awọn akoonu ti JAR Abajade lẹhin ti o kọ nipa lilo Maven pẹlu sise Layering yoo dabi eyi:

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

Ijade fihan afikun JAR ti a npè ni spring-boot-jarmode-layertoolsи layersfle.idxfaili. Faili JAR afikun yii n pese awọn agbara ṣiṣe siwa, bi a ti ṣalaye ninu apakan atẹle.

Yiyọ awọn igbẹkẹle lori awọn ipele kọọkan

Lati wo ati jade awọn fẹlẹfẹlẹ lati JAR ti o fẹlẹfẹlẹ, a lo ohun-ini eto naa -Djarmode=layertoolsfun ibere spring-boot-jarmode-layertoolsJAR dipo ohun elo:

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

Ṣiṣe aṣẹ yii ṣe agbejade iṣelọpọ ti o ni awọn aṣayan aṣẹ ti o wa:

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

Ijade fihan awọn aṣẹ listextractи helpс helpjẹ aiyipada. Jẹ ki a ṣiṣẹ aṣẹ pẹlu listaṣayan:

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

A rii atokọ ti awọn igbẹkẹle ti o le ṣafikun bi awọn fẹlẹfẹlẹ.

Awọn ipele aiyipada:

Orukọ Layer

Awọn akoonu

dependencies

eyikeyi igbẹkẹle ti ẹya ko ni SNAPSHOT ninu

spring-boot-loader

Awọn kilasi agberu JAR

snapshot-dependencies

eyikeyi igbẹkẹle ti ẹya rẹ ni SNAPSHOT

application

ohun elo kilasi ati oro

Awọn fẹlẹfẹlẹ ti wa ni asọye ni layers.idxfaili ni aṣẹ wọn yẹ ki o ṣafikun si aworan Docker. Awọn ipele wọnyi ti wa ni ipamọ ninu agbalejo lẹhin igbapada akọkọ nitori wọn ko yipada. Layer ohun elo imudojuiwọn nikan ni a ṣe igbasilẹ si agbalejo, eyiti o yara yiyara nitori iwọn ti o dinku .

Ṣiṣe aworan kan pẹlu awọn igbẹkẹle ti a fa jade sinu awọn fẹlẹfẹlẹ lọtọ

A yoo kọ aworan ikẹhin ni awọn ipele meji nipa lilo ọna ti a pe olona-ipele ijọ . Ni igbesẹ akọkọ a yoo jade awọn igbẹkẹle ati ni igbesẹ keji a yoo daakọ awọn igbẹkẹle ti a fa jade sinu aworan ikẹhin.

Jẹ ki a ṣe atunṣe Dockerfile wa fun kikọ ipele pupọ:

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

A fi iṣeto yii pamọ sinu faili lọtọ - Dockerfile2.

A kọ aworan Docker nipa lilo aṣẹ:

docker build -f Dockerfile2 -t usersignup:v1 .

Lẹhin ṣiṣe aṣẹ yii a gba abajade atẹle:

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

A le rii pe a ṣẹda aworan Docker pẹlu ID aworan ati lẹhinna samisi.

Nikẹhin, a nṣiṣẹ aṣẹ Dive bi iṣaaju lati ṣayẹwo awọn fẹlẹfẹlẹ inu aworan Docker ti ipilẹṣẹ. A le pese ID aworan tabi taagi gẹgẹbi titẹ sii si aṣẹ Dive:

dive userssignup:v1

Gẹgẹbi o ti le rii ninu iṣelọpọ, Layer ti o ni ohun elo jẹ bayi 11 KB nikan, ati awọn igbẹkẹle ti wa ni ipamọ ni awọn fẹlẹfẹlẹ lọtọ. 

Ṣiṣẹda Awọn aworan Docker Iṣapeye fun Ohun elo Boot Orisun omi kan

Yiyọ awọn igbẹkẹle inu lori awọn ipele kọọkan

A le dinku iwọn ipele ohun elo siwaju sii nipa yiyo eyikeyi awọn igbẹkẹle aṣa wa sinu ipele lọtọ dipo iṣakojọpọ wọn pẹlu ohun elo nipa sisọ wọn ni ymliru faili ti a npè ni 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/"

Ninu faili yii layers.idxa ti ṣafikun igbẹkẹle aṣa ti a npè ni, io.myorgti o ni awọn igbẹkẹle agbari ti a gba pada lati ibi ipamọ ti o pin.

ipari

Ninu nkan yii, a wo ni lilo Cloud-Native Buildpacks lati kọ aworan eiyan taara lati koodu orisun. Eyi jẹ yiyan si lilo Docker lati ṣẹda aworan eiyan ni ọna deede: akọkọ ṣiṣẹda faili JAR ti o nipọn ti o nipọn ati lẹhinna ṣajọ rẹ sinu aworan eiyan nipa sisọ awọn itọnisọna pato ninu faili Docker.

A tun wo iṣapeye apoti wa nipa mimuuṣe ẹya-ara Layer ti o fa awọn igbẹkẹle sinu awọn fẹlẹfẹlẹ ọtọtọ ti o wa ni cache lori agbalejo ati pe o tinrin ti ohun elo ti wa ni ti kojọpọ ni akoko ṣiṣe eto ninu awọn ẹrọ ipaniyan eiyan naa.

O le wa gbogbo koodu orisun ti a lo ninu nkan naa ni Github .

Itọkasi aṣẹ

Eyi ni iyara ti awọn aṣẹ ti a lo ninu nkan yii.

Isọ ọrọ kuro:

docker system prune -a

Ṣiṣẹda aworan eiyan nipa lilo faili Docker kan:

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

A kọ aworan eiyan lati koodu orisun (laisi Dockerfile):

mvn spring-boot:build-image

Wo awọn ipele ti o gbẹkẹle. Ṣaaju ki o to kọ faili JAR ohun elo, rii daju pe ẹya-ara Layer ti ṣiṣẹ ni orisun omi-boot-maven-plugin:

java -Djarmode=layertools -jar application.jar list

Yiyọ gbára fẹlẹfẹlẹ. Ṣaaju ki o to kọ faili JAR ohun elo, rii daju pe ẹya-ara Layer ti ṣiṣẹ ni orisun omi-boot-maven-plugin:

 java -Djarmode=layertools -jar application.jar extract

Wo atokọ ti awọn aworan apoti

docker images

Wo ni apa osi inu aworan eiyan (rii daju pe ohun elo besomi ti fi sori ẹrọ):

dive <image ID or image tag>

orisun: www.habr.com