Spring Boot 3.1 中的 Docker Compose 支持

工程 | 莫里茨·哈尔布里特 | 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://: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 社区所有即将举行的活动。

查看所有