🚀 在 VS Code 中免费获取

容器中的 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: 将 Docker 文件添加到工作区...”命令

    Add Dockerfile to a .NET project

  4. 当提示选择应用程序平台时,请使用“.NET: ASP.NET Core”。

  5. 当提示选择操作系统时,请选择“Windows”或“Linux”。

    仅当您的 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 扩展来编写 Docker 文件。该扩展提供补全和上下文帮助。要查看这些功能,请按照以下步骤向您的服务镜像添加环境变量

  1. 打开 Dockerfile 文件。

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

    Add an environment variable to Docker image

    请注意 Docker 扩展如何列出所有可用的 Dockerfile 指令并描述语法。

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

  3. 保存 Dockerfile 文件。

构建镜像

  1. 打开命令面板 (⇧⌘P (Windows、Linux Ctrl+Shift+P)) 并发出“Docker 镜像: 构建镜像...”命令。

  2. 打开 Docker 资源管理器并验证新镜像在“镜像”树中是否可见

    Verify Docker image exists

测试服务容器

  1. 右键单击在上一步中构建的镜像,然后选择“运行”或“交互式运行”。容器应启动,您应该能够在 Docker 资源管理器的“容器”窗格中看到它

    Running service container

  2. 打开 Web 浏览器并导航到 https://127.0.0.1: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 命令没有报告任何错误(查看终端窗口中的命令输出)。您还可以通过右键单击 Docker 资源管理器中的容器并选择“检查”来验证容器正在使用哪个主机端口。这将打开一个 JSON 文档,详细描述容器。搜索 PortBindings 元素,例如

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

在容器中调试

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

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

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

  3. dockerServerReadyAction 添加到 Docker .NET Core Launch 配置

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

后续步骤

您已完成!现在您的容器已准备就绪,您可能想要