MongoDB Docker容器无法重启问题求助,重启命令执行成功但服务未启动
问题根因与解决方案
核心触发原因
- Docker 19.03.12版本存在cgroup资源残留的已知bug:当容器主进程异常崩溃退出后,部分关联的cgroup资源没有被Docker daemon正确回收,执行
docker restart时,daemon仅校验容器PID状态就判定重启成功,但实际新的MongoDB进程因为资源占用冲突无法完成初始化,最终静默退出 - MongoDB 4.0默认使用WiredTiger存储引擎,异常退出后会在数据目录残留
mongod.lock锁文件,再次启动时如果检测到该文件存在,会主动终止启动流程,而Docker默认的容器状态检查仅校验主进程是否存在,不会校验数据库服务可用性,因此会出现重启返回成功但服务无法连接的情况 - 重启虚拟机会释放所有残留的cgroup资源和锁文件,因此问题会临时解决
可落地解决方案
临时修复(无需重启虚拟机)
- 执行
docker stop <你的MongoDB容器ID/名称>,终止异常容器进程 - 进入宿主机上MongoDB的持久化挂载目录,手动删除
mongod.lock文件 - 执行
docker rm <你的MongoDB容器ID/名称>清理残留容器实例 - 用原始的docker run命令重新启动容器即可,原有持久化存储的数据不会丢失
永久修复方案
- 升级Docker版本到20.10.x及以上,该系列版本已经完整修复了19.03.x存在的cgroup资源残留相关bug
- 给MongoDB容器添加健康检查配置,启动时添加如下参数,让Docker可以正确识别数据库的实际运行状态:
--health-cmd "mongo --eval 'db.adminCommand(\"ping\")' || exit 1" \ --health-interval 10s \ --health-timeout 5s \ --health-retries 3
- 生产环境建议单独挂载MongoDB的日志目录到宿主机,出现异常时可直接查看MongoDB运行日志快速定位具体错误原因
内容的提问来源于stack exchange,提问作者Santhosh Kumar N
相关产品推荐
相关产品推荐

