在 VS Code 中尝试

容器中的 ASP.NET Core

在本指南中,你将学习如何:

  • 创建描述简单 .NET Core 服务容器的 Dockerfile 文件。
  • 构建、运行和验证服务的功能。
  • 调试作为容器运行的服务。

先决条件

创建 .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)) 并使用 Docker: Add Docker Files to Workspace... 命令

    Add Dockerfile to a .NET project

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

  5. 当提示选择操作系统时,选择 WindowsLinux

    Windows 仅适用于 Docker 安装配置为使用 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 Images: Build Image... 命令。

  2. 打开 Docker Explorer 并验证新映像在 Images 树中可见

    Verify Docker image exists

测试服务容器

  1. 右键单击上一步构建的映像,然后选择 RunRun Interactive。容器应该会启动,你可以在 Docker Explorer 的“Containers”窗格中看到它

    Running service container

  2. 打开网页浏览器并导航到 http://localhost: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 命令没有报告错误(查看终端窗口中的命令输出)。你还可以通过右键单击 Docker Explorer 中的容器并选择 Inspect 来验证容器正在使用哪个主机端口。这将打开一个 JSON 文档,详细描述该容器。查找 PortBindings 元素,例如:

    "PortBindings": {
      "5000/tcp": [
        {
          "HostIp": "",
          "HostPort": "5000"
        }
      ]
    },
    
  3. 测试完成后,右键单击 Docker Explorer 中的容器并选择 Stop

在容器中调试

当 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://localhost:%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
    }

后续步骤

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