win10 docker+WSL2 + LxRunOffline


参考M$官网文档和

为什么要在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://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

参考

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 这个就不用移动了

8 重启docker