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

本逐步指南可協助您透過WSL 2 (Windows 子系統 Linux 版 版本 2) 設定 Docker Desktop for Windows,以開始使用遠端容器進行開發。

適用于 Windows 的 Docker Desktop 提供用於建置、運送和執行 Dockerized 應用程式的開發環境。 藉由啟用 WSL 2 型引擎,您可以在同一部電腦上執行 Docker Desktop 中的 Linux 和Windows容器。 (Docker Desktop 免費供個人使用和小型企業使用,如需Pro、小組或商務定價的相關資訊,請參閱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 之類工具的持續可用性,是容器廣受歡迎的另一個原因。 這可讓您在不同時間建立多個版本的應用程式容器。 每個容器 (及其特定微服務) 都可以隨時被取代,而不需要關閉整個系統以便進行更新或維護。 您可以準備包含所有更新的新容器、設定用於生產的容器,並在準備就緒後直接指向新容器。 您也可使用容器來封存不同版本的應用程式,並視需要使其以安全後援的形式執行。

若要深入瞭解,請參閱 Microsoft Learn 上的 Docker 容器簡介

Prerequisites

注意

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

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

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

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

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

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

  4. 移至下列專案,從您要啟用 Docker 整合的已安裝 WSL 2 散發套件中選取:設定>ResourcesWSL>整合Docker Desktop resource settings

  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 安裝的全系統資訊,包括 WSL 2 內容中可供您使用的 CPU & 記憶體 (統計資料和資源) : docker info

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

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

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

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

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

讓我們使用 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. 輸入下列命令,在本機 Remote-WSL 擴充功能伺服器上執行VS Code開啟專案:

    code .
    

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

    VS Code WSL Remote indicator

  4. 從VS Code命令板 (Ctrl + Shift + P) ,輸入:遠端容器:在容器中開啟資料夾...如果此命令未在您開始輸入時顯示,請檢查以確定您已安裝上方連結的遠端容器延伸模組。

    VS Code Remote Container command

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

    VS Code Remote Container folder

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

    VS Code Remote Container config definitions

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

    VS Code .devcontainer folder

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

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

    VS Code run debug configuration

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

    VS Code running a docker container

您現在已成功使用 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 中一般疑難排解問題的詳細資訊,請參閱 疑難排解 檔。

其他資源