用心打造
VPS知识分享网站

VPS重启后Docker容器没有自动启动怎么办?

VPS重启以后,SSH可以正常连接,Nginx也在运行,但 Docker 里的网站、数据库或面板全都打不开。手动执行 docker start 又能恢复,这通常不是端口问题,而是容器没有配置合适的自动启动策略。

我见过的另一种情况是容器确实尝试启动了,却因为数据盘尚未挂载、环境变量丢失或依赖服务没就绪而退出。本文就从 Docker 服务、容器状态、重启策略和 Compose 依赖四个层面排查。

VPS重启后Docker容器自动启动示意图

一、先确认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判断服务是否真正就绪。

温馨提示

自动启动配置完成后,一定要做一次完整重启测试。能手动拉起不代表能自动恢复,尤其要同时检查数据盘、数据库、环境变量、证书和应用健康状态。

赞(0)
未经允许不得转载;国外VPS测评网 » VPS重启后Docker容器没有自动启动怎么办?
分享到