Docker 在现代软件开发中起着举足轻重的作用,Spring Boot 应用程序对其影响并不陌生。现在,经典的借口,“它在我的机器上工作”有了一个新朋友:Docker。通过遵循最佳实践,您可以确保 Spring Boot 应用程序的 Docker化过程顺利高效。
在本文中,我们将探讨最佳实践,并提供示例来指导您完成 Spring Boot 应用程序的 Docker化过程。
这一次,我们将改变方式——我们将从实际实现开始,然后回过头来涵盖理论。这种方法使我们能够在浏览时将理论直接与示例联系起来。
我们有一个标准的 Spring Boot 应用程序,现在,我们将在坚持最佳实践的同时对其进行Docker化。
Docker化Spring Boot 应用程序# Stage 1: Build StepFROM maven:3.8.4-openjdk-11-slim AS build
WORKDIR /app
# Copy only the POM file to cache dependency
COPY pom.xml .
RUN mvn dependency:go-offline
# Copy the rest of the application source code and build
COPY src src
RUN mvn clean package -DskipTests
# Stage 2: Final Steps
FROM openjdk:11.0.12-jre-slim
WORKDIR /app
# Create a non-root user for running the application
RUN adduser --disabled-password --gecos '' springuser
USER springuser
# Copy the WAR file from build stage
ARG VERSION=0.0.1
COPY --from=build /app/target/demo-${VERSION}-SNAPSHOT.war app.war
# Expose the application port
EXPOSE 8080
# Running command, specify resource constraints
CMD ["java", "-Xmx256m", "-jar", "app.war"]
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Git ###
.git/
### Docker related ###
Dockerfile
.dockerignore
构建映像并运行容器我们将通过运行 docker build --build-arg VERSION=0.0.1 -t spring-boot-demo-app .来启动使用上述 Dockerfile 创建 Docker 映像。
通过运行docker images命令来验证映像是否已创建。
一旦我们有了映像,我们就可以运行容器,通过运行 docker run -p 8080:8080 --name spring-boot-demo-app-container spring-boot-demo-app.
就是这样,您的应用程序应该在端口 8080 上运行。
现在,让我们深入了解我们在上述代码中采用的最佳实践。
最佳实践选择官方和经过验证的镜像在对 Spring Boot 应用程序进行 Docker 化时,我们从与 Java 和 Spring Boot 相关的官方和经过验证的基础映像开始。例如,我们选择了 maven 和 openjdk 作为我们的用例。
选择特定镜像版本为了增强可预测性,我们选择显式图像标记,而不是依赖最新标记,以确保稳定性。
Choose lightweight images 选择轻量级图像我们选择较小的基础镜像,如高山或纤薄,以增强便携性并减少脆弱性。
优化镜像层缓存构建 Dockerfile 以优化缓存涉及从最少到最频繁的更改排列命令。例如,我们首先只复制pom.xml文件,然后安装依赖项,复制源代码,最后打包它。
利用 .dockerignore 文件使用过 Git 的人一定熟悉这个概念。通过使用 .dockerignore 文件修剪不必要的文件来减小图像大小并提高生成性能。
采用多阶段构建使用多阶段构建优化效率并最小化最终映像大小,确保简化的 Docker 化应用程序。在第一阶段,我们使用 Maven 编译 Spring Boot 应用程序,随后,在第二阶段,我们使用 JRE 部署它,利用初始阶段生成的 WAR 文件。
用户权限管理坚持最小权限原则,避免以 root 用户权限运行容器,增强安全性。例如,我们建立了一个名为springuser并转换到其使用的用户。
内存限制在 Docker CMD 中为 Spring Boot 应用程序设置内存约束,指定 Xmx 值,例如,Xmx256m 表示 256 MB。
总而言之,通过浏览这些示例,您已经深入了解了为 Spring Boot 应用程序量身定制的 Docker 最佳实践。Docker化 不一定很复杂;这是关于做出明智的选择。因此,通过这些做法,请继续对应用程序进行Docker化。
来源:https://spring4all.com/forum-post/6569.html