在 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 中使用您的开发容器。
入门
先决条件
- 安装 Windows 10 版本 2004。
- 要查看您的设备正在运行哪个版本的 Windows,请按 Windows 徽标键 + R,在打开框中输入 winver,然后选择确定。
- 安装 Visual Studio Code。
- 按照 WSL 2 安装指南启用 WSL 2。
- 从微软商店安装 Ubuntu(或您喜欢的 Linux 发行版)。
- 安装Docker Desktop 稳定版 2.3.0.2。
安装后,Docker 会识别到您已安装 WSL,并提示您启用 WSL 集成。从弹出窗口中选择启用 WSL 集成。
可选:安装新的 Windows Terminal 以获得最佳体验,包括在同一界面中打开新的 PowerShell 和 Ubuntu 终端的能力。
在 WSL 2 中打开 VS Code
让我们将 VS Code 连接到我们的 WSL 2 引擎。打开一个 Ubuntu 终端,导航到您选择的源代码文件夹,然后输入 `code .`。这将启动一个 VS Code 实例,让您将 WSL 作为全职开发环境。您也可以从命令面板连接到 WSL。我将打开一个简单的 HelloNode 应用程序。
VS Code 打开后,它会识别到我们已经安装了 WSL,并建议我们安装 WSL 扩展。我将选择安装。
安装扩展后,我们可以重新加载 VS Code 以连接到 WSL 2。
重新加载后,我们可以通过检查窗口左下角的 WSL 指示器来确认我们已连接到 Ubuntu。
安装 WSL 扩展后,远程资源管理器被添加到了 VS Code 中。当我们在资源管理器中查看时,可以看到有关我们 Linux 发行版的信息。
使用容器
我们可以利用开发容器扩展来查看和附加到容器,此外还有其他多种场景,例如:
- 在一组示例容器内进行开发
- 在容器中打开现有源代码
- 在隔离的容器卷中处理 GitHub 仓库。
这些配置使您可以轻松地在不同机器上重现相同的开发环境,将项目特定的工具和扩展安装到开发容器中,并在与部署环境相似的设置中进行开发,而本地机器保持不变。我们还可以使用 Docker 扩展来查看和附加到容器。
虽然在使用 WSL 2 引擎时,您可以从 Windows 和 WSL 2 文件系统访问源代码,但我们建议使用 WSL 2 文件系统,因为性能要好得多。由于在 WSL 2 内部使用文件系统时性能更好,让我们来演示如何使用它。
我们需要选择要在容器中打开的文件夹。首先,请确保您已安装开发容器扩展。然后,我们可以从已经使用 WSL 扩展打开的文件夹中调用开发容器:在容器中重新打开命令。
我的 WSL 2 文件系统上有一个现有的 HelloNode 文件夹,里面有我的 Node 项目。我将选择:开发容器:在容器中重新打开
由于仓库中还没有开发容器的配置,将出现一个容器定义列表。出现的容器配置定义列表是根据我的项目类型过滤的。我将选择 Node.js 14。
一个新的 VS Code 实例会打开。VS Code 开始构建镜像,然后启动我们的容器。
我们的应用程序现在有了一个 .devcontainer 文件夹,其中存储了容器配置信息。为了再次确认我们已连接到 WSL 并且在一个容器内,让我们打开集成终端,检查 `uname` 和 Node 的版本。
如我们所见,`uname` 返回的是 Linux,所以我们仍然连接到 WSL 2 引擎,而 `node -v` 返回了 v14.4.0,所以我们已经成功配置了我们的 Node 14 容器。
让我们尝试用 F5 运行我们的应用。
成功!
反馈和延伸阅读
为了帮助您使用 WSL 和容器设置 VS Code,我们在 VS Code 远程开发文档中有详细的文章。如果您对我们的团队有任何问题或反馈,请随时在 VS Code 远程开发 GitHub 仓库中提出问题,或在 Twitter 上@code我们。
编码愉快!
Brigit Murtaugh, VS Code 项目经理 @BrigitMurtaugh