在 Docker 中,restart: unless-stopped
是一种容器重启策略,用于控制容器在退出或宿主机重启后的行为。以下是详细解释:
unless-stopped
的含义
• 定义:
当容器 非人为主动停止 时(例如进程崩溃、系统重启等),Docker 会自动重启该容器。
如果容器是被 手动停止(如执行 docker stop
或 docker-compose stop
),则不会自动重启。
与其他重启策略的对比
策略 | 行为 |
---|---|
no | 不自动重启容器(默认行为) |
on-failure | 仅在容器以 非0状态码退出 时重启(可指定最大重启次数,如 on-failure:5 ) |
always | 无论退出状态如何(包括手动停止后),Docker 服务重启时都会自动重启容器 |
unless-stopped | 自动重启容器,除非容器被显式停止(最常用的生产环境策略) |
使用场景示例
场景 1:容器因异常退出
• 容器因程序错误(如崩溃、OOM)退出 → 自动重启。
场景 2:宿主机重启
• 宿主机重启后,Docker 服务恢复 → 自动重启容器。
场景 3:手动停止容器
• 执行 docker stop
或 docker-compose stop
→ 不会自动重启。
配置方法
在 docker-compose.yml
中
services:
myapp:
image: nginx
restart: unless-stopped # 应用重启策略
在 docker run
命令中
docker run -d --restart=unless-stopped nginx
验证行为
-
手动停止容器:
docker stop my-container # 查看容器状态(不会自动重启) docker ps -a | grep my-container
-
模拟异常退出:
# 强制终止容器进程(触发非0退出) docker kill --signal=SIGKILL my-container # 查看容器状态(自动重启) docker ps | grep my-container
注意事项
• 与 always
的区别:
若容器被手动停止后,重启 Docker 服务(如 systemctl restart docker
),always
会重新启动容器,而 unless-stopped
不会。
• 日志与调试:
频繁重启的容器可能是程序存在缺陷,可通过 docker logs --tail=100 my-container
检查日志。
总结
restart: unless-stopped
是 平衡可靠性与可控性 的最佳实践策略,适用于需要长期运行的服务(如 Web 服务器、数据库),同时允许运维人员在维护时通过手动停止容器避免干扰。