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:

https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

4 重启电脑

wsl --set-default-version 2

正常应该显示

PS C:WindowsSystem32> 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/wsl2kernel

Press 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:softdevdockerLxRunOffline-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:vmwsl

开始修改WSL安装路径

LxRunOffline move -n Ubuntu-20.04 -d D:vmwsl

移动完成可以看见移动出来的文件 ext4.vhdx

等待移动完成查看

LxRunOffline get-dir -n Ubuntu-20.04

但docker的2个还是移动不了。

LxRunOffline get-dir -n docker-desktop

PS D:softdevdockerLxRunOffline-v3.5.0-msvc> ./LxRunOffline get-dir -n docker-desktop
\?C:UsersXXXAppDataLocalDockerwsldistro

参考

https://www.cnblogs.com/xhznl/p/13184398.html

下面是操作方法:

1 首先关闭docker

2 关闭所有发行版:

wsl --shutdown

3 将docker-desktop-data导出到D:SoftwareDatawsldocker-desktop-datadocker-desktop-data.tar(注意,原有的docker images不会一起导出)

wsl --export docker-desktop-data D:vmwsldocker-desktop-datadocker-desktop-data.tar

注销docker-desktop-data:

wsl --unregister docker-desktop-data

重新导入docker-desktop-data到要存放的文件夹 D:vmwsldocker-desktop-data

wsl --import docker-desktop-data D:vmwsldocker-desktop-data D:vmwsldocker-desktop-datadocker-desktop-data.tar --version 2

看到同样 出现vhdx 虚拟机镜像文件,OK

 

那么在资源管理器 去 目录:

%LOCALAPPDATA%/Docker/wsl

下面是2个文件夹,data 和distro

现在data空了, distro下只有1个100M的 就是docker-desktop 这个就不用移动了

8 重启docker

原文地址:https://www.cnblogs.com/xuanmanstein/p/13630416.html