Spring Boot 3.1 中的 Docker Compose 支持

工程 | Moritz Halbritter | 2023年6月21日 | ...

Spring Boot 3.1 中的 Docker Compose 支持建立在 ConnectionDetails 抽象之上,我们在另一篇博文中对此进行了介绍。如果您还没有阅读过,请在阅读本文之前先阅读它。

Docker Compose "是一种用于定义和运行多容器 Docker 应用程序的工具"。Docker Compose 配置文件(通常命名为 docker-compose.yamlcompose.yaml)允许您定义服务。这些服务必须具有名称和 Docker 镜像。您还可以选择定义环境变量、公开端口、标签、服务之间的关系等等。

这是一个简单的 Docker Compose 文件的典型示例

services:
  database:
    image: 'postgres:15.2'
    ports:
    - '5432'
    environment:
    - 'POSTGRES_USER=myuser'
    - 'POSTGRES_DB=mydatabase'
    - 'POSTGRES_PASSWORD=secret'

它定义了一个名为 database 的服务,该服务使用 postgres:15.2 Docker 镜像。它公开容器端口 5432(这是默认的 PostgreSQL 端口),Docker 将在启动时选择一个随机的主机端口。此外,它还定义了一些环境变量,用于配置用户、密码和数据库名称。

如果您在该文件所在的目录中运行 docker compose up,Docker Compose 将首先检查此服务是否已在运行。如果未运行,它将使用 postgres:15.2 镜像启动一个新容器并对其进行配置。

您现在可以运行 docker compose ps 并查看容器是否已启动

$ docker compose ps
NAME                             IMAGE               COMMAND                  SERVICE             CREATED             STATUS              PORTS
docker-compose-test-database-1   postgres:15.2       "docker-entrypoint.s…"   database            7 seconds ago       Up 6 seconds        0.0.0.0:32768->5432/tcp, :::32768->5432/tcp

要在 Spring Boot 3.1 之前的应用程序中开发该服务,您必须设置一些配置属性,可能在某种“开发人员”配置文件中

spring.datasource.url=jdbc:postgresql://127.0.0.1:32768/mydatabase
spring.datasource.username=myuser
spring.datasource.password=secret

这将配置 Spring Boot 以使用在 Docker 容器内运行的 PostgreSQL 数据库(连接到主机端口 32768)。

使用完服务后,您通常会运行 docker compose down 以停止并销毁容器。但是,当您再次启动它们时,您会发现动态端口已更改

$ docker compose ps
NAME                             IMAGE               COMMAND                  SERVICE             CREATED             STATUS              PORTS
docker-compose-test-database-1   postgres:15.2       "docker-entrypoint.s…"   database            4 minutes ago       Up 1 second         0.0.0.0:32769->5432/tcp, :::32769->5432/tcp

哦,不,这意味着您现在必须更新应用程序配置!

幸运的是,Docker Compose 有一个解决方案。不要使用随机端口,使用固定的主机端口

services:
  database:
    image: 'postgres:15.2'
    ports:
      - '15432:5432'
    environment:
      - 'POSTGRES_USER=myuser'
      - 'POSTGRES_DB=mydatabase'
      - 'POSTGRES_PASSWORD=secret'

现在,每次您启动容器时,它都可以在 localhost:15432 上访问。

这可以工作,但存在另一个问题。如果您正在开发多个应用程序,其中每个应用程序都有自己的数据库(这在微服务架构中非常常见),则必须记住使用不同的主机端口。如果您不这样做,一些 docker compose up 命令会失败,因为端口已被使用。

现在是好消息。使用 Spring Boot 3.1,这变得容易多了。您可以继续使用随机主机端口,但无需指定配置属性,也无需在多个位置重复用户名、密码等。您也不必记住在启动应用程序之前运行 docker compose up

Spring Boot 3.1 将检测到存在 Docker Compose 文件,并在连接到服务之前为您运行 docker compose up。如果服务已在运行,它也会检测到,并使用它们。它还将在应用程序关闭时运行 docker compose stop——过去那些占用宝贵内存的残留 Docker 容器的日子一去不复返了。

Docker Compose 启动的镜像会被自动检测并用于创建指向服务的 ConnectionDetails bean。这意味着您无需在配置中放置属性,也无需记住如何构建 PostgreSQL JDBC URL 等等。

使用 Spring Boot 3.1,您只需提供 compose.yaml 文件,让 Spring Boot 处理其余工作即可。它可以正常工作!

在撰写本文时,我们支持 以下 Docker 镜像

想自己尝试一下吗?我们 准备了一些文档来帮助您入门

我们还为 start.spring.io 添加了对 Docker Compose 的支持,让您可以更快地开始!例如,如果您生成一个具有“Docker Compose 支持”和“PostgreSQL 驱动程序”依赖项的项目,您将免费获得一个合理的 compose.yaml!这难道不令人惊叹吗?!

“好吧,好吧”,我听到您说,“但是我们公司使用的自定义 Redis 镜像怎么办?”我们已经为您准备好了:您可以构建自己的镜像,在其上添加标签,Spring Boot 将假装它是官方镜像。只需确保您使用与官方镜像相同的环境变量名称即可。

我们还支持 忽略服务、具有 不常见名称的 Docker Compose 文件 以及 Docker Compose 配置文件

我们真心希望您喜欢新的 Docker Compose 功能!如果您希望看到更多受支持的服务,或者有其他改进的想法,请联系我们

获取 Spring 时事通讯

通过 Spring 时事通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您快速提升技能。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部