江西省住房保障建设厅网站,通信网站模板,寄生虫网站排名代做,安装wordpress到服务器首先为什么要使用 Docker#xff1f;
Docker 是一个强大的工具#xff0c;它允许开发者将他们的应用程序打包到容器中#xff0c;以便可以在任何平台上轻松部署和运行。当涉及到对 Spring Boot 应用程序进行 Docker 化时#xff0c;每个开发人员都应该遵循一些最佳实践
Docker 是一个强大的工具它允许开发者将他们的应用程序打包到容器中以便可以在任何平台上轻松部署和运行。当涉及到对 Spring Boot 应用程序进行 Docker 化时每个开发人员都应该遵循一些最佳实践以确保应用程序平稳高效地运行。
在本文中我们将探讨这些最佳实践并提供代码示例和说明以帮助您对 Spring Boot 应用程序进行 Docker 化。
作为一个 java 开发者有很多用于支持 spring-boot 应用程序的基础官方镜像我们需要关注镜像的大小特别是当项目变大时。
使用正确的基础镜像
当对 Spring Boot 应用程序进行 Docker 化时为您的应用程序选择正确的基础镜像非常重要。您可能知道 Docker 中的所有镜像都有 Linux 内核的基础层因此我们不需要将这部分添加到我们的镜像中因为我们的基础镜像提供了您的应用程序所需的底层内核和依赖项。选择正确的基础镜像有助于确保您的应用程序在 Docker 容器中平稳高效地运行。
对于 Spring Boot 应用程序建议使用 OpenJDK 基础映像。OpenJDK 是 Java 开发工具包 (JDK) 的开源实现提供 Java 运行时环境和 Java 开发工具。OpenJDK 基础映像有不同版本例如 Java 8、Java 11 和 Java 16。以下是使用 OpenJDK 11 基础映像的 Dockerfile 示例
FROM openjdk:17-jdk-slim
COPY target/springBootDockerized-0.0.1-SNAPSHOT.jar springBootDockerized-0.0.1-SNAPSHOT.jar
ENTRYPOINT [java , -jar , /springBootDockerized-0.0.1-SNAPSHOT.jar]但非常重要的是我们不需要 JDK我们只需要 JRE java 运行时环境 我建议在 OpenJDK 官方链接中使用 JRE 层您可以找到以下内容
eclipse-temurin作为示例 spring-boot 应用程序添加一个 Dockerfile 到 root如下所示
#dockerized 使用 JDK 的不好做法
#FROM openjdk:17-jdk-slim
#COPY target/springBootDockerized-0.0.1-SNAPSHOT.jar springBootDockerized-0.0.1-SNAPSHOT.jar
#ENTRYPOINT [java , -jar , /springBootDockerized-0.0.1-SNAPSHOT.jar]FROM eclipse-temurin:17.0.5_8-jre-focal as builder
WORKDIR extracted
ADD ./target/*.jar app.jar
RUN java -Djarmodelayertools -jar app.jar extractFROM eclipse-temurin:17.0.5_8-jre-focal
WORKDIR application
COPY --frombuilder extracted/dependencies/ ./
COPY --frombuilder extracted/spring-boot-looder/ ./
COPY --frombuilder extracted/snapshot-dependencies/ ./
COPY --frombuilder extracted/application/ ./EXPOSE 8085#在 springboot 3.2 之前使用它
#ENTRYPOINT [java , org.springframework.boot.loader.JarLauncher]
#在 springboot 3.2 之后使用它ENTRYPOINT [java , org.springframework.boot.loader.launch.JarLauncher]在此示例中第一阶段使用 Maven 基础映像来构建 Spring Boot 应用程序并生成 jar 文件。第二阶段使用 OpenJDK slim 基础镜像它是基础镜像的较小版本仅包含 Java 运行时环境。
该COPY --frombuild指令将 jar 文件从第一阶段复制到第二阶段该ENTRYPOINT指令指定容器启动时应该运行的命令。
第一部分指令的含义 java 这是运行 Java 应用程序或执行 Java 字节码的命令。 -Djarmodelayertools 这是一个系统属性它使用 - D 标志指定。它将 HRIMARMODE 属性的值设置为更高级的 LayerTools。这是启用 “layertools” 模式来操作模块化 JAR 文件中的 “层” 的另一种方法。 -jar app.jar 指定要执行的 JAR 文件名为 “app.jar”。该-jar选项指示指定的文件是可执行的 JAR 文件。 extract 这是在 JAR 文件中传递给应用程序的参数或命令。它指示应用程序执行特定操作在本例中是提取 JAR 文件的内容。
通过这种方式使用多阶段构建我们可以创建一个精简的 Docker 映像其中仅包含运行 Spring Boot 应用程序所需的依赖项和文件。通过这样做我们可以减小图像的大小并提高应用程序的性能。
另一种方法是使用 Build-pack.io它会在您的 pom 中自动为您生成图像并将其添加到插件标签中
buildpluginspluginconfigurationimagenamekia/test/name/image/configurationgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins
/build 之后运行此命令
mvn spring-boot:build-image使用这个命令 spring boot 可以完美地为你制作镜像。
使用环境变量
当对 Spring Boot 应用程序进行 Docker 化时使用环境变量来配置应用程序非常重要。使用环境变量允许您更改应用程序的配置而无需重建 Docker 映像。
Spring Boot 应用程序可以使用application.properties或application.yml文件来指定配置属性。这些属性可以在运行时使用环境变量覆盖Spring Boot 会自动将其映射到属性。下面是一个示例 Dockerfile它设置一个环境变量来配置 Spring Boot 应用程序的活动配置文件
FROM openjdk:11
ENV SPRING_PROFILES_ACTIVEproduction
COPY target/my-application.jar app.jar
ENTRYPOINT [java, -jar, /app.jar]在本例中我们将SPRING_PROFILES_ACTIVE环境变量设置为生产环境变量这将激活 Spring Boot 应用程序中的生产配置文件。
当容器启动时ENTRYPOINT指令中指定的 java 命令将与-jar选项一起运行以启动 Spring Boot 应用程序。由于我们设置了SPRING_PROFILES_ACTIVE环境变量应用程序将自动使用生产环境。
使用健康检查
对 Spring Boot 应用程序进行 Docker 化时使用运行状况检查来监控应用程序的运行状况并确保其正确运行非常重要。健康检查可用于检测应用程序何时不健康并根据应用程序的健康状况自动执行恢复或扩展。
要在 Docker 映像中添加健康检查您可以使用 Dockerfile 中的HEALTHCHECK指令。HEALTHCHECK指令告诉 Docker 如何检查应用程序的运行状况。下面是一个示例 Dockerfile它为 Spring Boot 应用程序添加了健康检查
FROM openjdk:11
COPY target/my-application.jar app.jar
HEALTHCHECK --interval5s \--timeout3s \CMD curl -f http://localhost:8080/actuator/health || exit 1
ENTRYPOINT [java, -jar, /app.jar]在此示例中我们使用HEALTHCHECK指令来检查 Spring Boot 应用程序的运行状况。该--interval选项指定运行状况检查的频率以及--timeout指定等待响应的时间。该CMD指令运行健康检查命令这是 curl 检查/actuator/health应用程序端点的命令。
运行容器时可以使用docker ps命令查看容器的健康状态
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e8e1a6440e5e my-application:1.0 java -jar /app.jar 5 seconds ago Up 4 seconds 0.0.0.0:8080-8080/tcp my-application
$ docker inspect --format{{json .State.Health}} my-application
{Status:healthy,FailingStreak:0,Log:[{Start:2023-03-25T09:21:08.272130387Z,End:2023-03-25T09:21:08.310105965Z,ExitCode:0,Output:\n}]}在此示例中该docker ps命令显示容器已启动并在端口 8080 上运行。该docker inspect命令显示容器的健康状态当前为 healthy。如果健康检查失败容器将被标记为 unhealthy您可以使用 Docker Compose 或 Kubernetes 等工具自动恢复或扩展容器。
使用 Docker 缓存
当对 Spring Boot 应用程序进行 Docker 化时使用 Docker 缓存来加快构建过程并减少构建新 Docker 映像所需的时间非常重要。Docker 缓存允许您重用之前构建的 Docker 镜像层从而避免每次构建新镜像时都需要重建这些层。下面是一个使用 Docker 缓存来加速构建过程的 Dockerfile 示例
FROM openjdk:11 as builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offlineCOPY src/ ./src/
RUN mvn package -DskipTestsFROM openjdk:11
COPY --frombuilder /app/target/my-application.jar app.jar
ENTRYPOINT [java, -jar, /app.jar]每一步都假设一个缓存在 Docker 注册表层的阶段
在此示例中我们使用多阶段构建首先在单独的层中构建 Spring Boot 应用程序然后将构建的 jar 文件复制到最终镜像中。通过在构建过程中使用单独的层我们可以利用 Docker 缓存来避免每次构建新镜像时重建依赖项。 构建过程的第一阶段使用openjdk:11基础镜像并复制 pom.xml 文件到容器。然后它运行mvn dependency:go-offline命令下载应用程序所需的所有依赖项。该命令确保所有必需的依赖项在本地可用这将加快后续构建的速度。 构建过程的第二阶段使用openjdk:11基础映像并将源代码复制到容器中。然后它运行mvn package命令来构建应用程序 jar 文件。由于我们在上一阶段已经下载了依赖项因此 Docker 将使用缓存层并跳过依赖项下载步骤。 最后该COPY --frombuilder指令将构建的 jar 文件从构建器阶段复制到最终映像并且该ENTRYPOINT指令指定容器启动时应运行的命令。
使用 .dockerignore 文件
当对 Spring Boot 应用程序进行 Docker 化时使用.dockerignore文件从 Docker 构建上下文中排除不必要的文件和目录非常重要。通过使用.dockerignore文件您可以排除 Docker 镜像不需要的文件和目录从而减少构建上下文的大小并提高构建性能。以下是 Spring Boot 应用程序的 .dockerignore 示例文件
# 忽略根目录下的所有文件
*
# 包含 src 目录
!src/
# 包含 pom.xml 文件
!pom.xml
# 排除目标目录及其内容
target/在此示例中我们使用该.dockerignore文件排除根目录 (*) 中的所有文件除了构建 Spring Boot 应用程序所需的src/目录和pom.xml文件。我们还排除了target/目录该目录包含构建的工件Docker 映像不需要该目录。
通过使用.dockerignore文件我们可以减少构建上下文的大小并提高构建性能。Docker 只会复制.dockerignore构建上下文中包含的文件和目录并且会忽略文件中排除的文件和目录。 使用.dockerignore文件是对 Spring Boot 应用程序进行 Docker 化的良好实践因为它有助于确保尽可能高效、快速地构建 Docker 映像。 此外使用.dockerignore文件还可以帮助提高 Docker 镜像的安全性。通过排除不必要的文件和目录您可以减少 Docker 映像的攻击面并最大限度地降低暴露敏感信息或凭据的风险。例如如果您在构建目录中存储了配置文件或凭据则将它们排除在.dockerignore文件中将阻止它们包含在 Docker 映像中。 还值得注意的是该.dockerignore文件遵循与.gitignore文件类似的语法用于从 Git 存储库中排除文件和目录。如果您熟悉该.gitignore文件.dockerignore文件的使用是零学习成本。 总之使用.dockerignore文件是 Docker 化 Spring Boot 应用程序的良好实践。它可以帮助减少构建上下文的大小、提高构建性能并提高 Docker 映像的安全性。
使用标签
对 Spring Boot 应用程序进行 Docker 化时使用标签将元数据添加到 Docker 映像非常重要。标签是键值对可以添加到 Docker 映像中以提供有关映像的附加信息例如版本、维护者或构建日期。下面是一个示例 Dockerfile它使用标签将元数据添加到 Spring Boot 应用程序
FROM openjdk:11
LABEL maintainerJohn Doe john.doeexample.com
LABEL version1.0
LABEL descriptionMy Spring Boot application
COPY target/my-application.jar app.jar
ENTRYPOINT [java, -jar, /app.jar]在此示例中我们使用LABEL指令将元数据添加到 Docker 映像。我们为镜像的维护者、版本和描述添加了标签。这些标签提供有关 Docker 映像的附加信息并帮助用户了解映像包含的内容及其构建方式。
您可以使用docker inspect 命令查看 Docker 镜像的标签
$ docker inspect my-application
[{Id: sha256:...,RepoTags: [my-application:latest],Labels: {maintainer: John Doe john.doeexample.com,version: 1.0,description: My Spring Boot application},...}
]在本例中docker inspect命令显示my-application Docker 镜像的标签。标签提供有关镜像的其他信息可以帮助用户了解镜像是如何构建的以及如何使用它。
以这种方式使用标签可以帮助提高 Docker 镜像的可用性和可维护性。通过向 Docker 映像添加元数据您可以帮助用户了解镜像包含的内容及其构建方式。随着时间的推移此信息对于调试、故障排除和维护 Docker 镜像非常有用。