跳转到主要内容博客列表
KOLIKO / 20262026年06月29日 / 11 min read

Docker 使用与磁盘空间排查文档

本文介绍Linux云服务器因Docker部署导致系统盘空间不足的排查与解决方法。通过df和docker system df命令定位占用,发现Docker构建缓存与未使用镜像为元凶。优先清理构建缓存和未使用镜像,并检查容器日志,配置日志轮转限制大小,可回收数十GB空间,保障服务器稳定运行。

2026年06月29日11 min read
DockerLinux服务器

Docker 使用与磁盘空间排查文档

适用场景:Linux 云服务器使用 Docker 部署服务后,系统盘空间突然不足,尤其是 / 分区接近 100% 的情况。


1. 问题背景

服务器出现存储空间不足时,常见现象包括:

  • 程序无法正常写入文件
  • Docker 容器启动失败
  • 数据库写入失败
  • 日志无法继续生成
  • 系统提示 No space left on device
  • df -h 显示根分区 / 使用率过高

示例:

1root@VM-0-14-ubuntu:~# df -h 2Filesystem Size Used Avail Use% Mounted on 3/dev/vda2 50G 46G 1.3G 98% / 4overlay 50G 46G 1.3G 98% /var/lib/docker/rootfs/overlayfs/xxx

这说明:

  • 系统盘 / 已经接近满载
  • Docker 的 overlay 文件系统也挂载在系统盘下
  • Docker 镜像、构建缓存或容器日志很可能占用了大量空间

2. 查看磁盘空间

2.1 查看整体磁盘使用情况

1df -h

重点关注:

1Filesystem Size Used Avail Use% Mounted on 2/dev/vda2 50G 46G 1.3G 98% /

其中:

字段含义
Size分区总大小
Used已使用空间
Avail剩余可用空间
Use%使用率
Mounted on挂载位置

如果 / 分区使用率超过 90%,就需要排查和清理。


3. 定位哪个目录占用空间最大

3.1 查看根目录下各目录大小

1sudo du -h --max-depth=1 / 2>/dev/null | sort -hr | head -20

常见大目录:

1/var 2/home 3/usr 4/root 5/opt

如果 /var 很大,继续查看:

1sudo du -h --max-depth=1 /var 2>/dev/null | sort -hr | head -20

Docker 默认数据目录通常在:

1/var/lib/docker

查看 Docker 目录占用:

1sudo du -h --max-depth=1 /var/lib/docker 2>/dev/null | sort -hr | head -20

4. 查看 Docker 空间占用

4.1 Docker 空间统计

1docker system df

示例输出:

1TYPE TOTAL ACTIVE SIZE RECLAIMABLE 2Images 11 1 38.72GB 17.22GB (44%) 3Containers 1 1 23.86MB 0B (0%) 4Local Volumes 0 0 0B 0B 5Build Cache 122 0 21.11GB 18.87GB

含义:

类型含义
ImagesDocker 镜像占用
Containers容器占用
Local VolumesDocker 数据卷占用
Build Cache镜像构建缓存占用
RECLAIMABLE可回收空间

从示例可以看出:

  • 镜像占用:38.72GB
  • 可回收镜像空间:17.22GB
  • 构建缓存占用:21.11GB
  • 可回收构建缓存:18.87GB

因此,Docker 是主要占用来源。


5. 清理 Docker 构建缓存

5.1 推荐优先清理 Build Cache

构建缓存通常是最安全、最值得优先清理的对象。

1docker builder prune

执行后会提示确认,输入:

1y

如果想清理所有未使用构建缓存:

1docker builder prune -a

说明:

  • 不会删除正在运行的容器
  • 不会删除数据卷
  • 主要删除构建镜像时产生的缓存
  • 下次构建镜像可能变慢,但不会影响已有容器运行

清理后检查:

1df -h 2docker system df

6. 清理未使用镜像

6.1 查看镜像列表

1docker images

6.2 删除未使用镜像

1docker image prune -a

说明:

  • 会删除没有被任何容器使用的镜像
  • 不会删除当前正在运行容器所依赖的镜像
  • 如果以后需要旧镜像,可能需要重新拉取或重新构建

7. 一键清理 Docker 无用资源

如果希望一次性清理未使用的容器、镜像、网络和构建缓存,可以执行:

1docker system prune -a

它会清理:

  • 停止的容器
  • 未使用的网络
  • 未被容器使用的镜像
  • 构建缓存

它默认不会删除 Docker volume。

执行后检查空间:

1df -h 2docker system df

8. 谨慎使用的危险命令

不要随便执行:

1docker system prune -a --volumes

原因:

  • --volumes 会删除未使用的数据卷
  • 数据库数据、用户上传文件、业务持久化数据可能存在 volume 中
  • 一旦删除,可能造成数据丢失

即使当前显示:

1Local Volumes 0 0 0B 0B

也不建议养成随手加 --volumes 的习惯。


9. 排查 Docker 容器日志

有时候空间不是镜像占用,而是容器日志暴涨。

9.1 查找大日志文件

1sudo find /var/lib/docker/containers -name "*-json.log" -exec ls -lh {} \; | sort -k 5 -hr | head -20

如果看到几个 GB 或十几个 GB 的日志文件,可以清空。

9.2 清空容器日志

1sudo truncate -s 0 /var/lib/docker/containers/*/*-json.log

说明:

  • 这只是清空日志内容
  • 不会删除容器
  • 不会删除业务数据
  • 一般比较安全

10. 限制 Docker 日志大小

为了防止容器日志再次占满磁盘,可以配置 Docker 日志轮转。

编辑 Docker 配置文件:

1sudo nano /etc/docker/daemon.json

写入:

1{ 2 "log-driver": "json-file", 3 "log-opts": { 4 "max-size": "100m", 5 "max-file": "3" 6 } 7}

含义:

  • 单个日志文件最大 100MB
  • 最多保留 3 个日志文件
  • 每个容器最多约占用 300MB 日志空间

重启 Docker:

1sudo systemctl restart docker

注意:

  • 重启 Docker 可能会影响正在运行的容器
  • 如果容器没有配置自动重启,重启 Docker 后需要手动启动容器

查看容器状态:

1docker ps -a

启动容器:

1docker start 容器名或容器ID

11. 常用 Docker 运维命令

11.1 查看运行中的容器

1docker ps

11.2 查看所有容器

1docker ps -a

11.3 查看镜像

1docker images

11.4 查看 Docker 占用

1docker system df

11.5 查看容器实时资源占用

1docker stats

11.6 查看容器日志

1docker logs --tail=200 容器名或容器ID

11.7 重启容器

1docker restart 容器名或容器ID

11.8 停止容器

1docker stop 容器名或容器ID

11.9 删除停止的容器

1docker container prune

12. 推荐清理流程

当服务器磁盘空间快满时,推荐按以下顺序处理。

第一步:查看磁盘

1df -h

第二步:查看 Docker 占用

1docker system df

第三步:优先清理构建缓存

1docker builder prune -a

第四步:清理未使用镜像

1docker image prune -a

第五步:检查是否有巨大容器日志

1sudo find /var/lib/docker/containers -name "*-json.log" -exec ls -lh {} \; | sort -k 5 -hr | head -20

如有需要,清空日志:

1sudo truncate -s 0 /var/lib/docker/containers/*/*-json.log

第六步:再次检查空间

1df -h 2docker system df

13. 本次问题结论

根据本次服务器输出:

1Images 11 1 38.72GB 17.22GB (44%) 2Build Cache 122 0 21.11GB 18.87GB

判断结果:

  • 系统盘 / 只有 50GB
  • Docker 镜像占用了约 38.72GB
  • Docker 构建缓存占用了约 21.11GB
  • Docker 可回收空间超过 30GB
  • 主要问题不是运行内存不足,而是磁盘存储空间不足

优先建议执行:

1docker builder prune -a

然后执行:

1docker image prune -a

最后检查:

1df -h 2docker system df

14. 长期维护建议

14.1 定期清理构建缓存

1docker builder prune -a

14.2 只清理 7 天前的构建缓存

1docker builder prune -a --filter "until=168h"

14.3 限制 buildx 缓存大小

1docker buildx prune --keep-storage 5GB

14.4 配置日志轮转

1sudo nano /etc/docker/daemon.json

内容:

1{ 2 "log-driver": "json-file", 3 "log-opts": { 4 "max-size": "100m", 5 "max-file": "3" 6 } 7}

重启 Docker:

1sudo systemctl restart docker

15. 不建议直接删除的目录

除非非常确定,否则不要直接删除以下目录:

1/var/lib/docker/volumes 2/var/lib/mysql 3/var/lib/postgresql 4/home 5/root 6/opt

原因:

  • 可能包含数据库数据
  • 可能包含用户上传文件
  • 可能包含项目代码
  • 可能包含部署配置
  • 误删后恢复困难

如果必须删除,应先备份或确认内容。


16. 快速命令清单

1# 查看磁盘空间 2df -h 3 4# 查看根目录占用 5sudo du -h --max-depth=1 / 2>/dev/null | sort -hr | head -20 6 7# 查看 Docker 占用 8docker system df 9 10# 清理 Docker 构建缓存 11docker builder prune -a 12 13# 清理未使用镜像 14docker image prune -a 15 16# 一键清理未使用 Docker 资源,不包含 volume 17docker system prune -a 18 19# 查找 Docker 容器日志 20sudo find /var/lib/docker/containers -name "*-json.log" -exec ls -lh {} \; | sort -k 5 -hr | head -20 21 22# 清空 Docker 容器日志 23sudo truncate -s 0 /var/lib/docker/containers/*/*-json.log 24 25# 查看清理后的空间 26df -h 27docker system df

17. 简短结论

这类问题的核心排查思路是:

1先看 df -h → 再看 docker system df → 优先清理 Build Cache → 再清理未使用镜像 → 最后处理日志和长期配置

本次问题最可能的直接解决命令是:

1docker builder prune -a

如果仍然空间不足,再执行:

1docker image prune -a