win10 docker+WSL2 + LxRunOffline
参考M$官网文档和
https://www.cnblogs.com/adameta/p/12179922.html
为什么要在win下用docker
1 某些不可描述的甲方指定要用windows客户端和服务器。所以得开发伪windows专属的桌面应用。
把各种后端 数据库,web service都封装成服务,不论部署在本地,还是内网的服务器,用linux开发这些后端服务特别方便。
2 便于部署。避免各种复杂依赖,端口等等等。
3 用docker开机自动运行,来代替多进程启动,避免弹出一堆控制台"黑窗口"。
也便于开发调试。
为什么 要安装 WSL2
因为windows下docker 区分为windows container(运行基于windows系统的docker image) 和 linux container(基于linux的镜像),
我们用docker主要就是后端服务,谁没事用win server啊? 所以大多需要 linux container。
而win下的docker运行 linux container依赖的“backend”分2种:
wsl1 ( win10 封装的一套类linux api ,背后还是转义成win api 到windows kernel, 所以支持的linux命令并不完全)
VM (通过虚拟机运行linux。 基于hyper-V WSL2 也属于VM )
参考 Windows下想使用Linux环境,WSL、Docker、VM应该怎么选择? - 木头龙的回答 - 知乎 https://www.zhihu.com/question/339939686/answer/920731591
据说基于WSL2的比hyper-V的要快,本着节约生命的目的,当然要用。
WSL2模式下 docker是1个service, 而 WSL2的linux发行版 就是 docker的 backend。 管理了一切docker 的volume, images, container
为什么要用 LxRunOffline 管理 WSL2
因为默认安装的WSL2 以及后面全部的docker数据就都在C盘了(路径是 %LOCALAPPDATA%/Docker/wsl)。无法修改
而基于WSL2的docker desktop, 也就无法管理image container的位置了。 稍微在linux下用过一点docker就知道, 镜像和容器的存储目录肯定不能放/ 下 (默认分区很小 10G 20 G), 得改到/home之类的分区去。
需要用LxRunOffline 对 WSL进行迁移,备份,等等管理
迁移了WSL,也就迁移了docker的那些Volume container images等等等。
下面是具体步骤:
1 操作系统升级到2004
2 启用2个feature
powershell 管理员权限
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
3下载安装补丁
the latest WSL2 Linux kernel update package for x64 machines:
4 重启电脑
wsl --set-default-version 2
正常应该显示
PS C:\Windows\System32> wsl --set-default-version 2
有关与 WSL 2 的主要区别的信息,请访问 https://aka.ms/wsl2
如果报错,返回第三步
5 在windows商店 搜索安装一个linux发行版
比如 Ubuntu20.04
https://www.microsoft.com/zh-cn/p/ubuntu-2004-lts/9n6svws3rx71?rtc=1#activetab=pivot:overviewtab
正常的安装,应该看到弹出控制台,显示:
Installing, this may take a few minutes... Please create a default UNIX user account. The username does not need to match your Windows username. For more information visit: https://aka.ms/wslusers Enter new UNIX username:
如果此时报错:
Installing, this may take a few minutes...
WslRegisterDistribution failed with error: 0x800701bc
Error: 0x800701bc WSL 2 ?????????????????? https://aka.ms/wsl2kernelPress any key to continue...
参考 https://github.com/microsoft/WSL/issues/5393
还是返回第3步
6 安装docker desktop
去docker官网下载。
https://www.docker.com/get-started
安装时选择WSL2模式
7 用LxRunOffline迁移 WSL
参考
https://blog.bccn.net/%E9%9D%99%E5%A4%9C%E6%80%9D/67307
下载LxRunOffline, 目前202009 是 3.5版
https://github.com/DDoSolitary/LxRunOffline/releases
解压后就是exe文件,
在这个路径下:
./LxRunOffline list
PS D:\soft\dev\docker\LxRunOffline-v3.5.0-msvc> ./LxRunOffline list
docker-desktop
Ubuntu-20.04
docker-desktop-data
其中Ubuntu-20.04 是我从Mircosoft Store里安装的WSL。然后docker-desktop 和 docker-desktop-data 是安装了docker for windows ,用WSL2模式安装,产生的2个镜像。
可以认为docker的2个系统依赖 Ubuntu-20.04
新建文件夹作为移动目标,如
D:\vm\wsl
下面是操作方法:
1 首先关闭docker
2 关闭所有发行版:
wsl --shutdown
3 开始修改WSL安装路径
./LxRunOffline move -n Ubuntu-20.04 -d D:\vm\wsl
查看
./LxRunOffline get-dir -n Ubuntu-20.04
显示
D:\vm\wsl
移动完成可以看见移动出来的文件 ext4.vhdx
但docker的2个还是移动不了。
./LxRunOffline get-dir -n docker-desktop
显示
\\?\C:\Users\XXX\AppData\Local\Docker\wsl\distro
参考
https://www.cnblogs.com/xhznl/p/13184398.html
4 将docker-desktop-data导出到D:\SoftwareData\wsl\docker-desktop-data\docker-desktop-data.tar(注意,原有的docker images不会一起导出)
wsl --export docker-desktop-data D:\vm\wsl\docker-desktop-data\docker-desktop-data.tar
注销docker-desktop-data:
wsl --unregister docker-desktop-data
重新导入docker-desktop-data到要存放的文件夹 D:\vm\wsl\docker-desktop-data\
wsl --import docker-desktop-data D:\vm\wsl\docker-desktop-data\ D:\vm\wsl\docker-desktop-data\docker-desktop-data.tar --version 2
看到同样 出现vhdx 虚拟机镜像文件,OK
那么在资源管理器 去 目录:
%LOCALAPPDATA%/Docker/wsl
下面是2个文件夹,data 和distro
现在data空了, distro下只有1个100M的 就是docker-desktop 这个就不用移动了