參加你附近的 ,瞭解 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