使用 Docker 容器化您的 .NET Core 应用程序
介绍
您现在可能听到的一个流行词是容器,以及它们与我们过去看到的传统虚拟机概念相比具有哪些优势。毫无疑问,容器是创建微服务并使它们存在于自己的空间中的好方法,这使它们易于移动和升级。此外,由于像 Microsoft Azure 这样的云提供商提供用于存储和托管容器的开箱即用解决方案,因此使用容器部署到云变得更加高效。在本文中,我们将着眼于将 .NET Core Web API 应用程序放置在容器中,将容器托管在协调器中,使容器可供使用,并最终运行和使用此容器化应用程序。
我们将使用的工具
我们将使用的容器技术是 Docker。这已经在 Visual Studio 2019 中集成了支持,因此,在创建应用程序时甚至在创建应用程序之后,都可以非常轻松地将 Docker 支持添加到我们的应用程序中。我们将使用的容器编排器是 Docker Desktop。这是开发和测试的理想选择。
但是,对于企业解决方案托管,使用更高级的选项,如 Kubernetes。但是,一旦您了解了如何使用编排器,这些知识就可以应用于所有类型。
下载并安装 Docker Desktop
第一步是下载最新的Docker Desktop版本并安装。由于我将使用 Windows 10,因此我已经下载了适用于 Windows 的版本并进行了安装。
您可以使用以下命令验证版本:
创建 Web API 应用程序并将其容器化
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
#Depending on the operating system of the host machines(s) that will build or run the containers, the image specified in the FROM statement may need to be changed.
#For more information, please see https://aka.ms/containercompat
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-nanoserver-1903 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-nanoserver-1903 AS build
WORKDIR /src
COPY ["WebAppDocker/WebAppDocker.csproj", "WebAppDocker/"]
RUN dotnet restore "WebAppDocker/WebAppDocker.csproj"
COPY . .
WORKDIR "/src/WebAppDocker"
RUN dotnet build "WebAppDocker.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "WebAppDocker.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebAppDocker.dll"]
下一步是添加容器编排器支持。这将创建一个名为“docker-compose”的新项目。该项目将有一个名为“docker-compose.yml”的文件。
该文件必须如下所示:
version: '3.4'
services:
webappdocker:
image: webappdocker
build:
context: .
dockerfile: WebAppDocker\Dockerfile
ports:
- "8080:80"
此文件将用于在 Docker 桌面编排器中启动容器化应用程序。在这个文件中,我们看到容器的名称是“webappdocker”。它使用了在上一步中创建的 docker 文件。这里最后要注意的是,我们将从主机上的 8080 端口路由到容器上的 80 端口。如果我们查看应用程序的 docker 文件,我们会看到我们在容器的端口 80 上公开了 Web API。
我们现在运行 docker-compose 项目,我们将看到容器现在正在 Docker Desktop 中运行。要验证从系统托盘打开“Docker Desktop”仪表板,您将看到以下屏幕截图:
现在要测试在容器内运行的这个 Web API,让我们创建另一个名为“DockerClientApp”的 .NET Core 控制台应用程序。此应用程序的代码如下所示:
using System;
using System.Net.Http;
using System.Threading.Tasks;
namespace DockerClientApp
{
public class Program
{
public static async Task Main(string[] args)
{
using (var client = new HttpClient())
{
var portno = "8080";
client.BaseAddress = new Uri("http://localhost:" + portno + "/");
var result = await client.GetAsync("weatherforecast");
var response = await result.Content.ReadAsStringAsync();
Console.WriteLine(response);
}
}
}
}
当我们运行应用程序时,我们可以看到以下输出:
在这里,您看到我们使用端口 8080 来调用容器化的 Web API 应用程序,然后将其重定向到容器内部的端口 80。
意外错误
当我尝试添加 Docker 支持时,我在 Visual Studio 2019 中遇到了一些奇怪的错误。经过一些研究,我能够解决这个问题并添加 Docker 支持。解决方法如下:
在文件夹中,
C:\Windows\System32\drivers
将 cbfs6.sys 重命名为 cbfs6-temp.sys
然后,重新启动 Windows。这应该可以解决问题,然后您将能够添加 docker 支持。
总结
在本文中,我们研究了如何创建容器化的 ASP.NET Core Web API 应用程序以及如何在 Orchestrator Docker Desktop 中托管它。然后我们研究了如何从运行在主机上的另一个应用程序访问在容器中运行的这个应用程序。由于这是一项相对较新的技术,您可能会遇到许多问题,尤其是在部署和托管方面。但是,一旦设置完成,一切都会很好。
常见问题FAQ
- 程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
- 请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!