VPS重启以后,SSH可以正常连接,Nginx也在运行,但 Docker 里的网站、数据库或面板全都打不开。手动执行 docker start 又能恢复,这通常不是端口问题,而是容器没有配置合适的自动启动策略。
我见过的另一种情况是容器确实尝试启动了,却因为数据盘尚未挂载、环境变量丢失或依赖服务没就绪而退出。本文就从 Docker 服务、容器状态、重启策略和 Compose 依赖四个层面排查。

一、先确认Docker服务有没有启动
先检查 Docker 守护进程:
systemctl status docker --no-pager
systemctl is-enabled docker
若服务未运行,可用 systemctl start docker 临时启动;若 is-enabled 返回 disabled,则执行:
sudo systemctl enable --now docker
服务启动失败时不要只反复重启,继续查看 journalctl -u docker -b。磁盘满、配置文件语法错误、数据目录只读和存储驱动异常,都可能让 Docker 本身起不来。
二、查看容器是没启动还是启动后退出
docker ps 只显示正在运行的容器,排查时应加上 -a:
docker ps -a
docker inspect -f '{{.Name}} {{.State.Status}} {{.State.ExitCode}} {{.HostConfig.RestartPolicy.Name}}' $(docker ps -aq)
状态为 Exited 表示容器进程已经结束;Created 说明容器还没真正启动;持续显示 Restarting 则是应用启动失败后反复重试。接着用 docker logs --tail 100 容器名 查看应用层原因。
容器没有运行不等于缺少自动启动策略。 配置文件、权限、端口冲突或数据库连接失败也会让它启动后马上退出。
三、Docker重启策略应该怎么选
Docker 默认重启策略是 no,VPS或Docker服务重启后不会自动拉起容器。常用策略差异如下:
| 策略 | 服务器重启后 | 手动停止后的表现 |
|---|---|---|
| no | 不自动启动 | 保持停止 |
| on-failure | 仅异常退出时重试 | 不用于守护所有长期服务 |
| always | 自动启动 | Docker再次启动时会重新拉起 |
| unless-stopped | 自动启动 | 手动停止后保持停止 |
长期运行的网站、数据库和反向代理,我更常用 unless-stopped。已有容器可以直接更新:
docker update --restart=unless-stopped 容器名
修改后用 docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' 容器名 复核,不需要为了改策略重建容器。
四、使用Docker Compose怎么设置
在 compose.yml 对应服务中加入:
services:
web:
image: nginx:alpine
restart: unless-stopped
修改配置后应运行 docker compose up -d 应用变化。单独执行 docker compose restart 只是重启当前容器,不会把新配置完整应用到已有容器。
多服务项目还要注意启动顺序。depends_on 能控制依赖顺序,但数据库容器先启动不代表数据库已经可用。对数据库、缓存等依赖,最好配置 healthcheck,并让上层服务在依赖健康后再启动。
五、容器有策略为什么还是起不来
先看退出码和日志,再检查下面几个位置:
- 挂载的数据盘是否已在 Docker 前完成挂载,目录和文件权限是否正确。
- 端口是否被其他服务占用,环境变量文件、证书和配置文件是否还存在。
- 容器依赖的数据库、DNS或外部接口是否已经可用。
- 应用是否因内存不足、磁盘满或只读文件系统被系统终止。
如果使用 /etc/fstab 挂载数据盘,应检查开机挂载是否成功。Docker比数据盘先启动时,绑定挂载可能落到根分区的空目录,既会导致应用数据看似消失,也可能产生新的错误数据。
六、不要把自动重启当成故障修复
重启策略能提高服务在正常重启和偶发退出后的恢复能力,却不能修复错误配置。容器持续崩溃时,always 只会制造重启循环和大量日志。
可以结合下面的命令判断最近是否频繁重启:
docker inspect -f '{{.RestartCount}} {{.State.Error}}' 容器名
docker events --since 1h
重启次数不断增长时应先暂停容器,查清应用日志、资源和依赖,避免异常循环拖满 CPU、磁盘或第三方接口。
七、重启前应该做一次真实验证
配置完成后,不要把第一次验证留到系统维护时。选择业务低峰重启 VPS,确认 Docker 服务、数据盘、全部容器、端口和网站健康检查都能自动恢复。
新部署环境时,可先从够用的小配置开始,并选择支持快照和灵活升级的平台,例如 萤光云 和 LightNode。真正影响重启恢复的仍是部署配置、数据备份和启动依赖,而不是只把服务器配置买高。
常见问题
问:Docker默认会在VPS重启后启动容器吗?
答:Docker服务可以自启,但容器默认策略为no时不会自动拉起。
问:always和unless-stopped哪个好?
答:长期服务常用unless-stopped,它会尊重手动停止状态。
问:docker update修改策略会重启容器吗?
答:单独更新restart策略会立即生效,正常情况下不需要重建容器。
问:容器显示Restarting怎么办?
答:先看容器日志、退出码和资源情况,不要继续增加重启次数。
问:Compose的depends_on能保证数据库可用吗?
答:只能控制启动顺序,建议配合healthcheck判断服务是否真正就绪。
温馨提示
自动启动配置完成后,一定要做一次完整重启测试。能手动拉起不代表能自动恢复,尤其要同时检查数据盘、数据库、环境变量、证书和应用健康状态。


