在 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