第一件事是检查容器是否启用--restart策略:默认不自启,需显式配置;可用docker inspect | grep -i restart验证,若为"no"或无输出则未启用,须用docker update --restart=unless-stopped补设,并确保Docker服务已systemctl enable docker。
确认容器是否设置了自动重启策略
宿主机重启后容器没起来,第一件事是检查它有没有启用 --restart 策略。默认情况下,docker 容器不会自启。必须显式配置,例如:
- always:无论退出状态如何,Docker 服务启动后都会拉起该容器(推荐用于生产服务)
- unless-stopped:服务启动时拉起,且后续手动 stop 后不会自动恢复(更安全,避免误启)
- on-failure[:max-retries]:仅在非 0 退出码时重试(适合批处理类任务)
查看已有容器的重启策略:
docker inspect <container_id> | grep -i restart</container_id>
若输出为空或显示 "RestartPolicy": {"Name": "no"},说明未启用——这就是根本原因。
为已存在容器补设重启策略
不需要删容器重来。直接用 docker update 命令生效:
docker update --restart=unless-stopped <container_id_or_name></container_id_or_name>
执行后无需重启容器本身,策略会随 Docker daemon 启动而生效。验证方式:重启 Docker 服务(sudo systemctl restart docker),再观察容器是否自动运行。
注意:docker run 创建时未加 --restart,后续必须用 update 补;docker-compose 用户则需在 deploy.restart_policy 或顶层 restart 字段中声明,并确保用 docker-compose up -d 部署而非 run。
确保 Docker 服务本身开机自启
即使容器设了 unless-stopped,如果 Docker daemon 没随系统启动,容器照样不会起来。
检查并启用:
sudo systemctl is-enabled docker # 应返回 enabled<br>sudo systemctl enable docker # 若未启用,运行此命令
同时确认 Docker 服务状态正常(不是 failed 或 inactive):
sudo systemctl status docker
常见异常如 Failed to start Docker Application Container Engine,需按 Docker 启动失败流程排查(如存储驱动、cgroup、权限等),不在本策略范畴内,但它是前置必要条件。
验证与常见陷阱
设置完成后,建议模拟一次宿主机重启(或至少重启 Docker 服务)来验证效果。过程中注意以下易忽略点:
-
镜像仍存在本地:若容器依赖的镜像被
docker image prune清掉,重启时会因找不到镜像而失败(报No such image)。建议保留基础镜像,或搭配 registry 使用 pull 策略 -
挂载路径依赖宿主机目录:如
-v /data:/app/data,若该目录在宿主机重启后权限变更或未就绪(如 NFS 挂载延迟),容器可能启动失败。可加docker run --restart=unless-stopped --mount type=bind,source=/data,target=/app/data,bind-propagation=rprivate提升健壮性 -
端口被占用:宿主机重启后其他进程抢先占用了容器映射端口(如 80、443),会导致容器反复 crash → restart 循环。用
sudo ss -tulnp | grep :80排查











