Spring Boot 应用 Docker 化的 8 个最佳实践-Spring专区论坛-技术-SpringForAll社区

Spring Boot 应用 Docker 化的 8 个最佳实践

Docker 在现代软件开发中起着举足轻重的作用,Spring Boot 应用程序对其影响并不陌生。现在,经典的借口,“它在我的机器上工作”有了一个新朋友:Docker。通过遵循最佳实践,您可以确保 Spring Boot 应用程序的 Docker化过程顺利高效。

在本文中,我们将探讨最佳实践,并提供示例来指导您完成 Spring Boot 应用程序的 Docker化过程。

这一次,我们将改变方式——我们将从实际实现开始,然后回过头来涵盖理论。这种方法使我们能够在浏览时将理论直接与示例联系起来。

我们有一个标准的 Spring Boot 应用程序,现在,我们将在坚持最佳实践的同时对其进行Docker化。

Docker化 Spring Boot 应用程序

# Stage 1: Build Step
FROM 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命令来验证映像是否已创建。

d2b5ca33bd20240329132133

一旦我们有了映像,我们就可以运行容器,通过运行 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 最佳实践。Dockerization 不一定很复杂;这是关于做出明智的选择。因此,通过这些做法,请继续对应用程序进行 Dockerize。

请登录后发表评论

    没有回复内容