容器中的 ASP.NET Core
在本指南中,您将学习如何
- 创建一个描述简单的 .NET Core 服务容器的
Dockerfile文件。 - 构建、运行并验证服务的功能。
- 调试作为容器运行的服务。
先决条件
- 必须按照概述中的说明安装 Docker 和 VS Code 容器工具 (Container Tools) 扩展。
- 对于 .NET 开发,请安装 .NET SDK。
- 微软的 C# for Visual Studio Code 扩展。
创建 .NET Web API 项目
-
为项目创建一个文件夹。
-
在项目文件夹中打开开发人员命令提示符并初始化项目
dotnet new webapi --no-https
向项目添加 Docker 文件
-
在 VS Code 中打开项目文件夹。
-
等待 C# 扩展提示您添加构建和调试所需的资产,然后选择是 (Yes)。您也可以打开命令面板(⇧⌘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
向镜像添加环境变量
您可以使用容器工具扩展来编写 Docker 文件。该扩展提供自动补全和上下文帮助。要查看这些功能,请按照以下步骤向服务镜像添加环境变量:
-
打开
Dockerfile文件。 -
使用
ENV指令向服务容器镜像添加环境变量。该指令应放置在Dockerfile的base阶段(文件中的第一个阶段)。将ASPNETCORE_URLS变量设置为http://*:5000
请注意容器工具扩展如何列出所有可用的 Dockerfile 指令并描述其语法。
容器工具扩展使用
Dockerfile的base阶段为您的服务创建调试版本的容器镜像。将ASPNETCORE_URLS环境变量定义放在base阶段,以便此变量在容器镜像的调试版和发布版中都可用。 -
保存
Dockerfile文件。
构建镜像
-
打开命令面板(⇧⌘P (Windows, Linux Ctrl+Shift+P))并执行 Container Images: Build Image... 命令。
-
打开容器资源管理器 (Container Explorer) 并验证新镜像是否出现在“Images”树中

测试服务容器
-
右键单击上一步中构建的镜像,选择 Run 或 Run Interactive。容器应启动,您应该能在容器资源管理器的“Containers”视图中看到它

-
打开 Web 浏览器并导航至 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 文件被添加到应用程序时,容器工具扩展还添加了一个 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
}
后续步骤
你已完成!现在你的容器已准备就绪,你可能想