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): , .
OCI: Open 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 web
, lombok
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
usersignup
, adoptopenjdk
, 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-layertools
JAR :
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
list
, extract
help
help
. list
:
java -Djarmode=layertools -jar target/usersignup-0.0.1-SNAPSHOT.jar list
dependencies
spring-boot-loader
snapshot-dependencies
application
, .
:
| |
---|---|
| , SNAPSHOT |
| JAR |
| , SNAPSHOT |
|
|
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.idx
, io.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>