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

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

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

注意

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

Docker 容器概觀

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

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

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

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

必要條件

如需詳細資訊,請參閱 在 Windows 上安裝 Docker Desktop 的 Docker 文件系統需求。

若要瞭解如何在 Windows Server 上安裝 Docker,請參閱 開始使用:為容器準備 Windows。

注意

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 瀏覽器中執行您的容器。

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

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

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

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

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

  • 安裝 VS Code 開發容器擴充功能。 此擴充功能可讓您在容器內開啟專案資料夾或存放庫,利用 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 .
    

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

    VS Code WSL 遠端指標

  4. 從 VS Code 命令選擇區 (Ctrl + Shift + P),輸入:開發容器: 在容器 中重新開啟,因為我們使用 WSL 擴充功能開啟的資料夾。 或者,使用 開發容器:在容器中開啟資料夾... ,以使用本機 \\wsl$ 共用選擇WSL資料夾(從 Windows 端)。 如需詳細資訊,請參閱 Visual Studio Code 快速入門:在容器 中開啟現有的資料夾。 如果這些命令未在您開始輸入時顯示,請檢查以確定您已安裝上述鏈接的開發人員容器延伸模組。

    VS Code 開發容器命令

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

    VS Code Dev Containers 資料夾

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

    VS Code 開發容器設定定義

  7. VS Code 的新執行個體將會開啟、開始建置新的映像,一旦建置完成,就會啟動我們的容器。 您會看到新的 .devcontainer 資料夾已與 Dockerfiledevcontainer.json 檔案內的容器組態資訊一起出現。

    VS Code .devcontainer 資料夾

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

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

    VS Code 執行偵錯組態

  10. 從 VS Code 內部,選取 [執行]>[開始偵錯] (或只按下 F5 鍵)。 這會在 VS Code 內開啟終端機,您應該會看到結果顯示如下:「Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-Chttp://127.0.0.1:8000/」。按住 [控制] 鍵,然後選取顯示的位址,以便在預設網頁瀏覽器中開啟您的應用程式,並查看您的專案在其容器內執行。

    執行 Docker 容器的 VS Code

您現在已成功使用由 WSL 2 後端支援的 Docker Desktop 來設定遠端開發容器,您可以使用 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 存放庫的問題或這個 StackOverflow 文章。

如需 WSL 中一般疑難排解問題的協助,請參閱疑難排解文件。

其他資源