在WSL 2中使用开发容器

2020年7月1日,由Brigit Murtaugh发布,@BrigitMurtaugh

利用Docker容器和Windows Subsystem for Linux 2 (WSL 2)的强大功能,您可以在深度集成的Linux内核中,在熟悉的沙盒容器环境中开发应用程序,从而保留您的Windows环境。

五月在虚拟化领域为我们带来了几个令人兴奋的公告:Windows 10 2020年5月更新将WSL 2作为开箱即用的功能添加,并且Docker Desktop Stable 2.3.0.2正式发布,支持WSL 2后端。

之前的博客文章中,我们探讨了如何在WSL 2中使用Docker。第一个要求是安装Windows Insiders,因为WSL 2支持尚未成为稳定版Windows的一部分,接下来是安装Docker WSL 2的技术预览版。现在,Windows WSL 2和Docker支持都已经在稳定的GA版本中发布!

在这篇文章中,我们将看看这两种工具是如何工作的,以及如何在Visual Studio Code中利用它们来在WSL 2中高效地使用开发容器。

虚拟化的新时代

WSL 2 和最新版本的 Docker Desktop 都改变了虚拟化的工作方式。

WSL 2

正如在之前的文章中所讨论的,WSL 2 在Windows Subsystem for Linux上采用了新的方法,通过在轻量级虚拟机(VM)中使用真实的Linux内核。它已经过优化,感觉无缝且深度集成到您的Windows环境中,因此您将拥有快速的启动时间、小的资源占用,并且无需任何VM配置或管理要求。

系统调用允许您执行诸如访问文件、请求内存和创建进程等功能。由于WSL 2包含完整的Linux内核,它具有完整的系统调用能力,这意味着您喜欢的应用程序(如Docker)将完全可靠地工作。

Docker

在WSL 1中,由于Windows和Linux之间的根本差异,Docker引擎无法直接在WSL内运行,Docker团队开发了一种使用Hyper-V虚拟机和LinuxKit的替代解决方案。然而,由于WSL 2现在具备完整的系统调用能力,Docker可以完全在WSL 2中运行,这促使Docker团队进行了更多的投资。

2020年5月新版本的Docker Desktop可以更快地构建容器并消耗更少的资源,因为它利用了WSL 2的动态内存分配。冷启动时间可以少于10秒,而之前的版本几乎需要一分钟。此外,不再需要Hyper-V,因此本文中详细介绍的步骤适用于Windows 10家庭版。

由于Windows中的WSL 2和Docker Desktop现已正式发布,您可以更有信心地在WSL 2中使用您的开发容器。

入门指南

先决条件:

安装完成后,Docker 会检测到您已安装 WSL,并提示您启用 WSL 集成。从弹出窗口中选择启用 WSL 集成

Docker Desktop WSL 集成对话框

可选:安装新的Windows Terminal以获得最佳体验,包括在同一界面中打开新的PowerShell和Ubuntu终端的能力。

在 WSL 2 中打开 VS Code

让我们将VS Code连接到我们的WSL 2引擎。打开一个Ubuntu终端,导航到你选择的源代码文件夹,然后输入code .。这将启动一个VS Code实例,让你可以使用WSL作为你的全职开发环境。你也可以从命令面板连接到WSL。我将打开一个简单的HelloNode应用程序:

从Ubuntu终端启动代码

一旦VS Code打开,它会识别到我们已经安装了WSL,并建议我们安装WSL扩展。我将选择安装

WSL扩展推荐

安装扩展后,我们可以重新加载VS Code以连接到WSL 2:

安装扩展后重新加载VS Code

一旦我们重新加载,我们可以通过检查窗口左下角的WSL指示器来确认我们已连接到Ubuntu:

WSL: Ubuntu 左下角指示器

安装WSL扩展后,VS Code中添加了远程资源管理器。当我们查看资源管理器内部时,可以看到有关我们的Linux发行版的信息:

带有WSL目标的远程资源管理器

使用容器

我们可以利用Dev Containers扩展来查看和附加到容器,以及其他各种场景,例如:

这些配置允许您轻松地在不同机器上重新创建相同的开发环境,将特定于项目的工具和扩展安装到DevContainer中,并在类似于部署环境的环境中进行开发,同时保持本地机器不变。我们还可以使用Docker扩展查看并附加到容器。

虽然在使用WSL 2引擎时,您可以从Windows和WSL 2文件系统访问源代码,但我们建议使用WSL 2文件系统,因为性能要好得多。由于在WSL 2内部使用文件系统时性能更好,让我们来看看如何使用它。

我们需要选择要在容器中打开的文件夹。首先,确保你已经安装了Dev Containers扩展。然后,我们可以从已经使用WSL扩展打开的文件夹中调用Dev Containers: Reopen in Container命令。

我在我的WSL 2文件系统上有一个现有的HelloNode文件夹,里面包含我的Node项目。我将选择:Dev Containers: Reopen in Container

命令面板:开发容器:在容器中重新打开

将显示容器定义列表,因为存储库中还没有DevContainer配置。显示的容器配置定义列表是根据我的项目类型过滤的。我将选择Node.js 14

命令面板:Node.js 14

VS Code 的新实例打开。VS Code 开始构建镜像,然后启动我们的容器:

VS Code 实例启动 Dev Container

我们的应用程序现在有一个.devcontainer文件夹,其中存储了容器配置信息。为了再次确认我们已连接到WSL并在容器内,让我们打开集成终端并检查uname和Node的版本:

检查uname和node -v

正如我们所看到的,我们的uname返回的是Linux,所以我们仍然连接到WSL 2引擎,并且node -v返回了v14.4.0,因此我们已经成功配置了我们的Node 14容器。

让我们尝试使用F5运行我们的应用程序:

本地主机运行Hello World应用程序

成功!

反馈与进一步阅读

为了帮助您使用WSL和容器设置VS Code,我们在VS Code的远程开发文档中提供了详细的文章。如果您对我们的团队有任何问题或反馈,请随时在VS Code的远程开发GitHub仓库上提出问题,或者在Twitter上@code联系我们。

编程快乐!

Brigit Murtaugh, VS Code 项目经理 @BrigitMurtaugh