You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器已退出却显示运行,MongoDB磁盘满后无法自动重启问题

Docker部署MongoDB磁盘满后的异常分析与解决方案

问题现象

  • 磁盘空间不足触发故障后,执行docker-compose logs --follow --tail=10 -t mongodb退出并提示mongodb exited with code 14,执行docker-compose up mongodb尝试启动容器但失败
  • docker ps显示该服务处于“Up 2 days”的运行状态,与实际状态不符
  • 磁盘空间问题解决后,尽管配置了restart: unless-stopped,服务仍无法自动重启,仅能手动执行docker-compose up mongodb启动

原因分析

  1. Docker状态同步异常:磁盘满时,Docker自身的元数据存储文件(位于/var/lib/docker下)无法正常写入更新,导致docker ps读取的是旧的运行状态,出现“假在线”的情况。
  2. 容器启动失败本质:磁盘满时,Docker创建overlay2文件系统的merged目录失败(对应报错mkdir /var/lib/docker/overlay2/…/merged: no space left on device),无法完成容器启动的文件系统初始化。
  3. restart策略未触发:Docker的restart: unless-stopped策略依赖容器退出事件的正确上报,磁盘满时容器的退出状态未被Docker正确捕获;故障恢复后,Docker仍认为容器处于运行状态,因此不会触发自动重启。
  4. exit code 14的含义:该退出码表示进程因无法获取足够资源(此处为磁盘空间)而终止,MongoDB在磁盘满时无法写入日志、数据文件,触发进程崩溃退出。

最优解决方案

1. 临时修复状态异常

先手动清理Docker状态不一致问题,再重启服务:

# 停止并移除异常状态的容器
docker-compose down mongodb
# 后台启动服务
docker-compose up -d mongodb

2. 配置健康检查实现自动恢复

在docker-compose.yaml的mongodb服务中添加健康检查配置,让Docker主动检测服务可用性,触发自动重启:

mongodb:
  image: mongo:5
  container_name: mongodb
  environment:
  - PUID=1000
  - PGID=1000
  ports:
  - 127.0.0.1:…:27017
  volumes:
  - …:/data/db
  - "…:/docker-entrypoint-initdb.d/:ro"
  restart: unless-stopped
  healthcheck:
    test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
    interval: 30s
    timeout: 10s
    retries: 3
    start_period: 40s

健康检查会每隔30秒验证MongoDB是否可连接,连续3次失败后,Docker会根据restart策略自动重启容器,磁盘恢复后即可自动恢复服务。

3. 长期预防磁盘满问题

  • 定期清理Docker资源:每周执行docker system prune -af清理未使用的镜像、容器、卷和网络,释放磁盘空间。
  • 磁盘使用率监控:通过系统监控工具(如sysstat、Prometheus+Grafana)设置磁盘使用率阈值告警(如使用率达80%时告警),提前处理。
  • MongoDB磁盘告警:在MongoDB中配置数据目录使用率监控,当达到阈值时触发告警,避免磁盘耗尽。

内容的提问来源于stack exchange,提问作者v6ak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 19:57:42