容器中的 ASP.NET Core
在本指南中,您將學習如何
- 建立一個
Dockerfile
檔案,描述一個簡單的 .NET Core 服務容器。 - 構建、執行並驗證服務的功能。
- 除錯在容器中執行的服務。
先決條件
- 必須按照概述中的說明安裝 Docker 和 VS Code Container Tools 擴充套件。
- 對於 .NET 開發,請安裝 .NET SDK。
- Microsoft C# for Visual Studio Code 擴充套件。
建立一個 .NET Web API 專案
-
為專案建立一個資料夾。
-
在專案資料夾中開啟開發人員命令提示符並初始化專案
dotnet new webapi --no-https
向專案新增 Docker 檔案
-
在 VS Code 中開啟專案資料夾。
-
等待 C# 擴充套件提示您新增用於構建和除錯所需的資產,然後選擇是。您也可以開啟命令面板 (⇧⌘P (Windows, Linux Ctrl+Shift+P)) 並使用 .NET: Generate Assets for Build and Debug 命令。
-
開啟命令面板 (⇧⌘P (Windows, Linux Ctrl+Shift+P)) 並使用 Containers: Add Docker Files to Workspace... 命令
-
當提示選擇應用程式平臺時,使用 .NET: ASP.NET Core。
-
當提示選擇作業系統時,選擇 Windows 或 Linux。
僅當您的 Docker 安裝配置為使用 Windows 容器時,才適用 Windows。
-
系統會詢問您是否要新增 Docker Compose 檔案。在本教程中我們不會使用 Docker Compose,因此回答“是”和“否”都可以。
-
將應用程式端點的埠更改為
5000
。 -
Dockerfile
和.dockerignore
檔案被新增到工作區中。該擴充套件還會建立一組用於構建和執行容器的 VS Code 任務(包括除錯和釋出配置,共四個任務),以及一個用於在除錯模式下啟動容器的除錯配置。
構建應用程式
-
開啟終端提示符 (⌃` (Windows, Linux Ctrl+`))。
-
執行
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 檔案。該擴充套件提供自動補全和上下文幫助。要檢視這些功能,請按照以下步驟為您的服務映象新增一個環境變數
-
開啟
Dockerfile
檔案。 -
使用
ENV
指令向服務容器映象新增一個環境變數。該指令應放置在Dockerfile
的base
階段(檔案中的第一個階段)。將ASPNETCORE_URLS
變數設定為http://*:5000
請注意 Container Tools 擴充套件如何列出所有可用的 Dockerfile 指令並描述其語法。
Container Tools 擴充套件使用
Dockerfile
的base
階段為您的服務建立容器映象的除錯版本。將ASPNETCORE_URLS
環境變數定義放在base
階段,可以使該變數在容器映象的除錯版和釋出版中都可用。 -
儲存
Dockerfile
檔案。
構建映象
-
開啟命令面板 (⇧⌘P (Windows, Linux Ctrl+Shift+P)) 並執行 Container Images: Build Image... 命令。
-
開啟容器資源管理器並驗證新映象是否在映象樹中可見
測試服務容器
-
右鍵單擊上一步中構建的映象,然後選擇執行 (Run) 或互動式執行 (Run Interactive)。容器應該會啟動,並且您應該能夠在容器資源管理器的“容器”檢視中看到它
-
開啟網頁瀏覽器並導航到 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" } ] },
-
測試完成後,在容器資源管理器中右鍵單擊該容器,然後選擇停止 (Stop)。
在容器中除錯
當 Docker 檔案被新增到應用程式中時,Container Tools 擴充套件還添加了一個 VS Code 偵錯程式配置,用於在服務在容器內執行時進行除錯。該擴充套件將自動檢測服務正在使用的協議和埠,並將瀏覽器指向該服務,但我們需要告訴它使用哪個 URL 路徑。
-
在
Controllers/WeatherForecastController.cs
檔案的Get()
方法程式碼的開頭設定一個斷點。 -
開啟
.vscode/launch.json
檔案,找到Containers: .NET Core Launch
除錯配置。 -
將
dockerServerReadyAction
新增到Containers: .NET Core Launch
配置中"dockerServerReadyAction": { "uriFormat": "%s://:%s/WeatherForecast" }
-
確保該配置被選為活動配置
-
開始除錯 (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
}
後續步驟
你已完成!現在你的容器已準備就緒,你可能想