Création d'images Docker optimisées pour une application Spring Boot

Les conteneurs sont devenus le moyen privilégié de conditionner une application avec toutes ses dépendances logicielles et de système d'exploitation, puis de les livrer à différents environnements.

Cet article explore les différentes façons de conteneuriser votre application Spring Boot:

  • construire une image Docker à l'aide d'un Dockerfile,

  • créer une image OCI à partir de la source à l'aide de Cloud-Native Buildpack,

  • et l'optimisation de l'image au moment de l'exécution en divisant les JAR en différents niveaux à l'aide d'outils en couches.

 Exemple de code

Cet article est accompagné d'un exemple de code de travail  sur GitHub  .

Terminologie des conteneurs

Nous allons commencer par la terminologie du conteneur utilisée dans l'article:

  • Image de conteneur : un fichier d'un format spécifique. Nous convertissons notre application en une image de conteneur en exécutant l'outil de construction.

  • Conteneur : instance exécutable d'une image de conteneur.

  • Moteur de conteneur : processus démon responsable du démarrage d'un conteneur.

  • Hôte de conteneur : la machine hôte qui exécute le moteur de conteneur.

  • (Container registry): , .

  • OCIOpen Container Initiative (OCI) - , Linux Foundation. OCI , , , .

, .   , .

2.3 Spring Boot OCI.

Docker - , Docker , Docker.

Docker Spring Boot , Docker.

JAR , Docker, JAR JRE .

Spring  Spring Initializr  weblombok actuator.  rest , API  GET.

Docker

,  Dockerfile:

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

Docker ,  adoptopenjdk, JAR, , 8080 .

Maven Gradle.  Maven:

mvn clean package

JAR- .  JAR Docker Docker.

JAR Docker,   docker build , Docker, :

docker build  -t usersignup:v1 .

:

docker images 

 usersignupadoptopenjdk, Docker.

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

.     dive,  :

dive usersignup:v1

Dive: 

, .  .

Buildpack

(Buildpacks) - , « » (PAAS) .  Heroku 2011 Cloud Foundry, Google App Engine, Gitlab, Knative .

Buildpack ,   (builder) , builder.

Cloud-Native Buildpacks , OCI, , Docker.

Spring Boot

Spring Boot OCI Buildpack.   bootBuildImage (Gradle)  spring-boot:build-image (Maven) Docker.

, Docker,  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>

Maven  build-image .  Docker.

mvn spring-boot:build-image

:

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

,  paketo Cloud-Native buildpack OCI.  , , Docker, :

docker images 

:

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

Jib

Jib - Google, .

 jib-maven-plugin pom.xml:

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

Jib Maven, .  , Docker:

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

Maven :

[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

, .

:

  • : , .  .  CI.

  • : .

Docker , Dockerfile.  .  Docker , .

Spring Boot  « JAR»   .  JAR, , JAR.  , .  Spring Framework.

Spring Framework.

, JAR-, -.

,  :

, Spring Boot.

Spring Boot Buildpack

Spring Boot 2.3   JAR- .  , Spring Boot Maven:

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

Buildpack, Docker .

 build-image Maven  :

mvn spring-boot:build-image

Dive, , , ( ) , JAR:

Spring Boot Docker

Maven Gradle JAR Docker Docker.

Docker, .

JAR Maven :

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

JAR  spring-boot-jarmode-layertools layersfle.idx.  JAR- , .

JAR,  -Djarmode=layertools  spring-boot-jarmode-layertoolsJAR :

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

, :

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

 listextract help help .   list:

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

, .

:

dependencies

, SNAPSHOT

spring-boot-loader

JAR

snapshot-dependencies

, SNAPSHOT

application

 layers.idx , Docker.  , .  , -  .

,

, ,    .  , .

Docker :

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

Dockerfile2.

Docker :

docker build -f Dockerfile2 -t usersignup:v1 .

:

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

, Docker , .

, Dive, , Docker.  Dive:

dive userssignup:v1

, , , 11 , . 

, , ,  yml  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/"

 layers.idxio.myorg , .

Cloud-Native Buildpacks .  Docker : JAR, , Docker.

, , , , .

,  Github .

, .

:

docker system prune -a

Docker:

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

( Dockerfile):

mvn spring-boot:build-image

.  JAR- , spring-boot-maven-plugin:

java -Djarmode=layertools -jar application.jar list

.  JAR- , spring-boot-maven-plugin:

 java -Djarmode=layertools -jar application.jar extract

docker images

  (, ):

dive <image ID or image tag>




All Articles