docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > Docker删除镜像后磁盘空间清理

Docker删除镜像后磁盘空间没有释放的原因排查与解决

作者:哪里的破水瓶

Docker删除镜像后磁盘空间却没有释放,别急着怀疑删除失败,真正占用空间的可能包括镜像共享层、构建缓存和WSL2虚拟磁盘文件,本文详细剖析问题根源,并提供从Docker内部清理到压缩VHDX文件的完整方案,帮你真正回收Windows磁盘空间

Docker 删除镜像后磁盘空间没有释放?真正原因和彻底清理方案

在使用 Docker 的过程中,很多人都会遇到一个非常困惑的问题:明明已经删除了 Docker 镜像,但是电脑磁盘空间一点都没有增加。

例如:

docker rmi xxx-image

执行成功。

查看:

docker images

发现镜像已经不存在。

但是 Windows 的 C 盘 / E 盘空间:

一点没回来。

很多人第一反应是:Docker 删除失败了吗?

实际上,大多数情况下并不是。

Docker 删除的是“镜像”,但是磁盘占用可能来自:

一、docker images 显示的大小 ≠ 实际磁盘占用

很多人会误解:

docker images

看到:

REPOSITORY     SIZE
my-app         5GB

于是认为:删除这个镜像应该释放 5GB。

但实际上 Docker 镜像不是一个完整文件,而是由多个 Layer 组成。

例如:

镜像A
Layer1  Ubuntu基础层
Layer2  Java环境
Layer3  应用代码
镜像B
Layer1  Ubuntu基础层
Layer2  Java环境
Layer4  另外代码

其中:

Layer1
Layer2

两个镜像共享。

所以删除镜像 A:

docker rmi 镜像A

Docker 只能删除:Docker删除镜像后磁盘空间却没有释放?别急着怀疑删除失败,真正占用空间的可能包括镜像共享层、构建缓存和WSL2虚拟磁盘文件,本文详细剖析问题根源,并提供从Docker内部清理到压缩VHDX文件的完整方案,帮你真正回收Windows磁盘空间

而共享 Layer 会继续保留。

因此:删除一个几 GB 的镜像,磁盘可能只释放几 MB,甚至 0MB。

二、真正占空间的大户:Build Cache

很多情况下,占用空间最多的不是镜像,而是:

Build Cache

例如:

频繁执行:

docker build .

每一次构建都会产生缓存:

build cache
    |
    ├── 基础镜像缓存
    ├── 中间层缓存
    ├── 编译缓存
    └── 临时构建层

这些缓存:

几十 GB,甚至几百 GB 都很常见。

三、查看 Docker 真正占用情况

不要只看:

docker images

应该使用:

docker system df -v

输出类似:

TYPE            TOTAL     ACTIVE    SIZE

Images          20        5         80GB

Containers      10        2         5GB

Local Volumes   8         3         50GB

Build Cache                         200GB

重点关注:

Build Cache

很多时候真正的问题就在这里。

四、清理 Docker 无用资源

清理未使用资源

执行:

docker system prune -a

会清理:

执行前 Docker 会提示:

WARNING! This will remove:
 - all stopped containers
 - all networks not used by at least one container
 - all images without at least one container associated
 - all build cache

确认即可。

如果需要删除 Volume

Volume 可能保存:

如果确定不要:

docker system prune -a --volumes

会额外删除:未使用 Volume

注意:

如果里面有数据库数据,请谨慎执行。

五、Windows + Docker Desktop + WSL2 特殊问题

如果你使用:

Windows
 +
Docker Desktop
 +
WSL2

可能出现:Docker 已经清理完成,但是 Windows 磁盘空间没有回来。

原因:

Docker Desktop 默认把 Linux 文件系统存储在:

.vhdx

虚拟磁盘文件中。

例如:

常见路径:

C:\Users\用户名\AppData\Local\Docker\wsl\data\ext4.vhdx

但是不同版本、不同安装位置可能不同。

例如:

E:\Docker\DockerDesktopWSL\disk\docker_data.vhdx

或者:

C:\Users\31094\AppData\Local\Docker\wsl\main\ext4.vhdx

六、为什么清理 Docker 后 VHDX 不变小?

这是 WSL2 的设计机制。

过程:

Docker删除数据
        ↓
Linux虚拟磁盘内部空间释放
        ↓
ext4.vhdx 文件大小不自动缩小
        ↓
Windows磁盘空间仍然被占用

也就是说:

内部:

100GB → 20GB

但是:

Windows看到:

ext4.vhdx 仍然100GB

七、正确释放 Windows 磁盘空间

第一步:关闭 Docker 和 WSL

退出 Docker Desktop。

然后执行:

wsl --shutdown

确保 WSL 虚拟机停止。

第二步:找到真实 VHDX 文件

不要固定认为一定是:

ext4.vhdx

应该查找 Docker 数据目录。

重点:找体积最大的 .vhdx 文件。

例如:

docker_data.vhdx     400GB
ext4.vhdx             300GB
其他文件              10MB

通常最大的就是 Docker 数据盘。

第三步:使用 DiskPart 压缩

管理员身份打开 PowerShell:

执行:

diskpart

进入:

DISKPART>

选择你的 VHDX:

例如:

select vdisk file="C:\Users\31094\AppData\Local\Docker\wsl\main\ext4.vhdx"

成功:

DiskPart 已成功选择虚拟磁盘文件。

然后执行:

compact vdisk

等待:

100 百分比已完成

DiskPart 已成功压缩虚拟磁盘文件。

退出:

exit

八、实际效果

完成后:

Docker清理前
ext4.vhdx
400GB
执行:
docker system prune -a
+
compact vdisk
之后:
ext4.vhdx
几十GB

Windows 磁盘空间真正释放。

九、完整推荐流程

以后 Docker 占空间,按照这个顺序:

1. 查看占用

docker system df -v

2. 清理 Docker

docker system prune -a

需要清 Volume:

docker system prune -a --volumes

3. Windows Docker Desktop

关闭:

wsl --shutdown

压缩:

diskpart

select vdisk file="xxx.vhdx"

compact vdisk

总结

Docker 删除镜像后空间没有释放,通常不是删除失败,而是:

  1. 镜像 Layer 共享,没有真正删除
  2. Build Cache 占用大量空间
  3. Docker Desktop WSL2 的 VHDX 不会自动缩小

真正完整释放空间,需要:

docker system df -v

docker system prune -a

wsl --shutdown

diskpart

compact vdisk

这样才能让 Docker 占用的磁盘空间真正回到 Windows。

本文实际验证环境:Windows + Docker Desktop + WSL2。 不同版本 Docker Desktop 的 VHDX 路径可能不同,判断标准不是路径,而是找到 Docker 使用的最大 .vhdx 文件。

到此这篇关于Docker删除镜像后磁盘空间没有释放的原因排查与解决的文章就介绍到这了,更多相关Docker删除镜像后磁盘空间清理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文