容器中的 ASP.NET Core

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

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

先決條件

  • 必須依照概觀中的說明安裝 Docker 以及 VS Code Container Tools 擴充功能。
  • 進行 .NET 開發時,請安裝 .NET SDK
  • 安裝 Microsoft C# for Visual Studio Code 擴充功能。

建立 .NET Web API 專案

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

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

    dotnet new webapi --no-https
    

將 Docker 檔案加入專案

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

  2. 等待 C# 擴充功能提示您新增建置與偵錯所需的資產,並選擇是 (Yes)。您也可以開啟命令選擇區 (⇧⌘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 工作 (Tasks) 用於建置與執行容器(包含偵錯與發行設定,總共四個工作),以及一個用於在偵錯模式下啟動容器的偵錯設定

建置應用程式

  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. 開啟容器總管 (Container Explorer) 並確認新映像檔已顯示在 Images 樹狀目錄中

    Verify Docker image exists

測試服務容器

  1. 右鍵點選在上一步中建置的映像檔,並選擇 RunRun Interactive。容器應會啟動,且您應該能在容器總管的「Containers」檢視中看到它

    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
    }

後續步驟

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

© . This site is unofficial and not affiliated with Microsoft.