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启动
原因分析
- Docker状态同步异常:磁盘满时,Docker自身的元数据存储文件(位于
/var/lib/docker下)无法正常写入更新,导致docker ps读取的是旧的运行状态,出现“假在线”的情况。 - 容器启动失败本质:磁盘满时,Docker创建overlay2文件系统的merged目录失败(对应报错
mkdir /var/lib/docker/overlay2/…/merged: no space left on device),无法完成容器启动的文件系统初始化。 - restart策略未触发:Docker的
restart: unless-stopped策略依赖容器退出事件的正确上报,磁盘满时容器的退出状态未被Docker正确捕获;故障恢复后,Docker仍认为容器处于运行状态,因此不会触发自动重启。 - 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
相关产品推荐
相关产品推荐

