一次 Docker 磁盘占用排查与迁移的完整复盘

一次 Docker 磁盘占用排查与迁移的完整复盘

本文记录了一次 Docker 磁盘占用排查与迁移的完整复盘。


一、问题背景

服务器磁盘分布大致如下:

  • 系统盘:/dev/vda1,40G,挂载 /
  • 数据盘:/dev/vdb1,493G,挂载 /data

初始现象是:

  • / 分区使用率偏高
  • /var/lib/docker/overlay2 显示挂载在根分区
  • 怀疑 Docker 镜像或容器占用了大量系统盘空间

二、Docker 磁盘占用的正确查看方式

1. 系统层面(df)

bash 复制代码
df -h

如果看到类似:

text 复制代码
overlay 40G 20G 18G 54% /var/lib/docker/overlay2/.../merged

不要误判

这并不是 Docker 独占 40G,而是 overlayfs 映射了宿主机根分区


2. Docker 视角(关键命令)

基础统计
bash 复制代码
docker system df
详细拆分(强烈推荐)
bash 复制代码
docker system df -v

你可以精确看到:

  • 每个镜像的:

    • SIZE
    • SHARED SIZE
    • UNIQUE SIZE
    • 是否被容器使用
  • 构建缓存(Build Cache)的真实占用

  • 容器自身的写层大小


三、为什么会看到大量 <none> 镜像?

示例:

text 复制代码
<none>  <none>  554MB
<none>  <none>  554MB
...

这些并不是"异常镜像",而是悬空镜像(dangling images)

产生原因总结

  1. 多次 docker build,旧镜像标签被新镜像覆盖
  2. 构建中间层未被任何镜像引用
  3. CI / 自动构建未做清理策略

本质上:

Docker 很保守,不会自动删除历史构建产物


四、Docker 构建缓存(Build Cache)才是"隐形大户"

在一次排查中发现:

text 复制代码
Build cache usage: 11.56GB

而镜像 + 容器加起来不到 1GB。

这类缓存来自:

  • docker build
  • BuildKit
  • 多阶段构建的中间层

清理方式

bash 复制代码
docker builder prune

如果你想彻底清:

bash 复制代码
docker system prune -a

⚠️ 注意:

这会删除所有未被容器使用的镜像


五、Docker 数据目录迁移的正确姿势(简版)

以下步骤在 Docker 已停止 的前提下进行

1. 停止 Docker

bash 复制代码
systemctl stop docker

2. 拷贝数据(推荐 rsync)

bash 复制代码
rsync -a /var/lib/docker/ /data/docker/

3. 修改配置

bash 复制代码
vim /etc/docker/daemon.json
json 复制代码
{
  "data-root": "/data/docker"
}

4. 启动 Docker

bash 复制代码
systemctl start docker

5. 验证

bash 复制代码
docker info | grep "Docker Root Dir"

参考资料

  1. Docker 官方文档 · 磁盘使用分析(docker system df)

    Docker 官方对镜像、容器、卷、构建缓存磁盘占用的说明。
    https://docs.docker.com/engine/reference/commandline/system_df/

  2. Docker 官方文档 · 清理未使用资源(prune)

    详细说明 docker image prunedocker builder prunedocker system prune 的行为差异与风险。
    https://docs.docker.com/engine/reference/commandline/system_prune/

  3. Docker 官方文档 · BuildKit 与构建缓存

    解释 Build Cache 的来源、生命周期以及为何会大量占用磁盘。
    https://docs.docker.com/build/cache/

  4. Docker 官方文档 · daemon.json 配置项说明

    包含 data-root(Docker 数据目录迁移)的官方定义与示例。
    https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file

相关推荐
前端Baymax1 小时前
kube-proxy iptables模式下NodePort间歇性超时
docker·容器·kubernetes
一只积极向上的小咸鱼2 小时前
多机Docker + InfiniBand 分布式运行实操手册
分布式·docker·容器
java_logo2 小时前
Docker 部署 WPS 在线办公套件,浏览器即可编辑 Word、Excel、PPT
docker·word·wps·wps部署教程·wps免费版·轩辕镜像·docker部署教程
AI服务老曹2 小时前
Docker部署AI视频分析平台项目实战记录
人工智能·docker·音视频
留不住的何止是时间2 小时前
关于docker构建镜像build指令的注意事项
运维·docker·容器
小兔崽子去哪了17 小时前
Docker 删除镜像后磁盘空间没有释放?
后端·docker·容器
Zhu75818 小时前
在Docker环境部署ApacheGuacamole,对接PG数据库
数据库·docker·容器
少陽君19 小时前
Docker 部署 Loki + Promtail + Grafana 日志监控栈
docker·容器·grafana
独自归家的兔19 小时前
2026年7月2日 Docker 容器化部署 PaddleOCR-VL 实战(OpenAI 协议兼容 HTTP 调用)
运维·docker·容器
蜀道山老天师20 小时前
一文吃透 K8s:Deployment 滚动更新与版本回滚
云原生·容器·kubernetes