确保 Docker 服务自启后,还需要为每个容器单独设置策略,告诉 Docker 在服务启动或重启时如何处理它们。最推荐的方式是使用 Docker 自带的--restart策略。这里有几种常用策略:
unless-stopped 和 always 在容器运行期间的行为完全一致(即容器因崩溃、报错退出时,都会自动重启),它们唯一的区别在于:Docker 服务重启后,是否恢复一个被手动停止的容器。
| 场景 | always 策略 | unless-stopped 策略 |
|---|---|---|
| 容器运行中崩溃 | ✅ 自动重启 | ✅ 自动重启 |
| 手动执行 docker stop 停止 | ❌ 立即停止,不会重启 | ❌ 立即停止,不会重启 |
| 系统重启 / Docker 服务重启后 | ✅ 强制启动(即使你之前手动停止了它,也会自动启动) | ❌ 保持停止(你手动停过,系统重启后就不会自动起来) |
为什么推荐用 unless-stopped
在绝大多数生产环境和日常开发中,unless-stopped 是最佳实践。
什么场景用 always?
只有在极少数需要“死缠烂打、无论如何都要跑起来”的核心基础服务(比如日志收集客户端、监控探针)才用 always,确保即使误操作停止了,机器一重启它也会立刻恢复。
# 创建一个无论什么原因退出都会自动重启的 Nginx 容器
docker run -d --restart unless-stopped --name nginx nginx
# 为名为 my-nginx 的容器设置重启策略
docker update --restart unless-stopped my-nginx
services:
web:
image: nginx
restart: unless-stopped # 在此处设置重启策略
ports:
- "80:80"
保存后,使用 docker compose up -d 启动服务即可。