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

相关推荐
AlfredZhao21 分钟前
Docker 查看容器日志:别只记 `docker logs -f`
docker
Crazy________3 小时前
k8s部署若依微服务架构流程,v3.6.6
运维·云原生·容器·kubernetes·状态模式
初级炼丹师(爱说实话版)4 小时前
Ubuntu服务器配置docker
服务器·ubuntu·docker
生活爱好者!5 小时前
NAS还能用来开视频会议?docker一键部署MiroTalk SFU
运维·docker·容器
xiaoxiangsiyan5 小时前
GitLab CI/CD 自托管(EE 企业版)+ Kubernetes Runner 集群 + ArgoCD(GitOps 部署)
运维·网络·ci/cd·容器·kubernetes·gitlab·argocd
PC2005-cloud5 小时前
KubeSphere 安装到插件管理实战:本地 K8s 搭建可视化容器平台
云原生·容器·kubernetes
兵bing7 小时前
Docker Compose 进阶配置与最佳实践笔记
docker
是良辰7 小时前
Docker Nginx HTTPS 自签证书部署完整操作文档
nginx·docker·https
瞬间&永恒~8 小时前
【Docker】(四)Namespace 详解
运维·docker·容器
就改了8 小时前
Docker安装并运行Redis
redis·docker·容器