Debian Stretch环境下Docker容器夜间运行占满磁盘空间求助
针对你遇到的「白天运行数小时容器空间正常,夜间持续运行后Docker分区被完全占满」的问题,结合你的Debian Stretch + Docker 18.03.1-ce(overlay2存储驱动、extfs文件系统、d_type和原生Overlay Diff支持正常)的配置,我整理了几个最可能的排查和解决方向:
1. 优先排查容器日志无限制增长
Docker默认的json-file日志驱动不会限制日志文件大小,很多长期运行的容器在夜间执行定时任务、批处理时,会产生大量stdout/stderr日志,不知不觉占满磁盘。
查看容器日志大小:
先找到目标容器的日志路径:docker inspect --format='{{.LogPath}}' <你的容器ID/名称>再查看日志文件的大小:
du -h <上面得到的日志路径>解决方法:
- 临时给单个容器配置日志限制(重启容器生效):
这里限制单日志文件最大10MB,最多保留3个日志文件。docker run --log-opt max-size=10m --log-opt max-file=3 <你的容器镜像> - 全局配置所有容器的日志限制(修改
/etc/docker/daemon.json,如果文件不存在就新建):
配置后重启Docker服务:{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }systemctl restart docker
- 临时给单个容器配置日志限制(重启容器生效):
2. 检查容器内临时文件堆积
很多程序在夜间运行时会生成大量临时文件(比如缓存、下载的中间数据、临时报表),而长期运行的容器不会自动清理这些文件,时间一长就会占满空间。
排查临时文件:
进入容器查看核心临时目录的占用情况:docker exec -it <你的容器ID> bash # 检查系统临时目录 du -sh /tmp # 检查程序自身的缓存目录(比如应用的cache、tmp文件夹) du -sh /path/to/app/tmp解决方法:
- 在容器内添加定时清理任务:比如用cron定时删除
/tmp下超过24小时的文件:echo "0 0 * * * find /tmp -type f -mtime +1 -delete" | crontab - - 把临时目录挂载为宿主机的tmpfs(内存文件系统,重启后自动清空):
这里限制docker run --tmpfs /tmp:rw,size=1G <你的容器镜像>/tmp最大使用1GB内存,根据你的需求调整。
- 在容器内添加定时清理任务:比如用cron定时删除
3. 清理Docker未使用的资源
虽然你白天运行正常,但如果长期积累未使用的镜像、容器、卷,也可能在夜间触发某种清理机制前占满磁盘(不过这个概率稍低,但值得排查):
查看Docker空间使用情况:
docker system df这个命令会显示镜像、容器、卷、构建缓存的占用情况。
清理未使用的资源:
执行以下命令清理所有未运行的容器、未被使用的镜像、卷和网络(执行前确认不需要这些资源):docker system prune -a如果只想清理未被使用的卷(卷可能存储了持久化数据,谨慎操作):
docker volume prune
4. 确认宿主机其他进程是否占用Docker分区
有时候不是Docker的问题,而是宿主机上其他进程在夜间写入大量数据到Docker所在的分区。
- 排查分区占用:
先确认Docker分区的挂载点(比如/var/lib/docker所在的分区),然后用以下命令逐层排查目录占用:# 查看根目录下各文件夹大小 du -sh /* # 进入Docker分区挂载点,查看子目录大小 cd /var/lib/docker du -sh *
先从容器日志和临时文件这两个方向入手,这是长期运行容器夜间爆盘最常见的原因。
内容的提问来源于stack exchange,提问作者davidwessman

