提升自己
VMware 提供培训和认证,助您加速发展。
了解更多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 会在启动时选择一个随机的主机端口。此外,它还定义了一些环境变量来配置用户、密码和数据库名称。
如果在该文件所在的目录中运行 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 镜像
cassandra
elasticsearch
gvenzl/oracle-xe
mariadb
mssql/server
mysql
postgres
mongo
rabbitmq
redis
openzipkin/zipkin
想自己尝试一下吗?我们已经准备了一些文档供您入门。
我们还在 start.spring.io 中添加了对 Docker Compose 的支持,让您更快地入门!例如,如果您生成一个包含“Docker Compose 支持”和“PostgreSQL 驱动”依赖的项目,您将免费获得一个合理的 compose.yaml
文件!这不是很棒吗?!
“好吧,好吧”,我听到您说,“但是我们公司使用的自定义 Redis 镜像怎么办?”我们已经为您考虑到了:您可以构建自己的镜像,在其上添加标签,然后 Spring Boot 会假装它是官方镜像。只需确保您使用的环境变量名称与官方镜像相同即可。
我们还支持忽略服务、名称不寻常的 Docker Compose 文件以及 Docker Compose 配置文件(profiles)。
我们真诚地希望您喜欢新的 Docker Compose 功能!如果您希望看到更多服务得到支持,或有其他改进建议,请联系我们。