本文为官方文档直译版本。原文链接
Docker Compose 是一种流行的技术,可用于为应用程序所需的服务定义和管理多个容器。通常会在应用程序旁边创建一个 compose.yml
文件,用于定义和配置服务容器。
使用 Docker Compose 的典型工作流程是:运行 docker compose up
,在应用程序中连接已启动的服务,完成后再运行 docker compose down
。
Spring-boot-docker-compose
模块可以包含在项目中,为使用 Docker Compose 处理容器提供支持。将模块依赖关系添加到你的构建中,如以下列表中的 Maven 和 Gradle 所示:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-docker-compose</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
dependencies {
developmentOnly("org.springframework.boot:spring-boot-docker-compose")
}
为了让 Spring Boot 支持正常工作,路径上必须有
docker compose
或docker-compose CLI
应用程序。
当该模块作为依赖关系包含时,Spring Boot 将执行以下操作:
compose.yml
和其他常见的 compose 文件名compose.yml
调用 docker compose up
docker compose stop
如果启动应用程序时 Docker Compose 服务已在运行,Spring Boot 只会为每个受支持的容器创建服务连接Beans。它不会再次调用 docker compose up
,也不会在关闭应用时调用 docker compose stop
。
默认情况下,运行测试时 Spring Boot 的 Docker Compose 支持是禁用的。要启用它,请将
spring.docker.compose.skip.in-tests
设置为false
。
服务连接是与任何远程服务的连接。Spring Boot 的自动配置可以获取服务连接的详细信息,并利用它们建立与远程服务的连接。这样做时,连接细节优先于任何与连接相关的配置属性。
使用 Spring Boot 的 Docker Compose 支持时,服务连接会建立到容器映射的端口。
Docker compose 的使用方式通常是将容器内的端口映射到计算机上的临时端口。例如,Postgres 服务器可以使用 5432 端口在容器内运行,但在本地却被映射到一个完全不同的端口。服务连接将始终发现并使用本地映射的端口。
服务连接是通过使用容器的映像名称建立的。目前支持以下服务连接:
Connection Details | Matched on |
---|---|
ActiveMQConnectionDetails | 名为 “symptoma/activemq” 的容器 |
CassandraConnectionDetails | 名为 “cassandra” 的容器 |
ElasticsearchConnectionDetails | 名为 “elasticsearch” 的容器 |
JdbcConnectionDetails | 名为 “gvenzl/oracle-free”、“gvenzl/oracle-xe”、“mariadb”、“mssql/server”、"mysql "或 "postgres "的容器 |
MongoConnectionDetails | 名为 “mongo” 的容器 |
Neo4jConnectionDetails | 名为 “neo4j” 的容器 |
OtlpMetricsConnectionDetails | 名为 “otel/opentelemetry-collector-contrib” 的容器 |
OtlpTracingConnectionDetails | 名为 “otel/opentelemetry-collector-contrib” 的容器 |
PulsarConnectionDetails | 名为 “apachepulsar/pulsar” 的容器 |
R2dbcConnectionDetails | 名为 “gvenzl/oracle-free”、“gvenzl/oracle-xe”、“mariadb”、“mssql/server”、"mysql "或 "postgres "的容器 |
RabbitConnectionDetails | 名为 “rabbitmq” 的容器 |
RedisConnectionDetails | 名为 “redis” 的容器 |
ZipkinConnectionDetails | 名为 “openzipkin/zipkin” 的容器 |
有时,您可能需要使用自己版本的镜像来提供服务。您可以使用任何自定义镜像,只要其行为方式与标准镜像相同即可。具体来说,标准镜像支持的环境变量也必须在自定义镜像中使用。
如果你的映像使用不同的名称,你可以在 compose.yml
文件中使用一个标签,这样 Spring Boot 就能提供服务连接。使用名为 org.springframework.boot.service-connection
的标签提供服务名称。
例如:
services:
redis:
image: 'mycompany/mycustomredis:7.0'
ports:
- '6379'
labels:
org.springframework.boot.service-connection: redis
如果您在 compose.yml
中定义了一个容器映像,但不想将其连接到您的应用程序,您可以使用标签来忽略它。任何带有 org.springframework.boot.ignore
标签的容器都会被 Spring Boot 忽略。
例如:
services:
redis:
image: 'redis:7.0'
ports:
- '6379'
labels:
org.springframework.boot.ignore: true
如果编译文件与应用程序不在同一目录下,或者文件名不同,可以在 application.properties
或 application.yaml
中使用 spring.docker.compose.file
指向不同的文件。属性可以定义为准确的路径,也可以定义为与应用程序相对的路径。
例如:
spring:
docker:
compose:
file: "../my-compose.yml"
Docker Compose 启动的容器可能需要一段时间才能完全就绪。检查就绪状态的推荐方法是在 compose.yml
文件的服务定义下添加健康检查(healthcheck
)部分。
由于在 compose.yml
文件中省略健康检查(healthcheck
)配置的情况并不少见,因此 Spring Boot 也会直接检查服务是否就绪。默认情况下,当 TCP/IP 连接可以建立到映射端口时,容器就被视为就绪。
您可以在 compose.yml
文件中添加 org.springframework.boot.readiness-check.tcp.disable
标签,在每个容器上禁用此功能。
例如:
services:
redis:
image: 'redis:7.0'
ports:
- '6379'
labels:
org.springframework.boot.readiness-check.tcp.disable: true
您还可以在 application.properties
或 application.yaml
文件中更改超时值:
spring:
docker:
compose:
readiness:
tcp:
connect-timeout: 10s
read-timeout: 5s
整体超时可使用 spring.docker.compose.readiness.timeout
进行配置。
默认情况下,Spring Boot 会在应用程序启动时调用 docker compose up
,在关闭时调用 docker compose stop
。如果你希望使用不同的生命周期管理,可以使用 spring.docker.compose.lifecycle-management
属性。
支持以下值:
none
- 不启动或停止 Docker Composestart-only
- 在应用程序启动时启动 Docker Compose 并让它继续运行start-and-stop
- 应用程序启动时启动 Docker Compose,JVM 退出时停止 Docker Compose此外,你还可以使用 spring.docker.compose.start.command
属性来更改是使用 docker compose up
还是 docker compose start
。通过 spring.docker.compose.stop.command
属性,你可以配置是使用 docker compose down
还是 docker compose stop
。
下面的示例显示了如何配置生命周期管理:
spring:
docker:
compose:
lifecycle-management: start-and-stop
start:
command: start
stop:
command: down
timeout: 1m
Docker Compose 配置文件与 Spring 配置文件类似,可以让你针对特定环境调整 Docker Compose 配置。如果要激活特定的 Docker Compose 配置文件,可以在application.properties
或application.yaml
文件中使用 spring.docker.compose.profiles.active
属性:
spring:
docker:
compose:
profiles:
active: "myprofile"