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

相关推荐
bukeyiwanshui8 分钟前
20260508 docker教案
运维·docker·容器
zhuxiaohai681 小时前
ubuntu24.04安装docker(国内加速方法)
运维·docker·容器
用户6757049885021 小时前
90%的人都不知道:Docker 容器 apt 报错 404 的幕后黑手竟是它!
后端·docker·容器
leoZ2311 小时前
项目改造为 Docker 容器使用指南
运维·docker·容器
灰灰老师1 小时前
Ubuntu 24.04 使用 Nginx + Docker Tomcat9 + HTTPS 完整部署教程
nginx·ubuntu·docker
http阿拉丁神猫2 小时前
Docker知识点汇总(6~10)
运维·docker·容器
陈陈CHENCHEN2 小时前
【Kubernetes】Ubuntu 24.04 二进制方式部署 K8s
云原生·容器·kubernetes
亚空间仓鼠2 小时前
Docker容器化高可用架构部署方案
docker·容器·架构
MonkeyKing_sunyuhua2 小时前
阿里云的ECS怎么安装docker和docker compose
阿里云·docker·eureka
GISer_Jing3 小时前
GitHub Actions 完整 Token/Secret 配置详解(Vercel + Docker 2026最新版)
docker·容器·github