现已发布!阅读 10 月份的新功能和修复。

在 WSL 2 中使用开发容器

2020 年 7 月 1 日,作者:Brigit Murtaugh,@BrigitMurtaugh

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

5 月份,我们在虚拟化世界中发布了两个令人振奋的公告:Windows 10 2020 年 5 月更新在开箱即用时添加了 WSL 2 作为一项功能,并且 Docker Desktop Stable 2.3.0.2 发布了 WSL 2 后端支持。

之前的博客文章 中,我们探讨了如何在 WSL 2 中使用 Docker。第一个要求是安装 Windows 预览体验成员,因为 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 子系统 Linux 采取了一种新方法,它在轻量级虚拟机 (VM) 中使用真正的 Linux 内核。它经过优化,可以与您的 Windows 环境无缝集成,并深度集成,因此您可以获得快速启动时间、较小的资源占用量,并且完全不需要进行 VM 配置或管理。

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

Docker

在 WSL 1 中,由于 Windows 和 Linux 之间的根本差异,Docker Engine 无法直接在 WSL 中运行,并且 Docker 团队 开发了一种使用 Hyper-V VM 和 LinuxKit 的替代解决方案。但是,由于 WSL 2 现在具有完整的系统调用功能,因此 Docker 可以完全在 WSL 2 中运行,这促使 Docker 团队投入了更多资源。

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

由于 Windows 中的 WSL 2 和 Docker Desktop 现在已发布 GA 版本,因此您在 WSL 2 中使用开发容器时,可以更加自信。

入门

先决条件

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

Docker Desktop WSL integration dialog

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

在 WSL 2 中打开 VS Code

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

Launch code . from Ubuntu terminal

VS Code 打开后,它会识别出我们已安装 WSL,并建议我们安装 WSL 扩展。我将选择安装

WSL extension recommended

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

Reload VS Code after installing extension

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

WSL: Ubuntu bottom left indicator

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

Remote Explorer with WSL Targets

使用容器

除了各种其他场景(例如)之外,我们可以利用 开发容器 扩展来查看和连接到容器,例如

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

当使用 WSL 2 引擎时,您可以从 Windows 和 WSL 2 文件系统访问源代码,但我们建议使用 WSL 2 文件系统,因为 性能要好得多。由于使用 WSL 2 中的文件系统时性能更高,因此让我们逐步了解如何使用它。

我们需要选择要在一个容器中打开的文件夹。首先,确保您已安装 开发容器 扩展。然后,我们可以从已使用 WSL 扩展打开的文件夹中调用 开发容器:在容器中重新打开 命令。

我在我的 WSL 2 文件系统上有一个现有的 HelloNode 文件夹,其中包含我的 Node 项目。我将选择:开发容器:在容器中重新打开

Command Palette: Dev Containers: Reopen in Container

将显示容器定义列表,因为存储库中还没有开发容器配置。显示的容器配置定义列表会根据我的项目类型进行筛选。我将选择Node.js 14

Command Palette: Node.js 14

将打开一个新的 VS Code 实例。VS Code 开始构建映像,然后启动我们的容器

VS Code instance starting with Dev Container

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

Check uname and node -v

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

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

Local host running Hello World app

成功!

反馈和进一步阅读

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

祝您编码愉快!

VS Code 程序经理 Brigit Murtaugh @BrigitMurtaugh