在 WSL 2 上開始使用 Docker 遠端容器

本逐步指南將協助您開始使用遠端容器進行開發,方法是使用 WSL 2 (Windows 子系統 Linux 版 版本 2) 設定適用于 Windows 的 Docker Desktop

適用于 Windows 的 Docker Desktop 提供開發環境,用於建置、傳送和執行 Dockerized 應用程式。 藉由啟用以 WSL 2 為基礎的引擎,您可以在同一部電腦上于 Docker Desktop 中執行 Linux 和 Windows 容器。 (Docker Desktop 免費供個人使用和小型企業,如需 Pro、Team 或 Business 定價的相關資訊,請參閱 Docker 網站常見問題) 。

注意

建議您使用 Docker Desktop,因為它與 Windows 和Windows 子系統 Linux 版整合。 不過,雖然 Docker Desktop 支援同時執行 Linux 和 Windows 容器, 但您無法同時 執行這兩者。 若要同時執行 Linux 和 Windows 容器,您必須在 WSL 中安裝並執行個別的 Docker 實例。 如果您需要同時執行容器,或只是想要直接在 Linux 發行版本中安裝容器引擎,請遵循該容器服務的 Linux 安裝指示,例如在 Ubuntu 上安裝 Docker 引擎安裝 Podman 來執行 Linux 容器

Docker 容器概觀

Docker 是一種工具,可用來建立、部署及執行使用容器的應用程式。 容器可讓開發人員封裝含有其所需全部元件 (程式庫、架構、相依性等) 的應用程式,且全部以一個套件的形式出貨。 使用容器可確保應用程式會以相同的方式執行,而不管任何自訂的設定或先前在執行該應用程式的電腦 (可能與用來撰寫和測試應用程式程式碼的電腦不同) 上安裝的程式庫。 這可讓開發人員專注於撰寫程式碼,而不需擔心程式碼將在其上執行的系統。

Docker 容器類似於虛擬機器,但不會建立整個虛擬作業系統。 然而,Docker 可讓應用程式使用與系統執行所在的相同 Linux 核心。 這可讓應用程式套件只需要主機電腦上尚未存在的元件,以減少套件大小並提升效能。

使用 Docker 容器搭配 Kubernetes 之類工具的持續可用性,是容器廣受歡迎的另一個原因。 這可讓您在不同時間建立多個版本的應用程式容器。 每個容器 (及其特定微服務) 都可以隨時被取代,而不需要關閉整個系統以便進行更新或維護。 您可以準備包含所有更新的新容器、設定用於生產的容器,並在準備就緒後直接指向新容器。 您也可使用容器來封存不同版本的應用程式,並視需要使其以安全後援的形式執行。

若要深入瞭解,請參閱 Docker 容器簡介

必要條件

注意

WSL 可以在 WSL 第 1 版或 WSL 2 模式中執行散發套件。 您可以開啟 PowerShell 並輸入:來檢查這一點。 wsl -l -v 輸入 下列命令,確定您的散發套件已設定為使用 WSL 2: wsl --set-version <distro> 2 。 以 <distro> 散發版本名稱取代 (,例如 Ubuntu 18.04) 。

在 WSL 第 1 版中,由於 Windows 和 Linux 之間的基本差異,Docker 引擎無法直接在 WSL 內執行,因此 Docker 小組使用 Hyper-V VM 和 LinuxKit 開發替代解決方案。 不過,由於 WSL 2 現在會在具有完整系統呼叫容量的 Linux 核心上執行,Docker 可以在 WSL 2 中完全執行。 這表示 Linux 容器可以在不模擬的情況下以原生方式執行,進而提升 Windows 和 Linux 工具之間的效能和互通性。

安裝 Docker Desktop

使用適用于 Windows 的 Docker Desktop 支援的 WSL 2 後端,您可以在以 Linux 為基礎的開發環境中工作,並建置以 Linux 為基礎的容器,同時使用Visual Studio Code進行程式碼編輯和偵錯,以及在 Windows 上的 Microsoft Edge 瀏覽器中執行您的容器。

若要在 安裝 WSL) 之後安裝 Docker (:

  1. 下載 Docker Desktop 並遵循安裝指示。

  2. 安裝之後,從 [Windows 開始] 功能表啟動 Docker Desktop,然後從工作列的隱藏圖示功能表中選取 Docker 圖示。 以滑鼠右鍵按一下圖示以顯示 Docker 命令功能表,然後選取 [設定]。 Docker Desktop 儀表板圖示

  3. 確定已核取 [設定>一般] 中的 [使用 WSL 2 型引擎]。 Docker Desktop 一般設定

  4. 移至 [設定>資源>WSL 整合],從您想要啟用 Docker 整合的已安裝 WSL 2 散發套件中選取。 Docker Desktop 資源設定

  5. 若要確認已安裝 Docker,請開啟 WSL 散發套件 (例如 Ubuntu) ,並輸入下列命令來顯示版本和組建編號: docker --version

  6. 使用下列方式執行簡單的內建 Docker 映射,以測試您的安裝是否正常運作: docker run hello-world

提示

以下是一些實用的 Docker 命令,可知道:

  • 輸入以下命令可列出 Docker CLI 中可用的命令:docker
  • 使用以下命令,列出特定命令的資訊:docker <COMMAND> --help
  • 使用以下命令,列出電腦上的 Docker 映像 (此時就是 hello-world 映像):docker image ls --all
  • 列出您電腦上的容器,其中包含: docker container ls --alldocker ps -a (不含 -a 顯示所有旗標,只會顯示執行中的容器)
  • 列出有關 Docker 安裝的全系統資訊,包括 CPU 記憶體 () & WSL 2 內容中可供您使用的統計資料和資源,包括: docker info

使用 VS Code 在遠端容器中開發

若要開始使用 Docker 搭配 WSL 2 開發應用程式,建議您使用 VS Code 以及 WSL、Dev Containers 和 Docker 擴充功能。

  • 安裝 VS Code WSL 擴充功能。 此延伸模組可讓您開啟在 VS Code 中 WSL 上執行的 Linux 專案, (不需要擔心路徑問題、二進位相容性或其他跨作業系統挑戰) 。

  • 安裝 VS Code Dev Containers 擴充功能。 此延伸模組可讓您在容器內開啟專案資料夾或存放庫,利用Visual Studio Code的完整功能集,在容器內執行開發工作。

  • 安裝 VS Code Docker 擴充功能。 此延伸模組會新增功能,以從 VS Code 內部建置、管理及部署容器化應用程式。 (您需要開發容器擴充功能,才能實際使用容器作為開發環境。)

讓我們使用 Docker 建立現有應用程式專案的開發容器。

  1. 在此範例中,我將使用 Python 開發環境中Django Hello World教學課程中的原始程式碼來設定檔。如果您想要使用自己的專案原始程式碼,可以略過此步驟。 若要從 GitHub 下載我的 HelloWorld-Django Web 應用程式,請開啟 WSL 終端機 (Ubuntu,例如) 並輸入: git clone https://github.com/mattwojo/helloworld-django.git

    注意

    請一律將您的程式碼儲存在您所使用的相同檔案系統中。 這會導致檔案存取效能更快。 在此範例中,我們使用 Linux 散發版本 (Ubuntu) ,並想要將專案檔儲存在 WSL 檔案系統 \\wsl\ 上。 使用 WSL 中的 Linux 工具存取這些檔案時,將專案檔儲存在 Windows 檔案系統上會大幅變慢。

  2. 從 WSL 終端機,將目錄變更為此專案的原始程式碼資料夾:

    cd helloworld-django
    
  3. 輸入下列命令,在本機 WSL 擴充伺服器上執行的 VS Code 中開啟專案:

    code .
    

    藉由檢查 VS Code 實例左下角的綠色遠端指示器,確認您已連線到 WSL Linux 散發版本。

    VS Code WSL 遠端指示器

  4. 從 VS Code 命令平板 (Ctrl + Shift + P) ,輸入: 開發容器:在容器中開啟資料夾... 如果您開始輸入此命令時未顯示此命令,請檢查以確定您已安裝上述連結的 Dev Containers 擴充功能。

    VS Code Dev Containers 命令

  5. 選取您想要容器化的專案資料夾。 在我的案例中,這是 \\wsl\Ubuntu-20.04\home\mattwojo\repos\helloworld-django\

    VS Code Dev Containers 資料夾

  6. 容器定義清單隨即出現,因為專案資料夾中尚未 (存放庫) 開發容器組態。 顯示的容器組態定義清單會根據您的專案類型進行篩選。 針對我的 Django 專案,我將會選取 [Python 3]。

    VS Code Dev Containers 設定定義

  7. VS Code 的新實例將會開啟、開始建置新的映射,一旦建置完成,就會啟動我們的容器。 您會看到新的 .devcontainer 資料夾已出現在 和 devcontainer.json 檔案內的 Dockerfile 容器組態資訊。

    VS Code .devcontainer 資料夾

  8. 若要確認您的專案仍連線到 WSL 和容器內,請開啟 VS Code 整合式終端機, (Ctrl + Shift + ~) 。 輸入下列專案來檢查作業系統: uname 和 Python 版本: python3 --version 。 您可以看到 uname 傳回為 「Linux」,因此您仍然連線到 WSL 2 引擎,而 Python 版本號碼將會以與您 WSL 發行版本上安裝的 Python 版本不同的容器組態為基礎。

  9. 若要使用 Visual Studio Code 在容器內執行和偵錯您的應用程式,請先開啟 [執行] 功能表 (Ctrl+Shift+D,或選取最左邊功能表列上的索引標籤) 。 然後選取 [ 執行] 和 [偵 錯] 以選取偵錯組態,然後選擇最符合您專案 (的組態,這會是 「Django」) 。 這會在專案的 資料夾中建立檔案 launch.json.vscode ,並說明如何執行您的應用程式。

    VS Code 執行偵錯組態

  10. 從 VS Code 內部,選取 [執行>開始偵錯] (或按F5鍵) 。 這會在 VS Code 內開啟終端機,您應該會看到結果,其內容如下:「使用 CONTROL-C 在結束伺服器時 http://127.0.0.1:8000/ 啟動開發伺服器」。按住 Control 鍵,然後選取顯示于預設網頁瀏覽器中開啟應用程式的位址,並查看您的專案在其容器內執行。

    執行 Docker 容器的 VS Code

您現在已使用 Docker Desktop 成功設定遠端開發容器,由 WSL 2 後端提供,您可以在中撰寫程式碼、建置、執行、部署或使用 VS Code 進行偵錯!

疑難排解

WSL Docker 內容已被取代

如果您使用適用于 WSL 的 Docker 早期 Tech Preview,您可能有一個名為 「wsl」 的 Docker 內容,現在已被取代且不再使用。 您可以使用 命令進行檢查: docker context ls 。 您可以移除此 「wsl」 內容,以避免命令發生錯誤: docker context rm wsl 因為您想要同時使用 Windows 和 WSL2 的預設內容。

您在此已被取代的 wsl 內容時可能會遇到的可能錯誤包括: docker wsl open //./pipe/docker_wsl: The system cannot find the file specified.error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_wsl/v1.40/images/json?all=1: open //./pipe/docker_wsl: The system cannot find the file specified.

如需此問題的詳細資訊,請參閱如何在 Windows 10 上的 Windows System for Linux (WSL2) 中設定 Docker

尋找 Docker 映射儲存體資料夾時發生問題

Docker 會建立兩個散發資料夾來儲存資料:

  • \wsl$\docker-desktop
  • \wsl$\docker-desktop-data

您可以開啟 WSL Linux 發行版本並輸入: explorer.exe . 在 Windows 檔案總管中檢視資料夾,以找到這些資料夾。 輸入: \\wsl\<distro name>\mnt\wsl 以散發套件的名稱取代 <distro name> (。Ubuntu-20.04) 以查看這些資料夾。

如需在 WSL 中尋找 Docker 儲存體位置的詳細資訊,請參閱 WSL 存放庫 或此 StackOverlow 文章中的此問題。

如需 WSL 中一般疑難排解問題的詳細資訊,請參閱 疑難排解 檔。

其他資源