1. 概述
在本教程中,我们将学习如何在 Docker Compose 中使用 重启策略(restart policy) 来管理容器的生命周期。
我们会先介绍 Docker 原生的重启策略配置方式,然后重点讲解在 Docker Compose 中如何配置重启策略,包括:
- 普通模式(normal mode)
- 群集模式(swarm mode)
2. Docker 原生重启策略
重启策略是 Docker 提供的自动重启容器的机制,用于应对容器异常退出或服务崩溃的情况。
需要注意以下几点:
- 容器首次启动后至少运行 10 秒以上,重启策略才会生效,防止容器刚启动就失败导致无限重启。
- 如果你手动停止容器,重启策略不会生效。只有当容器异常退出,或 Docker 守护进程重启时,策略才会触发。
Docker 提供了以下几种重启策略:
策略 | 描述 |
---|---|
no |
默认策略,不会自动重启容器 ❌ |
on-failure[:max-retries] |
容器退出码非 0 时重启,可选最大重试次数 ✅ |
always |
总是重启容器,无论退出状态 ✅ |
unless-stopped |
总是重启容器,除非你手动停止它 ✅ |
示例:CLI 设置重启策略
docker run --restart always my-service
上述命令表示容器 my-service
会在退出后自动重启。但如果你手动执行 docker stop
停止容器,除非 Docker 守护进程重启,否则不会触发重启。
3. 环境准备
为了演示 Docker Compose 中的重启策略,我们将使用一个 Spring Boot 项目:spring-cloud-docker
,该项目包含两个服务:
message-server
(监听端口 8888)product-server
(监听端口 9999)
✅ 启动服务:
docker-compose up --detach --build
✅ 查看运行状态:
docker ps
输出示例:
Name Command State Ports
--------------------------------------------------------------------------------
message-server java -jar /message-server.jar Up 0.0.0.0:18888->8888/tcp
product-server java -jar /product-server.jar Up 0.0.0.0:19999->9999/tcp
你也可以访问 http://localhost:18888
和 http://localhost:19999
来验证服务是否正常。
4. Docker Compose 普通模式下的重启策略
在普通模式(非 swarm)下,Docker Compose 支持通过 restart
属性配置重启策略,语法与 Docker CLI 完全一致。
示例:docker-compose.yml 配置
message-server:
container_name: message-server
build:
context: docker-message-server
dockerfile: Dockerfile
image: message-server:latest
ports:
- 18888:8888
networks:
- spring-cloud-network
restart: no
product-server:
container_name: product-server
build:
context: docker-product-server
dockerfile: Dockerfile
image: product-server:latest
ports:
- 19999:9999
networks:
- spring-cloud-network
restart: on-failure
说明:
message-server
不会自动重启 ❌product-server
只有在非 0 退出码时才会重启 ✅
⚠️ 注意:restart
属性直接放在服务级别,不是嵌套在 deploy
下。
5. Docker Compose 群集模式下的重启策略
在 swarm 模式下,Docker Compose 支持更丰富的重启策略配置,通过 restart_policy
属性定义,支持如下参数:
参数 | 说明 |
---|---|
condition |
重启条件:none 、on-failure 、any |
delay |
重启间隔时间 |
max_attempts |
最大重试次数 |
window |
判定重启是否成功的窗口时间 |
示例:swarm 模式配置
首先确认使用 Docker Compose v3:
version: '3'
然后配置重启策略:
message-server:
container_name: message-server
build:
context: docker-message-server
dockerfile: Dockerfile
image: message-server:latest
ports:
- 18888:8888
networks:
- spring-cloud-network
deploy:
restart_policy:
condition: any
delay: 5s
max_attempts: 3
window: 120s
product-server:
container_name: product-server
build:
context: docker-product-server
dockerfile: Dockerfile
image: product-server:latest
ports:
- 19999:9999
networks:
- spring-cloud-network
deploy:
restart_policy:
condition: on-failure
delay: 3s
max_attempts: 5
window: 60s
⚠️ 注意:restart_policy
必须写在 deploy
属性下,仅适用于 swarm 模式。
6. 总结
本文介绍了 Docker Compose 中的重启策略配置方式,分为:
模式 | 属性名 | 支持参数 |
---|---|---|
普通模式 | restart |
no , on-failure , always , unless-stopped |
群集模式 | restart_policy |
condition , delay , max_attempts , window |
✅ 使用建议:
- 如果你只是本地开发或单机部署,使用普通模式即可。
- 如果你部署在集群环境(swarm mode),建议使用
restart_policy
配置更精细的重启策略。
所有示例代码已整理在 GitHub 上:spring-cloud-docker