如何让 Docker 容器在机器重启后自动启动?
用重启策略:docker run --restart always(或 unless-stopped),已有容器用 docker update --restart 修改;Docker 官方推荐用重启策略而非 systemd 等进程管理器。本文对比四种策略取值。
做法:用 Docker 的重启策略——启动时加 --restart always(或更精细的 unless-stopped),已存在的容器用 docker update --restart always 容器名 直接改,无需重建。前提是 Docker 服务本身开机自启(systemctl enable docker)。官方明确推荐用重启策略,而不是 systemd/supervisor 去管容器。
四种策略取值
| 策略 | 行为 |
|---|---|
no |
不自动重启(默认) |
on-failure[:次数] |
非正常退出(非 0 退出码)才重启,可限次数 |
always |
无论怎么停的,Docker 启动时一律拉起(手动 stop 的也会拉起) |
unless-stopped |
总是重启,但你手动 stop 过的除外——日常最常用 |
用法
# 新建时指定
docker run -d --restart unless-stopped --name myapp myimage
# 已运行的容器修改
docker update --restart unless-stopped myapp
# 查看当前策略
docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' myapp
compose 写法:
services:
app:
restart: unless-stopped
完整链路检查
- Docker 服务自启:
sudo systemctl enable docker(容器自启的前提是守护进程先起来) - 容器策略:如上设置
- 验证:
docker update后sudo reboot或用systemctl restart docker模拟验证
always 与 unless-stopped 的选择
- 纯服务(Web、API):
always - 需要偶尔停机维护的:
unless-stopped——手动停掉后重启机器不会被拉起,维护窗口更可控
与 --live-restore 的关系
--live-restore(daemon 级配置)让 Docker 守护进程升级/重启期间容器保持运行,与重启策略是正交的两个能力,高可用场景可同开。
观测云对照
机器重启后服务有没有回来,监控说了算。 主机重启后容器未按预期拉起,观测云的容器指标断点 + 拨测失败告警会立刻暴露;重启事件本身也在事件流中留痕。
常见问题(FAQ)
Q:on-failure 和 always 实际差别?
A:on-failure 只在异常退出时重启,正常退出(退出码 0)不拉起;always 连正常退出也拉起。
Q:容器依赖别的容器(数据库),启动顺序怎么保证?
A:重启策略不保证依赖顺序;应用做好连接重试,或用 compose 的 depends_on + 健康检查。
Q:K8s 里有对应概念吗?
A:K8s 的 Pod 由控制器(Deployment)保证副本数,天然"永远重启",语义上对应 always。