7.9 Docker Compose Support
Docker Compose作为一种流行的技术,可根据你的应用所需定义和管理多个container。通常是通过创建compose.yml文件来配置service container。
通常的工作流是当应用启动前,使用docker compose up来启动Docker Compose,当你应用结束后,使用docker compose down来关闭Docker Compose。
spring-boot-docker-compose模块可以加入到项目中,并为使用Docker Compose提供支持。如下所示添加依赖
maven
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-docker-compose</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
添加该依赖后,SpringBoot会做下列事情
- 搜索
compose.yml和其他compose文件在你的应用文件夹。 - 使用已发现
compose.yml文件调用docker compose up - 为所支持的container 创建service connection beans
- 当应用shutdown时,调用
docker compose stop
Note
需要注意,在你的path上需要有docker compose或者docker compose CLI应用,这样SpringBoot对Docker compose的支持才能正常工作。
Note
默认情况下 SpringBoot对Docker Compose的支持在运行测试时是被禁用的,你可以通过设置spring.docker.compose.skip.in-tests为false来启用。
7.9.1 Service Connection
service connection是与任何remote service建立的连接。SpringBoot自动配置会建立这些service connection。(?)这样做会使connection detail比其他任何connection-related configuration properties优先级要高。
当使用SpringBoot的Docker Compose support时,service connection会建立到容器所匹配到的本地端口上。
Note
例如,Postgres server在container内部使用5432端口,但是可被匹配到本地的完全不同的端口上。而service connection会使用这些本地端口。
Service connection使用container的image name来进行建立的。下列service connections当前被支持
| Connection Details | Matched on |
|---|---|
CassandraConnectionDetails | Containers named "cassandra" |
ElasticsearchConnectionDetails | Containers named "elasticsearch" |
JdbcConnectionDetails | Containers named "gvenzl/oracle-xe", "mariadb", "mssql/server", "mysql", or "postgres" |
MongoConnectionDetails | Containers named "mongo" |
R2dbcConnectionDetails | Containers named "gvenzl/oracle-xe", "mariadb", "mssql/server", "mysql", or "postgres" |
RabbitConnectionDetails | Containers named "rabbitmq" |
RedisConnectionDetails | Containers named "redis" |
ZipkinConnectionDetails | Containers named "openzipkin/zipkin". |
7.9.2 Custom Images
有时你可能想用自己的image来提供服务。只要自定义镜像的行为和标准镜像相同,你就可以使用任何自定义镜像。具体来说,自定义镜像必须支持所有标准镜像支持的环境变量。
如果你的镜像使用了不同的名称,你可以在compose.yml中使用label来让SpringBoot建立service connection。使用l名为org.springframework.boot.service-connection的label来提供service name,如下所示
services:
redis:
image: 'mycompany/mycustomredis:7.0'
ports:
- '6379'
labels:
org.springframework.boot.service-connection: redis
7.9.3 Skipping Specific Containers
如果你在compose.yml定义了一个container image,但是你并不想让你的应用为该image建立service connection,你可以使用一个label(org.springframework.boot.ignore)来忽略掉。如下所示
services:
redis:
image: 'redis:7.0'
ports:
- '6379'
labels:
org.springframework.boot.ignore: true
7.9.4 Using a Specific Compose File
当你要使用的compose文件不在你应用同级的文件夹时 或 当你的compose文件命名与官方要求不同时,你可以使用配置项spring.docker.compose.file来指定compose 文件。可以配置为绝对路径或者你应用的相对路径。
spring.docker.compose.file=../my-compose.yml
7.9.5 Waiting for Container Readiness
由于Docker Compose中定义的容器启动起来需要一段时间才能可用。建议在compose.yml中添加healthcheck。
由于在compose.yml中省略healthcheck配置并不罕见,因此SpringBoot也会对服务的可用状态进行检测。默认情况下,当TCP/IP可被连接的时候,容器被视为可用。
如果想要禁用掉healthcheck,你可以添加org.springframework.boot.readiness-check.tcp.disablelabel。
services:
redis:
image: 'redis:7.0'
ports:
- '6379'
labels:
org.springframework.boot.readiness-check.tcp.disable: true
你还可以对timeout值进行配置
spring.docker.compose.readiness.tcp.connect-timeout=10s
spring.docker.compose.readiness.tcp.read-timeout=5s
7.9.6 Controlling the Docker Compose Lifecycle
默认情况,SpringBoot会在启动时调用docker compose up,当结束时调用docker compose down。如果你想要不同的lifecycle控制方式,可用配置项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启动时是使用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
spring.docker.compose.start.command=start
spring.docker.compose.stop.command=down
spring.docker.compose.stop.timeout=1m
7.9.7 Activating Docker Compose Profiles
Docker Compose与Spring Profile类似,能根据具体的环境对Docker Compose进行调整。如果你想要激活一个Docker Compose profile,你可以使用配置项spring.docker.compose.profiles.active.
spring.docker.compose.profiles.active=myprofile