现已发布!阅读有关一月份的新功能和修复。

在容器中使用 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 文件添加到工作区... 命令

    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
    

向映像添加环境变量

您可以使用容器工具扩展来编写 Docker 文件。该扩展提供自动完成功能和上下文帮助。要查看这些功能,请按照以下步骤向服务映像添加环境变量

  1. 打开 Dockerfile 文件。

  2. 使用 ENV 指令向服务容器映像添加环境变量。该指令应放置在 Dockerfilebase 阶段(文件中的第一个阶段)。将 ASPNETCORE_URLS 变量设置为 http://*:5000

    Add an environment variable to Docker image

    注意容器工具扩展如何列出所有可用的 Dockerfile 指令和描述其语法。

    容器工具扩展使用 Dockerfilebase 阶段为您的服务创建容器映像的调试版本。将 ASPNETCORE_URLS 环境变量定义放在 base 阶段,以便在容器映像的调试和发布版本中都可以使用此变量。

  3. 保存 Dockerfile 文件。

构建映像

  1. 打开命令面板 (⇧⌘P (Windows, Linux Ctrl+Shift+P)) 并发出 容器映像: 构建映像... 命令。

  2. 打开容器资源管理器,验证新映像是否显示在“映像”树中

    Verify Docker image exists

测试服务容器

  1. 右键单击上一步中构建的映像并选择 运行交互式运行。容器应启动,您应该可以在容器资源管理器的“容器”视图中看到它

    Running service container

  2. 在 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。当您对映像发出 运行 命令时,VS Code 会尝试对主机端口和容器端口使用相同的端口号。这使得更容易记住要使用哪个端口与容器通信,但如果主机端口已被占用,则无法正常工作。

    如果您无法在浏览器中看到容器中的数据,请确保 docker run 命令没有报告任何错误(查看终端窗口中的命令输出)。您还可以通过右键单击容器资源管理器中的容器并选择 检查 来验证容器正在使用的哪个主机端口。这将打开一个 JSON 文档,其中详细描述了容器。搜索 PortBindings 元素,例如

    "PortBindings": {
      "5000/tcp": [
        {
          "HostIp": "",
          "HostPort": "5000"
        }
      ]
    },
    
  3. 测试完成后,右键单击容器资源管理器中的容器并选择 停止

在容器中调试

当 Docker 文件添加到应用程序后,容器工具扩展还添加了一个 VS Code 调试配置,用于在服务在容器内运行时对其进行调试。该扩展将自动检测服务正在使用的协议和端口,并将浏览器指向服务,但我们需要告诉它使用哪个 URL 路径。

  1. Controllers/WeatherForecastController.cs 文件的 Get() 方法代码的开头设置一个断点。

  2. 打开 .vscode/launch.json 文件并找到 Containers: .NET Core Launch 调试配置。

  3. Containers: .NET Core Launch 配置添加 dockerServerReadyAction

    "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.