一次 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

相关推荐
程序员老赵6 小时前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
WangMingHua11110 小时前
LM Studio Docker 部署——本地大模型一键启动
docker
曲幽2 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
武子康3 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
Alsn866 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
JLWcai202510096 天前
铸造领域树脂砂轮|金利威多场景解决方案,20 + 配方覆盖全需求
mongodb·zookeeper·eureka·spark·rabbitmq·memcached·storm
2601_961875246 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant
java_cj6 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes
程序员老赵6 天前
服务器没有桌面?Docker 跑个 Chrome,浏览器就能远程用
docker·容器·devops
杨浦老苏6 天前
轻量级Docker仪表板Servedash
运维·docker·监控·群晖·仪表板