如何让 Docker 容器在机器重启后自动启动?

用重启策略:docker run --restart always(或 unless-stopped),已有容器用 docker update --restart 修改;Docker 官方推荐用重启策略而非 systemd 等进程管理器。本文对比四种策略取值。

最佳实践
如何让 Docker 容器在机器重启后自动启动?封面

做法:用 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

完整链路检查

  1. Docker 服务自启sudo systemctl enable docker(容器自启的前提是守护进程先起来)
  2. 容器策略:如上设置
  3. 验证docker updatesudo 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。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台