🚀 在 VS Code 中免費取得

容器中的 ASP.NET Core

在本指南中,您將學習如何

  • 建立一個 Dockerfile 檔案,描述一個簡單的 .NET Core 服務容器。
  • 建置、執行並驗證服務的功能。
  • 偵錯以容器形式執行的服務。

先決條件

建立 .NET Web API 專案

  1. 為專案建立一個資料夾。

  2. 在專案資料夾中開啟開發人員命令提示字元,並初始化專案

    dotnet new webapi --no-https
    

將 Docker 檔案新增至專案

  1. 在 VS Code 中開啟專案資料夾。

  2. 等待 C# 擴充功能提示您新增建置和偵錯所需的資產,然後選擇 [是]。您也可以開啟 [命令面板] (⇧⌘P (Windows、Linux Ctrl+Shift+P)),並使用 [.NET: 產生建置和偵錯的資產] 命令。

  3. 開啟 [命令面板] (⇧⌘P (Windows、Linux Ctrl+Shift+P)),並使用 [Docker: 將 Docker 檔案新增至工作區...] 命令

    Add Dockerfile to a .NET project

  4. 當提示輸入應用程式平台時,請使用 [.NET: ASP.NET Core]。

  5. 當提示選擇作業系統時,請選擇 [Windows] 或 [Linux]。

    僅當您的 Docker 安裝設定為使用 Windows 容器時,Windows 才適用。

  6. 系統會詢問您是否要新增 Docker Compose 檔案。在本教學課程中,我們不會使用 Docker Compose,因此「是」和「否」的答案都可以。

  7. 將應用程式端點的連接埠變更為 5000

  8. Dockerfile.dockerignore 檔案已新增至工作區。

    此擴充功能也會建立一組 VS Code 工作,用於建置和執行容器 (在偵錯和發行組態中,總共四個工作),以及一個偵錯組態,用於在偵錯模式中啟動容器。

建置應用程式

  1. 開啟終端機提示字元 (⌃` (Windows、Linux Ctrl+`))。

  2. 發出 dotnet build 命令以建置應用程式

    PS C:\source\repos\net> dotnet build
    MSBuild version 17.4.0-preview-22470-08+6521b1591 for .NET
      Determining projects to restore...
      All projects are up-to-date for restore.
      net -> C:\source\repos\net\bin\Debug\net7.0\net.dll
    
    Build succeeded.
        0 Warning(s)
        0 Error(s)
    
    Time Elapsed 00:00:08.96
    

將環境變數新增至映像

您可以使用 Docker 擴充功能來撰寫 Docker 檔案。此擴充功能提供完成項和內容相關的說明。若要查看這些功能,請按照下列步驟將環境變數新增至您的服務映像

  1. 開啟 Dockerfile 檔案。

  2. 使用 ENV 指示將環境變數新增至服務容器映像。指示應放置在 Dockerfilebase 階段 (檔案中的第一個階段)。將 ASPNETCORE_URLS 變數設定為 http://*:5000

    Add an environment variable to Docker image

    請注意 Docker 擴充功能如何列出所有可用的 Dockerfile 指示,並描述語法。

    Docker 擴充功能使用 Dockerfilebase 階段來建立服務容器映像的偵錯版本。將 ASPNETCORE_URLS 環境變數定義放在 base 階段,讓此變數在容器映像的偵錯和發行版本中都可用。

  3. 儲存 Dockerfile 檔案。

建置映像

  1. 開啟 [命令面板] (⇧⌘P (Windows、Linux Ctrl+Shift+P)),並發出 [Docker 映像: 建置映像...] 命令。

  2. 開啟 Docker 總管,並確認新的映像在 [映像] 樹狀結構中可見

    Verify Docker image exists

測試服務容器

  1. 在先前步驟中建置的映像上按一下滑鼠右鍵,然後選擇 [執行] 或 [互動式執行]。容器應該會啟動,而且您應該可以在 Docker 總管的 [容器] 窗格中看到它

    Running service container

  2. 開啟 Web 瀏覽器並瀏覽至 https://127.0.0.1:5000/WeatherForecast。您應該會看到 JSON 格式的天氣資料,類似於下列內容

    [
        {"date":"2019-11-07T23:31:57.0527092+00:00","temperatureC":4,"temperatureF":39,"summary":"Bracing"},
        {"date":"2019-11-08T23:31:57.0539243+00:00","temperatureC":-19,"temperatureF":-2,"summary":"Freezing"},
        {"date":"2019-11-09T23:31:57.0539269+00:00","temperatureC":2,"temperatureF":35,"summary":"Freezing"},
        {"date":"2019-11-10T23:31:57.0539275+00:00","temperatureC":-4,"temperatureF":25,"summary":"Freezing"},
        {"date":"2019-11-11T23:31:57.053928+00:00","temperatureC":9,"temperatureF":48,"summary":"Bracing"}
     ]
    

    預設情況下,Docker 會將隨機選擇的主機連接埠指派給容器公開的連接埠 (容器連接埠)。在我們的應用程式中,公開的 (容器) 連接埠為 5000。當您針對映像發出 [執行] 命令時,VS Code 會嘗試對主機連接埠和容器連接埠使用相同的連接埠號碼。這樣可以輕鬆記住要用於與容器通訊的連接埠,但如果主機連接埠已在使用中,則無法運作。

    如果您在瀏覽器中看不到容器中的資料,請確定 docker run 命令沒有報告任何錯誤 (查看終端機視窗中的命令輸出)。您也可以藉由在 Docker 總管中按一下滑鼠右鍵並選擇 [檢查],來驗證容器正在使用哪個主機連接埠。這會開啟一個 JSON 文件,詳細描述容器。搜尋 PortBindings 元素,例如

    "PortBindings": {
      "5000/tcp": [
        {
          "HostIp": "",
          "HostPort": "5000"
        }
      ]
    },
    
  3. 完成測試後,在 Docker 總管中按一下滑鼠右鍵,然後選擇 [停止]。

在容器中偵錯

當 Docker 檔案新增至應用程式時,Docker 擴充功能也會新增 VS Code 偵錯工具組態,以便在服務於容器內執行時進行偵錯。此擴充功能會自動偵測服務正在使用的通訊協定和連接埠,並將瀏覽器指向服務,但我們需要告訴它要使用的 URL 路徑。

  1. Controllers/WeatherForecastController.cs 檔案的 Get() 方法的程式碼開頭設定中斷點。

  2. 開啟 .vscode/launch.json 檔案,並尋找 `Docker .NET Core Launch` 偵錯組態。

  3. dockerServerReadyAction 新增至 Docker .NET Core Launch 組態

    "dockerServerReadyAction": {
        "uriFormat": "%s://127.0.0.1:%s/WeatherForecast"
    }
    
  4. 確定組態已選取為作用中

    Selected Docker debug configuration

  5. 開始偵錯 (F5)。

    • 服務容器的偵錯版本會建置並啟動。
    • 瀏覽器會開啟以要求新的天氣預報。
    • 已命中 `WeatherForecastController` 中的中斷點。

您可以藉由變更 `docker-run: debug` 工作 (在 `.vscode/tasks.json` 檔案中定義) 使用的 Docker 執行選項,來使用主機上的特定連接埠。例如,如果您想要使用相同的連接埠 (5000) 來公開服務,則 `docker-run: debug` 工作定義會如下所示

 {
    "type": "docker-run",
    "label": "docker-run: debug",
    "dependsOn": [
        "docker-build: debug"
    ],
    "dockerRun": {
        "ports": [
            { "hostPort": 5000, "containerPort": 5000 }
        ]
    },
    "netCore": {
        "appProject": "${workspaceFolder}/netcorerest.csproj",
        "enableDebugging": true
    }

後續步驟

您已完成!現在您的容器已就緒,您可能想要