容器化 .NET Core 应用

适用于:Windows Server 2025、Windows Server 2022、Windows Server 2019、Windows Server 2016

本主题介绍了如何在设置环境后将现有示例 .NET 应用打包为 Windows 容器进行部署,如入门:为容器准备 Windows 中所述,以及运行第一个容器,如运行第一个 Windows 容器中所述。

还需要计算机上安装 Git 源代码管理系统。 若要安装它,请访问 Git

从 GitHub 克隆示例代码

所有容器示例源代码都保存在名为 windows-container-samples的文件夹中的 Virtualization-Documentation git 存储库下。

  1. 打开 PowerShell 会话并将目录更改为要在其中存储此存储库的文件夹。 (其他命令提示符窗口类型也正常工作,但我们的示例命令使用 PowerShell。

  2. 将存储库克隆到当前工作目录:

    git clone https://github.com/MicrosoftDocs/Virtualization-Documentation.git
    
  3. 使用以下命令导航到 Virtualization-Documentation\windows-container-samples\asp-net-getting-started 下找到的示例目录并创建 Dockerfile。

    Dockerfile 就像生成文件一样,它是一系列说明,告知容器引擎如何生成容器映像。

    # Navigate into the sample directory
    Set-Location -Path Virtualization-Documentation\windows-container-samples\asp-net-getting-started
    
    # Create the Dockerfile for our project
    New-Item -Name Dockerfile -ItemType file
    

编写 Dockerfile

打开刚刚使用你喜欢的文本编辑器创建的 Dockerfile,然后添加以下内容:

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build-env
WORKDIR /app

COPY *.csproj ./
RUN dotnet restore

COPY . ./
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "asp-net-getting-started.dll"]

让我们逐行分解它,并解释每个指令的作用。

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build-env
WORKDIR /app

第一组行声明我们将在哪个基础映像上生成容器。 如果本地系统还没有此映像,则 docker 将自动尝试提取它。 mcr.microsoft.com/dotnet/core/sdk:2.1 随附已安装的 .NET Core 2.1 SDK,因此能够胜任生成面向版本 2.1 的 ASP .NET Core 项目。 下一个指令将容器中的工作目录更改为 /app,因此在此上下文下执行此命令后的所有命令。

COPY *.csproj ./
RUN dotnet restore

接下来,这些说明将 .csproj 文件复制到 build-env 容器的 /app 目录中。 复制此文件后,.NET 将读取该文件,然后退出并提取项目所需的所有依赖项和工具。

COPY . ./
RUN dotnet publish -c Release -o out

.NET 将所有依赖项拉取到 build-env 容器后,下一个指令会将所有项目源文件复制到容器中。 然后,我们告知 .NET 使用发布配置发布应用程序并指定输出路径。

编译应该会成功。 现在我们必须生成最终映像。

提示

本快速入门根据源来生成 .NET Core 项目。 生成容器映像时,最好是只在容器映像中包含生产有效负载及其依赖项。 我们不希望在最终镜像中包含 .NET core SDK,因为我们只需要 .NET core 运行时,所以 dockerfile 被编写为使用名为 build-env 的 SDK 打包的临时容器来构建应用。

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "asp-net-getting-started.dll"]

由于我们的应用程序使用了 ASP.NET,因此我们指定了包含此运行时环境的映像。 然后,将临时容器的输出目录中的所有文件复制到最终容器中。 我们将容器配置为在容器启动时使用新应用作为其入口点运行

我们编写了 Dockerfile 来执行多阶段生成。 执行 dockerfile 后,它将使用临时容器(build-env)和 .NET core 2.1 SDK 生成示例应用,然后将输出的二进制文件复制到仅包含 .NET core 2.1 运行时的另一个容器中,以便最大程度地减小最终容器的大小。

生成并运行应用

编写 Dockerfile 后,我们可以将 Docker 指向 Dockerfile,并告诉它构建并运行我们的镜像。

  1. 在命令提示符窗口中,导航到 dockerfile 所在的目录,然后运行 docker build 命令从 Dockerfile 生成容器。

    docker build -t my-asp-app .
    
  2. 若要运行新生成的容器,请运行 docker run 命令。

    docker run -d -p 5000:80 --name myapp my-asp-app
    

    让我们来剖析此命令:

    • -d 告知 Docker 以‘分离模式’运行容器,这意味着没有将控制台连接到容器内部。 容器在后台运行。
    • -p 5000:80 告知 Docker 将主机上的端口 5000 映射到容器中的端口 80。 每个容器获取其自己的 IP 地址。 默认情况下,ASP .NET 在端口 80 上侦听。 通过端口映射,我们可以转到映射端口上的主机 IP 地址,Docker 会将所有流量转发到容器内的目标端口。
    • --name myapp 告知 Docker 为此容器提供方便的查询名称(无需查找 Docker 在运行时分配的容器 ID)。
    • my-asp-app 是我们希望 Docker 运行的映像。 这是作为 docker build 进程的最终生成的容器映像。
  3. 打开 Web 浏览器并导航到 http://localhost:5000 以查看容器化应用程序。

    ASP.NET 核心网页,从容器中的 localhost 运行

后续步骤

  1. 下一步是使用 Azure 容器注册表将容器化 ASP.NET Web 应用发布到专用注册表。 这样,就可以在组织中部署它。

    到达 将容器映像推送到注册表的部分时,请指定刚刚打包的 ASP.NET 应用的名称(my-asp-app),以及容器注册表(例如:contoso-container-registry):

    docker tag my-asp-app contoso-container-registry.azurecr.io/my-asp-app:v1
    

    若要查看更多应用示例及其关联的 Dockerfile,请参阅 其他容器示例

  2. 将应用发布到容器注册表后,下一步是将应用部署到使用 Azure Kubernetes 服务创建的 Kubernetes 群集。