Spring Boot 3.1中的Docker Compose支持建立在 ConnectionDetails
抽象的基础上,我们在 上一篇文章中介绍了这一点。如果你还没有读过它,请在读这篇文章之前读一下。
Docker Compose “是一个用于定义和运行多容器Docker应用程序的工具”。Docker Compose配置文件,通常命名为 docker-compose.yaml
或 compose.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镜像:
- Cassandra -
cassandra
- Elasticsearch -
elasticsearch
- Oracle database -
gvenzl/oracle-xe
- MariaDB -
mariadb
- Microsoft SQL server -
mssql/server
- MySQL -
mysql
- PostgreSQL -
postgres
- MongoDB -
mongo
- RabbitMQ -
rabbitmq
- Redis -
redis
- Zipkin -
openzipkin/zipkin
想自己尝试一下吗?我们已经 准备了一些文件让你快速开始。
我们还在 start.springboot.io 中增加了对Docker Compose的支持,以使你更快地开始工作! 例如,如果你生成一个具有 “Docker Compose support” 和 “PostgreSQL drive” 依赖的项目,你将得到一个合理的 compose.yaml
!
“但我们公司使用的自定义Redis镜像怎么办?”。你可以建立自己的镜像,给它 打上标签,Spring Boot会假装它是官方镜像。只要确保你使用与官方镜像相同的环境变量名。
我们还支持 忽略服务、具有 不寻常名称的Docker Compose文件,以及Docker Compose profiles。
我们真的希望你喜欢 Docker Compose 的新功能! 如果你想看到更多的服务被支持,或者有其他改进的想法,请 与我们联系。