如何让 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)。官方优先推荐重启策略;如使用外部进程管理器,应选定一种管理方式,不要与 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

完整链路检查

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

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台