Docker化Elasticsearch容器提示‘java.io.IOException: No space left on device’但/dev/sda仍有24G剩余空间的排查求助
排查Elasticsearch容器「No space left on device」错误的方向
遇到这种主机明明还有24GB空闲空间,但Elasticsearch容器却报磁盘不足的情况,咱们可以从这几个方向一步步排查:
1. 先确认Docker专属的磁盘使用情况
主机的空闲空间≠Docker可用空间,Docker的镜像、容器、数据卷可能存在单独的存储限制,或者占满了某个专属分区:
- 执行
docker system df,查看Docker整体的磁盘占用(包括镜像、容器、卷、构建缓存),说不定是旧容器/镜像堆太多占了空间 - 找到你的
elasticsearchdata数据卷,用docker volume ls列出所有卷,再通过docker inspect <卷名>拿到它在主机的实际存储路径,然后用du -sh <路径>看看是不是Elasticsearch的索引数据暴增把卷填满了
2. 检查inode资源是否耗尽
这是个很容易被忽略的点:磁盘空间还有,但用来记录文件元信息的inode被用完了,系统也会提示「空间不足」:
- 在主机上执行
df -i,查看各个分区的inode使用率,重点看Docker存储分区和Elasticsearch数据卷所在的分区 - 如果某个分区inode使用率100%,大概率是Elasticsearch生成了大量小分片文件,或者Docker的容器日志没清理堆太多了
3. 检查容器的磁盘配额限制
说不定你给Elasticsearch容器设置了磁盘配额,哪怕主机有空间,容器自身的配额也会触发限制:
- 回头看你的
docker-compose.yml,有没有配置deploy.resources.limits这类磁盘限制项 - 执行
docker inspect elasticsearch,查看HostConfig下的StorageOpt或Resources字段,确认是否有磁盘配额设置
4. 确认数据卷挂载的分区是否真的有空间
你配置了./elasticsearchdata:/usr/share/elasticsearch/data,但这个挂载目录可能不在你以为的/dev/sda分区上:
- 执行
df -h ./elasticsearchdata,看看这个目录实际所在的分区空间使用情况,说不定它挂载在另一个已经满了的分区上
5. 检查Elasticsearch的磁盘水印保护机制
Elasticsearch自带磁盘水印阈值,当磁盘使用率达到设定比例时,会停止写入甚至阻止容器启动,哪怕实际还有剩余空间:
- 打开你挂载的
elasticconfig/elasticsearch.yml,查看cluster.routing.allocation.disk.watermark.low、high、flood_stage这些配置项,是不是阈值设得太高了 - 如果能临时启动容器,也可以用
curl http://localhost:9200/_cluster/settings?include_defaults=true查看当前生效的水印设置
6. 排查Docker存储驱动和文件系统问题
某些Docker存储驱动(比如overlay2)可能存在空间计算偏差,或者文件系统出现了错误:
- 执行
docker info | grep Storage Driver查看当前用的存储驱动 - 检查Docker默认存储目录
/var/lib/docker的空间:df -h /var/lib/docker - 可以尝试用
docker system prune -a清理无用的镜像、容器和缓存,但操作前记得备份重要数据哦
内容的提问来源于stack exchange,提问作者swetank soni
相关产品推荐
相关产品推荐

