发布于 2026-01-05 8 阅读
0

如何将 .Net Core 应用 Docker 化

如何将 .Net Core 应用 Docker 化

欢迎在推特上关注我,我很乐意接受您对话题或改进方面的建议。/克里斯

这是关于将 Docker 和容器化技术与 .Net Core结合使用的一系列文章的第一部分。

本文中,我们将

  • 讨论 容器化技术
  • 学习我们需要采取的步骤,例如创建工件Dockerfile.dockerignore以及一些基本的 Docker 命令。

资源

为什么

标题中,我们将要进行的操作称为“Docker化”。这个名称dockerizing来源于Docker。它的另一个名称是容器化,由于Docker是容器领域非常流行的供应商,这两个概念几乎已经可以互换使用。

当然还有其他供应商。如果您感兴趣,可以点击此处了解更多信息:

https://techbeacon.com/enterprise-it/30-essential-container-technology-tools-resources-0

Docker 帮助我们将应用程序置于容器中。那么,我们为什么要这样做呢?原因有很多。首先,让我们来谈谈什么是容器。让我们看看 Docker 是如何定义它的:

容器是一种标准的软件单元,它将代码及其所有依赖项打包在一起,从而使应用程序能够在不同的计算环境中快速可靠地运行。

好的,所以我们提高了速度和可靠性,使其能够从一个计算机环境迁移到另一个计算机环境,也就是说,它不仅适用于我的机器?

没错,就是这样。

还有什么?

Docker 容器镜像是一个轻量级的、独立的、可执行的软件包,其中包含运行应用程序所需的一切:代码、运行时环境、系统工具、系统库和设置。

好的,我把所有东西都带上了,不仅有应用程序代码,还有运行时环境、系统工具等等。这不就是虚拟镜像吗?

不,这只是个轻量级版本。容器会使用底层宿主机操作系统来进行系统调用。

哦,我明白了。我用 Docker 创建容器,这样就能得到一个体积小、重量轻,而且在所有环境下看起来都一样的东西。我发布应用的时候会这么做,对吧?

是的,你说对了。当然,无论是在发布应用时,还是在开发过程中,云服务都是不错的选择。如今,云服务非常普及,已成为应用托管的默认标准。将应用容器化意味着我们可以轻松地使用 Kubernetes 等工具进行扩展,从而管理大量容器或支持微服务架构。大多数大型云服务商也支持将容器存储在云端的容器镜像仓库中。

 如何演示

好了,我们已经初步探讨了为什么要将应用程序转换为容器化版本,现在让我们来看看我们需要采取的实际步骤:

  • 搭建一个.Net Web应用程序,
  • 创建Dockerfile
  • 创建Docker 忽略文件
  • 塑造我们的形象
  • 运行我们的容器

搭建 Web 应用程序

首先,我们需要一个 .Net Web 应用程序。我们可以使用 dotnet CLI 来创建它,如下所示:

dotnet new webapp -o aspnetcoreapp
Enter fullscreen mode Exit fullscreen mode

这将创建一个名为“.”的 Web 应用程序aspnetcoreapp

现在我们有了 Web 应用程序,让我们把注意力集中在目前缺失且需要添加的 Docker 部分。

创建 Dockerfile

好的,这部分我们将创建一个名为 Dockerfile 的文件Dockerfile。它的作用是指定我们需要的操作系统、要安装的命令、应用程序代码的位置,以及如何在容器内启动应用程序。你可以把 Dockerfile 看作是操作指南,让我们开始创建它吧:

touch Dockerfile
Enter fullscreen mode Exit fullscreen mode

指定图像

对于内容,首先我们需要定义一个要基于的镜像。我们还需要设置一个工作目录,用于存放容器中的文件。
我们可以使用 FROM 和 WORKDIR 命令来实现,如下所示:

# Dockerfile
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build-env

WORKDIR /app
Enter fullscreen mode Exit fullscreen mode

我们在这里所说的,是去获取一个专为 .Net Core 设计的小型操作系统镜像。我们还说,我们的工作目录是/app.

复制项目文件

接下来,我们需要复制以 .project 结尾的项目文件.csproj。此外,我们还需要调用dotnet restore来确保安装所有指定的依赖项,如下所示:

COPY *.csproj ./
RUN dotnet restore
Enter fullscreen mode Exit fullscreen mode

复制和构建

接下来,我们需要复制应用程序文件并构建应用程序,如下所示:

COPY . ./
RUN dotnet publish -c Release -o out
Enter fullscreen mode Exit fullscreen mode

构建运行时映像

这里我们再次指定镜像文件和工作目录,如下所示:

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2
WORKDIR /app
Enter fullscreen mode Exit fullscreen mode

不过这次有所不同,我们要将构建好的文件复制到app/out

COPY --from=build-env /app/out .
Enter fullscreen mode Exit fullscreen mode

启动应用程序

最后,我们添加一个启动应用程序的命令。我们使用 ENTRYPOINT 命令来实现这一点。ENTRYPOINT 接受一个数组,该数组会转换为带有参数的命令行调用。我们的命令如下所示:

ENTRYPOINT ["dotnet", "aspnetcoreapp.dll"]
Enter fullscreen mode Exit fullscreen mode

简单来说,就是它会dotnet aspnetcoreapp.dll在命令行中调用。

完整内容Dockerfile如下:

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

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "aspnetcoreapp.dll"]
Enter fullscreen mode Exit fullscreen mode

 创建 .dockerignore 文件

在开始构建指令之前,Dockerfile我们需要解决一个问题,即我们不希望包含的文件/目录。为此,Docker 指示我们创建一个名为` .docker .dockerignore...binobj

首先,创建您的.dockerignore文件:

touch .dockerignore
Enter fullscreen mode Exit fullscreen mode

请将以下内容输入到我们的.dockerignore文件中

# .dockerignore

Dockerfile
[b|B]in
[O|o]bj
Enter fullscreen mode Exit fullscreen mode

注:#用于留言。

 构建我们的镜像并启动容器

目前,我们只有想要实现的目标的雏形,也就是我们的方案Dockerfile。接下来,我们需要分两步完成:

  1. 从我们的 Dockerfile 创建镜像
  2. 使用我们的镜像创建并运行容器。

塑造我们的形象

要创建图像,我们可以使用命令docker build,如下所示:

docker build -t aspnetcoreapp .
Enter fullscreen mode Exit fullscreen mode

如果我们仔细分析一下,就会发现我们用它-t来给图像命名。` aspnetcoreapp<image_name>` 就成了图像名称。最后一个参数是一个标点符号.,表示图像的存放位置Dockerfile,在本例中是当前目录。

运行此命令首先会下载 .Net Core 映像,请记住我们的 FROM 命令:

之后,它会处理 Dockerfile 中剩余的所有命令:

上面我们可以看到图像显示正常successfully tagged aspnetcoreapp:latest。这意味着一切正常,我们已经获得了图像。那么我们该如何验证这一点呢?

docker images我们可以像这样输入命令:

创建并运行我们的容器

至此,我们已经有了镜像文件。太好了!它包含了我们的应用程序代码、命令、实用程序、操作系统以及我们指定包含的所有其他内容。我们需要启动它。为此,我们需要将其转换为容器。我们使用以下命令来实现docker run

docker run -d -p 8080:80 --name myapp aspnetcoreapp
Enter fullscreen mode Exit fullscreen mode

让我们来分析一下这条命令:

  • -d这意味着我们在后台运行容器。
  • -p这意味着我们将把外部端口与内部容器端口匹配。某些Dockerfile规范需要显式暴露内部端口,但由于我们的程序运行在默认端口上,因此不需要这样做80。不过,让我们明确一下语法external port: internal port。这意味着我们将机器的端口连接8080到内部容器端口80
  • --name这是我们为容器命名的地方myapp。如果我们不指定名称,系统会自动生成一个。给容器命名可以方便以后引用它。

最后一个参数是图像名称aspnetcoreapp

让我们用以下命令检查容器是否已创建并正在运行docker ps

最后,让我们通过访问以下路径来检查我们的容器是否已启动并运行http://localhost:8080

清理

现在我们已经创建了一个镜像和一个容器,它们都已启动并运行。随着时间的推移,你会拥有大量的镜像和容器。这会占用大量空间,所以让我们学习一些 Docker 命令来控制它们。

要停止容器类型docker stop [docker name]。所以在我们的例子中,应该是:

docker stop myapp
Enter fullscreen mode Exit fullscreen mode

移除容器的操作步骤如下:

docker rm myapp
Enter fullscreen mode Exit fullscreen mode

您可以使用容器名称或 ID(至少前 3 个字符)来停止/移除它。您可以通过输入例如 `.` 来查找它的名称docker ps

现在我们还剩下两张镜像,aspnetcoreapp一张是我们自己构建的,另一张mcr.microsoft.com/dotnet/core/runtime:2.2是我们基于其构建的镜像。要彻底清理,我们可以使用命令docker rmi(即删除镜像),如下所示:

docker rmi myimage:latest
docker rmi mcr.microsoft.com/dotnet/core/runtime:2.2
Enter fullscreen mode Exit fullscreen mode

概括

我们在.NET Core中迈出了使用Docker的第一步。在此过程中,我们探讨了容器和Docker的优势。

我们还学习了如何指定文件内容Dockerfile,从而确定要将哪些内容放入镜像中。此外,我们还学习了如何创建.dockerignore文件来指定哪些内容不应该包含在镜像中,以确保构建过程体积小、速度快。

此外,我们还搭建并启动了我们的集装箱。

在下一部分中,我们将探讨如何构建微服务并将其部署到云端。

致谢

你应该关注Bruno,他是Java冠军和DevOps专家。

文章来源:https://dev.to/dotnet/how-you-can-dockerize-a-net-core-app-4h96