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

相关推荐
inner2222 小时前
kubeasz部署k8s集群1.37
云原生·容器·kubernetes
zb200641202 小时前
springboot整合libreoffice(两种方式,使用本地和远程的libreoffice);docker中同时部署应用和libreoffice
spring boot·后端·docker
tiger从容淡定是人生2 小时前
金融系统 Summit Backend 的 Docker 化实践:CI/CD、测试与安全性的工程经验总结
运维·docker·云原生·容器·eureka·金融
indexsunny2 小时前
互联网大厂Java面试实战:基于微服务与云原生的电商场景问答解析
java·数据库·spring boot·docker·微服务·云原生·kubernetes
爱莉希雅&&&3 小时前
Docker 部署 MySQL 双主双从同步架构详细笔记
linux·运维·数据库·mysql·docker·架构·主从同步
java资料站7 小时前
Docker 快速部署 MySQL 主从复制(一主一从)
mysql·adb·docker
Alex艾力的IT数字空间10 小时前
在 Kylin(麒麟)操作系统上搭建 Docker 环境
大数据·运维·缓存·docker·容器·负载均衡·kylin
伴我与影17 小时前
【记录】复现论文 Dftpav
c++·docker
SPC的存折18 小时前
2、Docker命令与镜像、容器管理
linux·运维·服务器·docker·容器·eureka