当前位置: 首页 > 图灵资讯 > 技术篇> Docker化Spring Boot应用

Docker化Spring Boot应用

来源:图灵教育
时间:2023-06-13 09:19:26

Docker 它是一种强大的工具,允许开发人员在容器中包装他们的应用程序,并在任何平台上轻松部署和运行。在对 Spring Boot 应用程序进行 Docker 每个开发人员都应遵循一些最佳实践,以确保应用程序的顺利高效运行。在本文中,我们将探索这些最佳实践,并提供代码示例和解释,以帮助您 Spring Boot 应用程序进行 Docker 化改造。

使用正确的基本镜像

在对 Spring Boot 应用程序进行 Docker 为应用程序选择正确的基本镜像是非常重要的。基本镜像提供了应用程序所需的基本操作系统和依赖项。选择正确的基本镜像有助于确保应用程序正在进行中 Docker 平稳高效地运行在容器中。

对于 Spring Boot 建议使用应用程序 OpenJDK 基础镜像。 OpenJDK 是 Java 开发工具包 (JDK) 实现并提供开源 Java 运行环境。 OpenJDK 基本镜像有不同的版本,比如 Java 8、Java 11 和 Java 16。以下是一个使用 OpenJDK 11 基础镜像的 Dockerfile 示例:

 

FROM openjdk:11COPY target/my-application.jar app.jarENTRYPOINT ["java", "-jar", "/app.jar"]

 

在这个例子中,我们使用它 openjdk:11 基础镜像为 Spring Boot 创建应用程序 Docker 镜像。我们会的 my-application.jar 将文件复制到容器中并使用 java 命令操作应用程序。

为 Spring Boot 使用正确的基本镜像有助于确保应用程序正确 Docker 平稳高效地运行在容器中。 OpenJDK 是 Java 由于它提供了轻量级和安全性,应用程序的流行选择 Java 运行环境。

尽可能简化镜像

在对 Spring Boot 应用程序进行 Docker 化时,保持 Docker 尽可能小的镜像大小很重要。较小的镜像大小有几个优点,如镜像传输时间更快、存储要求更低、容器启动时间更快等。

实现小镜像大小的一种方法是 Dockerfile 采用多阶段施工。在多阶段施工中,我们可以使用多个阶段 FROM 指令定义了构建过程中的不同阶段。每个阶段都可以有自己的一组指令和依赖项,最终的图像只包含最后阶段的文件和依赖项。以下是多阶段构建的使用 slim(精简) Spring Boot 镜像的 Dockerfile 示例:

 

# 第一阶段:构建应用FROM maven:3.8.3-jdk-11 AS buildCOPY . /appWORKDIR /appRUN mvn package -DskipTests# 第二阶段: 创建一个 slim 镜像FROM openjdk:11-jre-slimCOPY --from=build /app/target/my-application.jar /app.jarENTRYPOINT ["java", "-jar", "/app.jar"]

 

在这个例子中,第一阶段使用 Maven 构建基本镜像 Spring Boot 并生成应用程序 jar 文件。第二阶段使用 OpenJDK slim 基本镜像,是基本镜像的小版本,只包括 Java 运行环境。

COPY --from=build 指令将 jar 文件从第一阶段复制到第二阶段,ENTRYPOINT 指示指定容器启动时应运行的命令。

通过这种方式,多阶段构建允许我们创建一个简化 Docker 镜像,它只包含操作 Spring Boot 应用程序所需的依赖项和文件。这样做可以降低图像的大小,提高应用程序的性能。

使用环境变量

在对 Spring Boot 应用程序进行 Docker 使用环境变量来配置应用程序是非常重要的。使用环境变量可以在不重建的情况下改变应用程序的配置 Docker 镜像。

Spring Boot 可以使用应用程序 application.propertiesapplication.yml 指定配置属性的文件。在运行过程中可以使用环境变量覆盖这些属性,Spring Boot 它将自动映射到属性中。下面是一个 Dockerfile 例如,它为环境变量设置了一个例子 Spring Boot 应用程序指定使用哪个配置文件:

 

FROM openjdk:11ENV SPRING_PROFILES_ACTIVE=productionCOPY target/my-application.jar app.jarENTRYPOINT ["java", "-jar", "/app.jar"]

 

在这个例子中,我们将 SPRING_PROFILES_ACTIVE 环境变量设置为 production,这将激活 Spring Boot 在应用程序中 production 配置文件。

当容器启动时,在 ENTRYPOINT 指令中指定的 java 命令与 -jar 一起运行选项以启动 Spring Boot 因为我们设置了应用程序。 SPRING_PROFILES_ACTIVE 应用程序将自动使用环境变量 production 配置文件。

这样,环境变量就可以很容易地改变 Spring Boot 无需重建应用程序的配置 Docker 镜像。在操作容器时可以使用它。 -e 设置环境变量或使用选项 Docker Compose 定义环境变量的文件。

使用Docker Compose

在对 Spring Boot 应用程序进行 Docker 化时,使用 Docker Compose 定义应用程序的服务和依赖项是非常重要的。 Docker Compose 用于定义和操作多容器 Docker 应用程序工具。它允许我们在单个文件中定义应用程序 services, networks, 和 volumes,易于管理和部署我们的应用程序。这是一个定义 Spring Boot 应用程序和 MySQL 数据库示例 Docker Compose 文件:

 

version: '3'services:  db:    image: mysql:5.7    environment:      MYSQL_ROOT_PASSWORD: my-secret-pw      MYSQL_DATABASE: my-database    volumes:      - db_data:/var/lib/mysql  web:    build: .    ports:      - "8080:8080"    environment:      SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/my-database      SPRING_DATASOURCE_USERNAME: root      SPRING_DATASOURCE_PASSWORD: my-secret-pwvolumes:  db_data:

 

在这个例子中,我们定义了两种服务:dbwebdb 官方服务使用 MySQL 镜像采用环境变量设置 root 密码和数据库名称。它还为持久存储创建了命名卷。 db_data

Web 服务使用 . 构建上下文并公开端口 8080。它也是数据库 URL、用户名和密码设置环境变量,Spring Boot 使用这些变量连接应用程序 MySQL 数据库。

这样使用 Docker Compose 我们可以轻松管理和部署 Spring Boot 应用程序及其依赖项。可以使用单个命令启动 Docker Compose 文件中定义的所有服务都可以根据需要扩展或减少。此外,还可以使用 Docker Compose 定义额外的配置选项,例如 volumes、networks和environment 易于管理和部署应用程序的变量。

使用反向代理

在对 Spring Boot 应用程序进行 Docker 在转换过程中,使用反向代理来处理进入流量并将其分发给应用程序的容器是非常重要的。反向代理是一种位于应用程序和互联网之间的服务器,它根据特定的规则将要求转发给应用程序的容器。

使用反向代理有几个优点,如负载平衡SSL 安全终止和改进。通过使用反向代理,流量可以在多个容器之间平均分配,流量可以在代理级别终止 SSL 连接以减少应用程序容器的负载,并为应用程序增加额外的安全层。以下是一个定义 Spring Boot 应用程序和 Nginx 反向代理的 Docker Compose 文件示例:

 

version: '3'services:  web:    build: .    environment:      SPRING_PROFILES_ACTIVE: production    ports:      - "8080:8080"  proxy:    image: nginx    ports:      - "80:80"    volumes:      - ./nginx.conf:/etc/nginx/nginx.conf:ro    depends_on:      - web

 

在这个例子中,我们定义了两种服务:webproxyWeb Springg服务构建Springng Boot应用,暴露 8080 端口,proxy 根据服务使用官方Nginx镜像 nginx.conf 文件中定义的规则将转发请求 Web 服务。

以下是一个例子 nginx.conf 该文件定义了将请求转发给文件 Web 服务规则:

 

events {}http {    server {        listen 80;        location / {            proxy_pass http://web:8080;            proxy_set_header Host $host;            proxy_set_header X-Real-IP $remote_addr;            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;            proxy_set_header X-Forwarded-Proto $scheme;        }    }}

 

在这个例子中,我们使用它 proxy_pass 指令转发到端口 8080 上的 Web 服务。我们还设置了各种标签,以保留原始客户端 IP 协议信息。

以这种方式使用反向代理有助于改进 Spring Boot 应用程序 Docker 可扩展性、安全性和性能。通过使用反向代理,我们可以很容易地将流量分发到多个容器中,为应用程序添加额外的安全层,并通过代理级别终止 SSL 连接以减少应用程序容器的负载。

使用健康检查

在对 Spring Boot 应用程序进行 Docker 使用健康检查来监测应用程序的健康状况,并确保其正常运行是非常重要的。健康检查可用于检测应用程序何时不健康,并根据应用程序的健康状况自动恢复或缩放。

要向 Docker 可以在镜像中添加健康检查 Dockerfile 中使用 HEALTHCHECK 指令。 HEALTHCHECK 指令告诉 Docker 如何检查应用程序的健康状况。以下是一个 Dockerfile 示例,它向 Spring Boot 添加健康检查的应用程序:

 

FROM openjdk:11COPY target/my-application.jar app.jarHEALTHCHECK --interval=5s \            --timeout=3s \            CMD curl -f http://localhost:8080/actuator/health || exit ENTRYPOINTT ["java", "-jar", "/app.jar"]

 

在这个例子中,我们使用它 HEALTHCHECK 指令来检查 Spring Boot 应用程序的运行状态。 --interval 选项指定检查运行状态的频率,--timeout 选项指定等待响应的时间。 CMD 指令操作健康检查命令,这是一个 curl 命令,检查应用程序 /actuator/health 端点。

操作容器时可以使用 docker ps 命令检查容器的健康状况:

 

$ docker psCONTAINER ID   IMAGE                COMMAND                  CREATED         STATUS          PORTS                    NAMESe8e1a644   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 命令显示容器的健康状态,目前是健康状态。如果健康检查失败,容器将被标记为不健康,我们可以使用它 Docker Compose 或 Kubernetes 自动恢复或扩展容器等工具。

以这种方式使用健康检查有助于改善 Spring Boot 应用程序 Docker 化学后的可靠性和可用性。通过使用健康检查,我们可以自动检测应用程序中的问题并从中恢复,以确保应用程序始终供用户使用。

使用 Docker 缓存

在对 Spring Boot 应用程序进行 Docker 化时,使用 Docker 缓存加快施工过程,减少新的施工 Docker 镜像所需的时间非常重要。 Docker 缓存允许重用以前构建的缓存 Docker 每次构建新的镜像时,都要避免重建这些层。以下是一个使用 Docker 缓存加速施工过程 Dockerfile 示例:

 

FROM openjdk:11 as builderWORKDIR /appCOPY pom.xml .RUN mvn dependency:go-offlineCOPY src/ ./src/RUN mvn package -DskipTestsFROM openjdk:11COPY --from=builder /app/target/my-application.jar app.jarENTRYPOINT ["java", "-jar", "/app.jar"]

 

在这个例子中,我们首先使用多阶段构建在一个单独的层中 Spring Boot 应用程序,然后构建 jar 将文件复制到最终图像中。我们可以使用单独的层来构建过程 Docker 每次构建新图像时,缓存以避免重建依赖项。

施工过程的第一阶段使用 openjdk:11 并将基本镜像 pom.xml 将文件复制到容器中。然后它运行 mvn dependency:go-offline 命令下载应用程序所需的所有依赖项。该命令确保所有所需的依赖项都可以在本地使用,这将加快后续建设。

使用施工过程的第二阶段 openjdk:11 基本镜像并将源代码复制到容器中。然后它运行 mvn package 命令构建应用程序 jar 文件。由于我们在前一阶段下载了依赖性,Docker将使用缓存层跳过依赖性下载步骤。

最后,COPY --from=builder 指令将构建 jar 从构建器阶段到最终镜像复制文件,ENTRYPOINT 指示指定容器启动时应运行的命令。

这样使用 Docker 缓存有助于减少新建筑的建设 Docker 使用镜像所需的时间,加快部署过程。 Docker 缓存可以避免不必要的重建,并确保尽可能快速高效地构建 Docker 镜像。

使用.dockerignore文件

在对 Spring Boot 应用程序进行 Docker 化时,使用 .dockerignore 文件从 Docker 在上下文中构建不必要的文件和目录是非常重要的。构建上下文是非常重要的 Docker 用来构建 Docker 镜像的一组文件和目录。使用 .dockerignore 可以排除文件 Docker 镜像不需要的文件和目录,从而减少上下文的大小,提高施工性能。这是 Spring Boot 应用程序示例 .dockerignore 文件:

 

# 忽略根目录中的所有文件*# 包含 src 目录!src/# 包含 pom.xml 文件!pom.xml# 排除目标目录和内容标签/

 

在这个例子中,我们使用它 .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 文件是对 Spring Boot 应用程序进行 Docker 一种很好的化学方法。它有助于降低上下文建设的大小,提高建设性能,提高建设性能 Docker 镜像安全。

使用标签

在对 Spring Boot 应用程序进行 Docker 使用标签将元数据添加到化学中 Docker 镜像很重要。标签是键值对,可以添加到 Docker 镜像可以提供其他关于镜像的信息,如版本、维护器或构建日期。以下是使用标签添加元数据的标签 Spring Boot 应用程序的 Dockerfile 示例:

 

FROM openjdk:11LABEL maintainer="John Doe <john.doe@example.com>"LABEL version="1.0"LABEL description="My Spring Boot application"COPY target/my-application.jar app.jarENTRYPOINT ["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.doe@example.com>",            "version": "1.0",            "description": "My Spring Boot application"        },        ...    }]

 

在这个例子中,docker inspect 命令显示 my-application Docker 镜像标签。标签提供关于图像的额外信息,可以帮助用户了解图像的构建和使用。

以这种方式使用标签有助于改进标签 Docker 镜像的可用性和可维护性。添加元数据 Docker 镜像可以帮助用户了解镜像的内容以及它是如何构建的。随着时间的推移,该信息可用于调试、故障排除和维护 Docker 镜像。

使用容器编排

在对 Spring Boot 应用程序进行 Docker 在生产环境中,使用容器编排工具来管理和扩展应用程序非常重要。容器编排工具可以帮助我们自动部署、扩展和管理 Docker 在分布式环境中,容器更容易管理大量容器。

一些流行的 Docker 包括容器编排工具 Kubernetes、Docker Swarm 和 Apache Mesos。这些工具提供负载平衡、自动缩放、服务发现和滚动更新,以确保应用程序的可用性和响应用户。以下是 Spring Boot 应用程序的 Kubernetes 部署文件示例:

 

apiVersion: apps/v1kind: Deploymentmetadata:  name: my-application  labels:    app: my-applicationspec:  replicas: 3  selector:    matchLabels:      app: my-application  template:    metadata:      labels:        app: my-application    spec:      containers:      - name: my-application        image: my-registry/my-application:1.0        ports:        - containerPort: 8080

 

在这个例子中,我们使用它 Kubernetes 部署文件 Spring Boot 应用程序。部署文件指定我们运行应用程序的三个副本,并使用选择器来识别部署的一部分 pod。该部署文件还指定了应用程序运行的容器镜像和应用程序应调查的端口。

以这种方式使用容器编排工具有助于改进 Spring Boot 应用程序 Docker 可扩展性、可靠性和可用性。在分布式环境中,使用容器编排工具可以更容易地管理和扩展应用程序,从而更容易地确保应用程序的可用性和响应用户。

总结

Docker 化 Spring Boot 应用程序可能是一个复杂的过程,但开发人员可以确保他们的应用程序正在遵循这些最佳实践 Docker 容器运行平稳高效。这些最佳实践可以通过实施来使用 Docker 在任何平台上轻松部署应用程序的优势。