如何让 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)。官方优先推荐重启策略;如使用外部进程管理器,应选定一种管理方式,不要与 Docker 重启策略同时控制同一容器。
四种策略取值
| 策略 | 行为 |
|---|---|
no |
不自动重启(默认) |
on-failure[:次数] |
非 0 退出码时重启,可限次数;不会因 Docker daemon 重启而自动启动 |
always |
退出后重启;手工 stop 后暂不重启,直到手工启动或 daemon 重启 |
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 守护进程不可用期间容器继续运行,不保证所有升级方式可用,也不能跨宿主机重启保持进程。它与重启策略是两个不同能力。
重启策略配置好后,安排一次受控验证,既检查容器状态,也检查业务响应。已有观测云 HTTP 拨测时,可以对照主机重启前后的结果,确认服务恢复;测试节点必须能访问目标接口。
常见问题(FAQ)
Q:on-failure 和 always 实际差别?
A:on-failure 只在异常退出时重启,正常退出或 daemon 重启不拉起;always 还会处理正常退出及 daemon 重启,但手工 stop 后会暂停自动重启直到手工启动或 daemon 重启。
Q:容器依赖别的容器(数据库),启动顺序怎么保证?
A:重启策略不保证依赖顺序;应用做好连接重试,Compose 启动时可用 depends_on 的 service_healthy 条件配合健康检查,但 Docker daemon 重启恢复不按 Compose 依赖顺序编排。
Q:K8s 里有对应概念吗?
A:K8s 的容器重启由 kubelet 根据 Pod 的 restartPolicy 处理;Deployment 等控制器负责维持所需 Pod 副本。这与 Docker daemon 的重启策略不是同一机制。