写点什么

手绘流程图,教你 WSL2 与 Docker 容器无缝互相迁移

  • 2022 年 3 月 16 日
  • 本文字数:1802 字

    阅读完需:约 6 分钟

本文分享自华为云社区《WSL2与Docker容器,无缝互相迁移》,作者: tsjsdbd 。


注:本文提到的 WSL 都是指 WSL2

WSL 与 Docker

 

WSL 非常像 windows 版的 Docker,可以直接启动“容器”(故意加引号,下面有解释),并且在容器世界里面,可以执行各种 Linux 操作。像下面这样,是不是和 Docker 很像?



 ps:上面提到的“容器”,实际是安全容器(即:虚机),WSL2 内部架构如下:



虽 WSL 和 Docker 很像,但是它对 WSL 镜像有要求,就是得从 MS 的应用商店下载:



这个就稍显不那么方便,毕竟你可能已经有很多现成的 Docker 容器了,这里又得重新安装一遍。


我是 Windows 上有 WSL,我的 Linux 开发机上有 Docker,那我怎么在 WSL 里面跑 Docker 呢?

WSL 运行 Docker 容器

常见的 WSL 里面运行 Docker,是这样子的:



就是把 WSL 当做一台新的开发机,然后在 WSL 里面,安装 Docker 软件。

这样子,也能解决问题。就是稍微麻烦了一点点。那能不能 WSL 直接运行 Docker 镜像呢?

答案是可以的:

参考:https://docs.microsoft.com/en-us/windows/wsl/use-custom-distro

 

这种方法下,是类似这个样子的:



具体操作如下:

  1. 在 Docker 里面,将容器导出来

//查看正在运行的容器docker ps//根据容器ID,导出镜像包docker export $ContainerID > ./tsjsdbd.tar
复制代码
  1. 然后再 WSL 里面,将 Docker 镜像导入:

wsl --import <DistributionName> <InstallLocation> <FileName>
复制代码

示例

比如,我这里用 Docker 运行了一个 busybox 容器:

docker run -it busybox /bin/sh
复制代码

然后查询容器 ID:

docker ps
CONTAINER ID IMAGE
c1e9e8f77336 busybox
复制代码

导出:

docker export c1e9e8f77336 > tsjsdbd_busybox.tar
复制代码

然后我把这个 镜像文件,拷贝到我的 windows 电脑上。

并在 wsl 里面导入:

wsl --import tsjsdbd_busybox ./busybox ./tsjsdbd_busybox.tar
复制代码

导入后查看:

wsl -l
复制代码

这时,我启动这个 busybox 镜像。

wsl -d tsjsdbd_busybox
复制代码

OK,这时我已经在 WSL 容器里面了,这是一个 busybox 的 Docker 容器镜像。

Docker 运行 WSL 镜像

从上面的操作可以看出来,WSL 和 Docker 的镜像是相通的。所以 WSL 系统,也可以导出给 Docker 直接运行。类似这个样子:



 具体操作如下:

先查看下当前跑了哪些 wsl 容器:

wsl -l -v
NAME STATE VERSION
* Ubuntu-18.04 Stopped 2
tsjsdbd_busybox Running 2
复制代码

导出指定的 wsl 镜像

wsl --export tsjsdbd_busybox ./mybox.tar
复制代码

其中 “tsjsdbd_busybox” 就是你希望导给 Docker 运行的 WSL 容器(里面可能安装了一些你需要的软件)。导出的 tar 包,就可以看做是 WSL 镜像了(可以直接导入给 Docker)

最后,在 Docker 里面,导入这个镜像:

docker import - mybox < mybox.tar
复制代码

 

可以查询此镜像

docker images |grep mybox
复制代码

并启动

docker run -it mybox /bin/sh
复制代码

WSL 镜像与 Docker 镜像

大体上,我给个示意:



所以 WSL 确实挺香的。

WSL 启动 GUI 界面

整体方案是利用 X11 Server,原理参考:

《Docker 运行带 UI 界面的应用,并将它的界面投射到你的 Windows 电脑》

https://bbs.huaweicloud.com/blogs/281862



X11 Server,一般网上推荐 VcXsrv,我自己用下来,感觉 MobaXterm 更傻瓜一些。所以我都用 MobaXterm 的。

附:安装 WSL

1.  系统要求

Windows 10,版本 2004 以上。

比如我的是 20H2,是 OK 的。

点击:开始-设置-关于,查询自己的版本

2.  判断 wsl2 是否已有

打开 power shell,输入

wsl -l -o
复制代码

如 OK,则不用后续步骤了(说明你的 windows 版本已经比较高)。

不行,则手动执行后续步骤

3.  允许开发者模式



4.  启动 WSL2 功能

启用 WSL2

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
复制代码

启用虚拟机平台

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
复制代码

启用 Hyper-V

dism.exe /online /enable-feature /featurename:Microsoft-Hyper-V /all /norestart
复制代码

设置 WSL2 为默认

wsl --set-default-version 2
复制代码

 5.  重启,安装 wsl 补丁

wsl_update_x64.msi
复制代码

执行以上补丁包。

补丁包下载地址:

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

附:高阶版 GPU,GUI 界面

 

Windows 版本高的(win10 21H2),可以在 WSL2 里面跑 CUDA

https://docs.microsoft.com/en-us/windows/ai/directml/gpu-cuda-in-wsl

 

再高一点(win11),可以原生支持带 GUI 界面的 Linux 程序。

https://docs.microsoft.com/en-us/windows/wsl/tutorials/gui-apps


点击关注,第一时间了解华为云新鲜技术~​

发布于: 刚刚阅读数: 2
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
手绘流程图,教你WSL2与Docker容器无缝互相迁移_Docker_华为云开发者社区_InfoQ写作平台