一、Docker和WSL2概述

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。一个完整的Docker有以下几个部分组成:

  • DockerClient客户端
  • Docker Daemon守护进程
  • Docker Image镜像
  • DockerContainer容器

在windows下配合VS code的Remote - Containers插件,使用体验很不错,缺点就是不像WSL2一样可以在资源管理器中直接处理文件。

但是,Docker本身是基于Linux的。为了让windows用户能够体验docker的便利,docker for windows应运而生。而它则是基于windows subsystem for linux(WSL)的。启动docker可以发现WSL多了docker-desktopdocker-desktop-data两个wsl分发版。而docker就在此基础上运行。(当然最初的docker for windows后端并不是直接使用WSL)。

Windows Subsystem for Linux(简称WSL)是一个在Windows 10上能够运行原生Linux二进制可执行文件(ELF格式)的兼容层。它是由微软与Canonical公司合作开发,其目标是使纯正的Ubuntu、Debian等映像能下载和解压到用户的本地计算机,并且映像内的工具和实用工具能在此子系统上原生运行。如果使用Windows 10 2004以上,可以通过WSL 2来窗口化运行桌面应用,也不需要另外安装其他的X 服务器。

二、WSL安装使用

详细内容参加微软官方文档。用户可以安装微软提供的现成的分发版。可以更改分发版的安装位置,分发版的启动用户等。核心命令是wsl。建议有条件的电脑使用WSL2。
配合VS code的Remote - WSL插件使用很香。

三、基于Docker导入任意WSL分发

微软提供的分发版十分有限,例如就没有CentOS,虽然它已经被Red Hat所放弃,奈何众多服务器仍然使用CentOS。用户可以自定义打包分发版,在github上有许多开源的分发版,例如wsldl-pg/CentWSL。不过微软提供了一个基于Docker容器的方式,详细内容参加官方文档,但值得一提的是,官方文档中使用下述命令导出docker容器,本人实测在wsl导入时会报错“未指定的错误”。

1
2
docker export <容器名|容器ID> > <目标tar文件>     # 报错未指定的错误
docker export -o <目标tar文件> <容器名|容器ID> # 正常被WSL导入

观察两种导出方式发现文件大小并不一致,这或许就是差别所在。

四、基本操作

修改默认登录用户

可以通过wsl命令来指定登录用户wsl -d <分发名称> -u <用户名称>,但有时候需要修改默认用户为非root用户,可以以root身份创建/etc/wsl.conf,配置如下

1
2
[user]
default=用户名

自定义DNS

wsl启动时默认为定义DNS为宿主机的虚拟网卡,但这个速度远不如正经DNS服务器。WSL可以选择禁用默认生成的DNS,即为在/etc/wsl.conf中配置

1
2
[network] 
generateResolvConf = false

然后重启WSL子系统,自行配置/etc/resolv.conf(一定要重启,否则修改会被自动纠正)。
1
nameserver 114.114.114.114

参考资料