Docker Compose Support (Spring Boot 3.1.5 Reference 翻译)

227 阅读3分钟

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-testsfalse来启用。

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 DetailsMatched on
CassandraConnectionDetailsContainers named "cassandra"
ElasticsearchConnectionDetailsContainers named "elasticsearch"
JdbcConnectionDetailsContainers named "gvenzl/oracle-xe", "mariadb", "mssql/server", "mysql", or "postgres"
MongoConnectionDetailsContainers named "mongo"
R2dbcConnectionDetailsContainers named "gvenzl/oracle-xe", "mariadb", "mssql/server", "mysql", or "postgres"
RabbitConnectionDetailsContainers named "rabbitmq"
RedisConnectionDetailsContainers named "redis"
ZipkinConnectionDetailsContainers 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 Compose
  • start-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