Spring Boot 3.1 中的 Docker Compose 支持

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 将在启动时随机选择一个主机端口。此外,它还定义了一些环境变量,配置了用户(user)、密码(password)和数据库名称。

如果你在这个文件所在的目录中运行 docker compose,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 之前的应用程序中针对该服务进行开发,你必须把一些配置属性放在适当的位置,也许在某种 “developer” profile 中:

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:
      - '5432:15432'
    environment:
      - 'POSTGRES_USER=myuser'
      - 'POSTGRES_DB=mydatabase'
      - 'POSTGRES_PASSWORD=secret'

现在,每次你启动容器时,它都可以在 localhost:15432 上到达。

这很有效,但有一个不同的问题。如果你正在开发多个应用程序,每个应用程序都有自己的数据库(这在微服务架构中很常见),你必须记住使用不同的主机端口。如果你不这样做,一些docker编译命令就会失败,因为该端口已经被使用了。

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

Spring Boot 3.1会检测到有一个 Docker Compose 文件存在,并在连接到服务之前为你运行 docker compose。如果服务已经在运行,它也会检测到,并会使用它们。当应用程序关闭时,它也会运行 docker compose stop

Docker Compose启动的镜像会被自动检测,并用于创建指向服务的 ConnectionDetails Bean。这意味着你不必在配置中加入属性,不必记住如何构建PostgreSQL JDBC URL,等等。

有了Spring Boot 3.1,你所需要做的就是提供 compose.yaml 文件,让Spring Boot来解决剩下的问题。它就是在工作!

At the time of writing, we support the following Docker images:

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

想自己尝试一下吗?我们已经 准备了一些文件让你快速开始

我们还在 start.springboot.io 中增加了对Docker Compose的支持,以使你更快地开始工作! 例如,如果你生成一个具有 “Docker Compose support” 和 “PostgreSQL drive” 依赖的项目,你将得到一个合理的 compose.yaml !

“但我们公司使用的自定义Redis镜像怎么办?”。你可以建立自己的镜像,给它 打上标签,Spring Boot会假装它是官方镜像。只要确保你使用与官方镜像相同的环境变量名。

我们还支持 忽略服务、具有 不寻常名称的Docker Compose文件,以及Docker Compose profiles

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

原文: Docker Compose Support in Spring Boot 3.1

1 Like

:upside_down_face:
spring对docker compose这玩意的支持目前有问题。

1.目前不能写web,只能扔数据库,不然本地程序和docker会造成端口冲突,或者使用远程docker跑。
2.但是扔数据库的话,测试数据要先造好docker,不然等脚本跑完数据,整个程序的启动时间反而因为docker变慢了,有点鸡肋

各位有好的解决方案可以回复我,感谢大家的支持和认同