Docker Image 删除后占用空间

Posted

技术标签:

【中文标题】Docker Image 删除后占用空间【英文标题】:Docker Image Taking up Space After Deletion 【发布时间】:2021-01-12 00:42:31 【问题描述】:

我提交了一个现有的 Docker 容器来创建一个新的镜像,但是提交的镜像太大了(原始镜像是 3+GB,并且只在容器中安装了一些额外的东西,提交的镜像是 8+GB )。

我的空间不足,所以我决定删除提交的图像,但即使删除了提交的图像,我的磁盘空间也没有增加。然而,当我运行docker system df 时,它只显示应该使用原始图像和容器的空间(我只有一个图像和一个容器)。

我有什么方法可以释放我确定仍被我删除的图像占用的空间? (作为参考,我创建了图像,然后在一个小时内将其删除,并且一直在监视我的可用空间,所以我很确定是这个而不是其他东西占用了空间。)

另外,我正在使用带有 WSL2 集成的 Docker Desktop for Windows,因此通过转到 /var/lib/docker 并检查磁盘使用情况来检查 Docker 的磁盘使用并不容易。

【问题讨论】:

和这个问题一样的场景,你可以试试这些命令***.com/a/43068138/10776363 【参考方案1】:

由于您在 Windows 上并在 docker for desktop 中运行,因此您实际在 VM 中运行 docker。然后取决于设置的磁盘映像大小,通常虚拟磁盘会扩展以填充该空间。

您可以缩小磁盘映像:

停止泊坞窗桌面

打开一个管理员 powershell 终端

运行Optimize-VHD -Path "C:\ProgramData\DockerDesktop\vm-data\DockerDesktop.vhdx" -Mode Full,其中路径是 docker 桌面设置 > 资源 > 高级 > 磁盘映像位置中记录的路径。

启动docker桌面

这应该会缩小 docker 虚拟机。

【讨论】:

我没有“docker 桌面设置 > 资源 > 高级 > 磁盘映像位置”菜单,您使用的是哪个 docker 桌面?我有 Docker 引擎 19.03.13。【参考方案2】:

我使用这些命令将桌面图像从 35GB 缩小到 1GB

(在 Windows 10 中,docker 版本 19.03.13)

删除未使用的图像和其他资源

docker system prune -a

移除更多资源

docker volume rm $(docker volume ls -q -f dangling=true)

停止docker桌面,优化镜像

确保 HyperV 已开启

%windir%\System32\mmc.exe "%windir%\System32\virtmgmt.msc" 或在 win 搜索中输入 Hyper-V

在 GUI 中优化磁盘 > 转到 VM,然后检查磁盘

Optimize-VHD -Path "C:\ProgramData\DockerDesktop\vm-data\DockerDesktop.vhdx" -Mode Full

启动 docker 桌面

现在我有 34+GB 可用磁盘空间

使用 docker 桌面应用清理

您可以在单击标题中的错误图标然后单击清理/清除数据时清除数据..

【讨论】:

为了确保 Hyper-V 已开启,我进入Control Panel,选择Programs and Features,选择Turn Window Features On Or Off,开启Hyper-V 下的所有内容。我也关闭了Virtual Machine Platform,如果它不起作用,试试这个。 完美的解决方案,你拯救了我的一天。 在我的机器中,VHDX 位于C:\Users\$Env:UserName\AppData\Local\Docker\wsl\data。除了停止 Docker,我还必须停止 LxsManager 服务,因为我目前使用 WSL2。【参考方案3】:

我在使用非常大的 docker buildx 缓存时遇到了这个问题,我不想修剪所有缓存,因为过滤器参数是 currently broken

PS> docker run -it --rm ubuntu:18.04 df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay         252G  249G    0G 100% /
tmpfs            64M     0   64M   0% /dev
tmpfs           7.9G     0  7.9G   0% /sys/fs/cgroup
shm              64M     0   64M   0% /dev/shm
/dev/sdd        252G  249G    0G 100% /etc/hosts < this is the device we have to expand

记下哪个设备已满。这是您以后必须调整大小的磁盘。

使用diskpart扩展虚拟磁盘

WSL2 下并按照Microsoft 在expanding the size of your vdisk 上的说明进行操作,这应该允许您扩展数据/isocache 挂载。

如果你和我一样,将你的 Docker vhdxAppData/Packages 移出,并且它没有在 Docker 桌面 GUI 中列出,你可以在设置中找到它:

PS> cat $env:APPDATA\Docker\settings.json | Select-String dataFolder
  
    "dataFolder": "D:\\DockerDesktop",

wsl/data目录下找到ext4.vhdx文件(不是DockerDesktop.vhdx!)使用diskpart扩盘。

DISKPART> select vdisk file="D:\DockerDesktop\wsl\data\ext4.vhdx"

DiskPart successfully selected the virtual disk file.

DISKPART> detail vdisk

Device type ID: 0 (Unknown)
Vendor ID: 00000000-0000-0000-0000-000000000000 (Unknown)
State: Added
Virtual size:  256 GB
Physical size:  252 GB
Filename: D:\DockerDesktop\wsl\data\ext4.vhdx
Is Child: No
Parent Filename:
Associated disk#: Not found.

要扩展到 512 GB,请以 MB (512000) 为单位输入大小并退出 diskpart

DISKPART> expand vdisk maximum=512000
DISKPART> exit

在 WSL 中展开

要允许 Docker 使用额外空间,请启动您的 WSL2 发行版。你不需要为此使用 docker(这是我个人有点困惑的地方)

PS> wsl
user@WSL2:/mnt/c/Users/user$ sudo mount -t devtmpfs none /dev
user@WSL2:/mnt/c/Users/user$ mount | grep ext4

/dev/sdb on / type ext4 (rw,relatime,discard,errors=remount-ro,data=ordered)
/dev/sdd on /mnt/wsl/docker-desktop-data/isocache type ext4 (rw,relatime,discard,errors=remount-ro,data=ordered)

isocache 位于/dev/sdd(与之前的完整磁盘匹配)。运行 resize2fs 并使用 sizetype 后缀的新尺寸

sudo resize2fs /dev/<DEVICE> 512000M

检查您是否还有更多空间!

docker run -it --rm ubuntu:18.04 df -h


Filesystem      Size  Used Avail Use% Mounted on
overlay         492G  249G  220G  54% /
tmpfs            64M     0   64M   0% /dev
tmpfs           7.9G     0  7.9G   0% /sys/fs/cgroup
shm              64M     0   64M   0% /dev/shm
/dev/sdd        492G  249G  220G  54% /etc/hosts

【讨论】:

【参考方案4】:

我使用以下步骤清理 docker 空间。

    在 Windows 命令提示符下执行“docker system prune -f”(它说释放 45GB。但是,我能够看到 6GB)。

    已打开 Docker 桌面应用程序。

    导航到“疑难解答”菜单并单击“清理/清除数据”按钮。

请注意,这将清除 Docker 中的所有数据。

【讨论】:

【参考方案5】:

如果您在尝试执行 Optimize-VHD 时遇到错误:

Optimize-VHD : The term 'optimize-vhd' is not recognized as the name of a cmdlet

您可以改用diskpart

wsl --shutdown
diskpart
select vdisk file="C:\Users\YourUser\AppData\Local\Docker\wsl\data\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

【讨论】:

访问被拒绝。我怎样才能删除 vhdx 文件? 只需确保@drupalfan 您正在以管理员身份运行用于这些命令的终端。【参考方案6】:

此代码可用作提升 PowerShell 会话的快速修复。我必须使用 pwsh 因为它可以在没有临时文件的情况下与 diskpart 一起正常工作。

docker system prune -a --volumes
net stop com.docker.service
taskkill /IM "docker.exe" /F
taskkill /IM "Docker Desktop.exe" /F
wsl --shutdown
((@"
select vdisk file="%LOCALAPPDATA%\Docker\wsl\data\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit
"@
)|diskpart)
net start com.docker.service
. "C:\Program Files\Docker\Docker\Docker Desktop.exe"

【讨论】:

Optimize-VHD 在尝试减少/删除空间时对我不起作用。这是对我有用的最后一个资源。 无效,访问被拒绝。

以上是关于Docker Image 删除后占用空间的主要内容,如果未能解决你的问题,请参考以下文章

Docker 容器日志占用了我所有的磁盘空间

mongo如何删除数据后相应的删除空间和内存占用

“硬盘空间被占用,但找不到占用的文件”的解决办法

清空回收站后没有释放硬盘空间

Linux磁盘空间被占用,而且找不到占用文件

Adobe Acrobat Pro DC占用存储空间太大,怎么办?