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://localhost: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 配置文件(profiles)

我们真诚地希望您喜欢新的 Docker Compose 功能!如果您希望看到更多服务得到支持,或有其他改进建议,请联系我们

获取 Spring 新闻通讯

订阅 Spring 新闻通讯,保持联系

订阅

提升自己

VMware 提供培训和认证,助您加速发展。

了解更多

获得支持

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

了解更多

即将举行的活动

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

查看全部