参加你附近的 ,了解 VS Code 中的 AI 辅助开发。

在 WSL 2 中使用开发容器

2020 年 7 月 1 日,由 Brigit Murtaugh (@BrigitMurtaugh) 发表

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

五月为我们带来了虚拟化领域几个激动人心的消息:Windows 10 2020 年 5 月更新将 WSL 2 作为一项开箱即用的功能加入,而 Docker Desktop 稳定版 2.3.0.2 也正式发布 (GA),并支持 WSL 2 后端。

之前的博客文章中,我们探讨了如何在 WSL 2 中使用 Docker。第一个要求是安装 Windows Insider,因为 WSL 2 支持当时还不是稳定版 Windows 的一部分;下一个要求是安装 Docker WSL 2 的技术预览版。现在,Windows WSL 2 和 Docker 的支持都已进入稳定的正式发布 (GA) 版本!

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

虚拟化的新时代

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

WSL 2

正如在先前文章中所讨论的,WSL 2 在适用于 Linux 的 Windows 子系统上采用了一种新方法,即在一个轻量级虚拟机 (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 integration dialog

可选:安装新的 Windows Terminal 以获得最佳体验,包括在同一界面中打开新的 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我们。

编码愉快!

Brigit Murtaugh, VS Code 项目经理 @BrigitMurtaugh