背景:
以WSL2方式使用Docker Desktop for Windows确实带来了更好的体验,但同时也带来新的问题。其中最典型的问题就是系统盘空间的占用越来越大。而且还有典型的内存问题。
最初没有注意,也是因为没有找到最根本的解决办法,采用下面的配置粗略的应付了一下:
1 [wsl2] 2 memory=10GB 3 swapFile=D:\\LocalCaches\\wsl2\\swap.vhdx 4 localhostForwarding=true
注:在当前系统的用户下,新建.wlsconfig文件,在其中配置以上代码。
实际上本质问题没有解决。有一个码友来询问这个问题,才认认真真的考虑如何解决。
说明:
默认情况下,Docker Desktop for Window会创建如下两个发行版(distro):
- docker-desktop:用于存放程序
- docker-desktop-data:用于存放镜像
如果访问%LOCALAPPDATA%/Docker/wsl目录,就可以看到两个文件夹,同时每个文件夹中都会有一个vhdx文件。
%LOCALAPPDATA%/Docker/wsl就是当前登录用户的AppData\Local目录,假设当前登录的用户为Administrator,那么这个目录就是C:\User\Administrator\AppData\Local\Docker\wsl
- data/ext4.vhdx 是被docker-desktop-data 发行版使用
- distro/ext4.vhdx 是被 docker-desktop 发行版使用
docker-desktop-data 是被用来存储docker images 以及相关的数据。因此,它的大小会随着使用逐步增长,因此导致系统盘空间不足。
vhdx文件最大支持256G,超出这个大小将会出错。参见:官方说明
解决步骤
1、删除所有容器
可以使用命令,查看所有容器:
1 docker ps -a
其中-a参数指代当前没有在运行的容器,如果不写-a则表示所有正在运行的容器。
如果需要在cmd窗口内以命令行的方式删除已部署容器,则可参考如下命令:
1 docker rm 容器id
补充说明:如果需要在cmd窗口内以命令行的方式查看和删除已下载镜像,则可参考如下命令:
查看镜像列表:
1 docker images
删除指定镜像:
1 docker rmi 镜像id
除以上以命令行处理的方法外,还可采用docker为windows 提供的desktop界面处理:
打开Docker Desktop for Window 的Dashboard界面,将该界面中的所有内容删除。
这一步很重要,如果不这样操作,进行后续操作的时候,要么提示网络相关错误:cannot create a specific network,要么导入完成之后,vhdx文件会消失。
2、退出Docker Desktop
3、在控制台中,使用下面命令,关闭所有发行版
wsl --shutdown
4、检查是否所有发行版都已经关闭。
wsl --list --verbose
命令可以查看到,实例效果如下:
1 D:\work>wsl --list --verbose 2 NAME STATE VERSION 3 docker-desktop Stopped 2 4 Ubuntu-18.04 Stopped 2 5 docker-desktop-data Stopped 2 6 D:\work>
5、备份已有image数据
通过下面命令,将已有的image数据,以tar格式备份已有数据到指定目录。目录根据自己实际情况指定。
wsl --export docker-desktop-data E:\docker-desktop\docker-desktop-data.tar
docker-desktop-data名字,就是上一步中,列举出来的Docker Desktop存储image的发行版
6、注销当前的docker-desktop-data发行版
1 wsl --unregister docker-desktop-data
该命令执行完成之后,再次使用wsl --list --verbose命令查看,docker-desktop-data就已经不在了。
7、重新导入备份的docker-desktop-data
1 wsl --import docker-desktop-data E:\docker-desktop\data E:\docker-desktop\docker-desktop-data.tar --version 2
- docker-desktop-data Docker Desktop存储image的发行版
- 第二个路径,即指定vhdx新的放置目录。指定到目录级别即可,不用指定vhdx名。
- 第三个路径,指定第5步中备份的数据。
8、重新运行Docker Desktop
Docker Desktop 运行成功之后,查看新目录中的vhdx的修改时间,如果修改时间是最新时间,就说明配置成功。
备注
转载内容中选择仅将存放镜像的docker-desktop-data进行了转储。
我个人的实际选择是将docker-desktop-data和docker-desktop这两个都进行了转储,分别存储在自定义的 盘符:/docker/data 和 盘符:docker/desktop 文件路径下,方便统一管理。
参考资料:
(1):https://dev.to/kimcuonthenet/move-docker-desktop-data-distro-out-of-system-drive-4cg2
(2):https://blog.csdn.net/qq_26709459/article/details/80785761
(3):https://docs.microsoft.com/en-us/windows/wsl/compare-versions#understanding-wsl-2-uses-a-vhd-and-what-to-do-if-you-reach-its-max-size