參加你附近的 ,瞭解 VS Code 中的 AI 輔助開發。

容器中的 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: Generate Assets for Build and Debug 命令。

  3. 開啟命令面板 (⇧⌘P (Windows, Linux Ctrl+Shift+P)) 並使用 Containers: Add Docker Files to Workspace... 命令

    Add Dockerfile to a .NET project

  4. 當提示選擇應用程式平臺時,使用 .NET: ASP.NET Core

  5. 當提示選擇作業系統時,選擇 WindowsLinux

    僅當您的 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
    

向映象新增環境變數

您可以使用 Container Tools 擴充套件來編寫 Docker 檔案。該擴充套件提供自動補全和上下文幫助。要檢視這些功能,請按照以下步驟為您的服務映象新增一個環境變數

  1. 開啟 Dockerfile 檔案。

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

    Add an environment variable to Docker image

    請注意 Container Tools 擴充套件如何列出所有可用的 Dockerfile 指令並描述其語法。

    Container Tools 擴充套件使用 Dockerfilebase 階段為您的服務建立容器映象的除錯版本。將 ASPNETCORE_URLS 環境變數定義放在 base 階段,可以使該變數在容器映象的除錯版和釋出版中都可用。

  3. 儲存 Dockerfile 檔案。

構建映象

  1. 開啟命令面板 (⇧⌘P (Windows, Linux Ctrl+Shift+P)) 並執行 Container Images: Build Image... 命令。

  2. 開啟容器資源管理器並驗證新映象是否在映象樹中可見

    Verify Docker image exists

測試服務容器

  1. 右鍵單擊上一步中構建的映象,然後選擇執行 (Run)互動式執行 (Run Interactive)。容器應該會啟動,並且您應該能夠在容器資源管理器的“容器”檢視中看到它

    Running service container

  2. 開啟網頁瀏覽器並導航到 https://: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。當您對一個映象執行執行 (Run) 命令時,VS Code 會嘗試為主機埠和容器埠使用相同的埠號。這使得記住與容器通訊的埠變得容易,但如果該主機埠已被佔用,則無法工作。

    如果您在瀏覽器中無法看到來自容器的資料,請確保 docker run 命令沒有報告任何錯誤(檢視終端視窗中的命令輸出)。您還可以透過在容器資源管理器中右鍵單擊容器並選擇檢查 (Inspect) 來驗證容器正在使用哪個主機埠。這將開啟一個詳細描述容器的 JSON 文件。搜尋 PortBindings 元素,例如

    "PortBindings": {
      "5000/tcp": [
        {
          "HostIp": "",
          "HostPort": "5000"
        }
      ]
    },
    
  3. 測試完成後,在容器資源管理器中右鍵單擊該容器,然後選擇停止 (Stop)

在容器中除錯

當 Docker 檔案被新增到應用程式中時,Container Tools 擴充套件還添加了一個 VS Code 偵錯程式配置,用於在服務在容器內執行時進行除錯。該擴充套件將自動檢測服務正在使用的協議和埠,並將瀏覽器指向該服務,但我們需要告訴它使用哪個 URL 路徑。

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

  2. 開啟 .vscode/launch.json 檔案,找到 Containers: .NET Core Launch 除錯配置。

  3. dockerServerReadyAction 新增到 Containers: .NET Core Launch 配置中

    "dockerServerReadyAction": {
        "uriFormat": "%s://:%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
    }

後續步驟

你已完成!現在你的容器已準備就緒,你可能想