如何将 .Net Core 应用 Docker 化
欢迎在推特上关注我,我很乐意接受您对话题或改进方面的建议。/克里斯
这是关于将 Docker 和容器化技术与 .Net Core结合使用的一系列文章的第一部分。
本文中,我们将
- 讨论 容器化技术
- 学习我们需要采取的步骤,例如创建工件
Dockerfile,.dockerignore以及一些基本的 Docker 命令。
资源
- 注册一个免费的 Azure 帐户。要在云端使用容器(例如私有注册表),您需要一个免费的 Azure 帐户。
- 本系列共五部分,旨在为您打下坚实的 Docker 基础,内容涵盖基本概念、卷、网络、Docker Compose 等诸多方面。
- Dockerfile 新手实用指南本指南将确保您的 Docker 镜像尽可能小,同时确保其性能良好,并让您了解为什么要使用某些命令。
-
使用这款 VS Code 扩展
程序改进您的 Docker 工作流程。这款扩展程序可以真正帮助您优化 Docker 工作流程,包括构建、运行、编写、部署等众多实用命令。 -
使用 .Net Core 构建微服务
本教程介绍了如何在 .Net 中构建微服务并将其 Docker 化。 -
ASP.NET Core 入门:
本教程将教您如何使用 .NET Core CLI 开发 ASP.NET Core Web 应用程序。 -
将 .NET Core 应用容器化
本文展示了如何将控制台应用容器化 -
.Net Core 和 Docker
这是 Docker 官方对如何 Docker 化 .Net 应用程序的描述。
为什么
标题中,我们将要进行的操作称为“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
这将创建一个名为“.”的 Web 应用程序aspnetcoreapp。
现在我们有了 Web 应用程序,让我们把注意力集中在目前缺失且需要添加的 Docker 部分。
创建 Dockerfile
好的,这部分我们将创建一个名为 Dockerfile 的文件Dockerfile。它的作用是指定我们需要的操作系统、要安装的命令、应用程序代码的位置,以及如何在容器内启动应用程序。你可以把 Dockerfile 看作是操作指南。好了,让我们开始创建它吧:
touch Dockerfile
指定图像
对于内容,首先我们需要定义一个要基于的镜像。我们还需要设置一个工作目录,用于存放容器中的文件。
我们可以使用 FROM 和 WORKDIR 命令来实现,如下所示:
# Dockerfile
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build-env
WORKDIR /app
我们在这里所说的,是去获取一个专为 .Net Core 设计的小型操作系统镜像。我们还说,我们的工作目录是/app.
复制项目文件
接下来,我们需要复制以 .project 结尾的项目文件.csproj。此外,我们还需要调用dotnet restore来确保安装所有指定的依赖项,如下所示:
COPY *.csproj ./
RUN dotnet restore
复制和构建
接下来,我们需要复制应用程序文件并构建应用程序,如下所示:
COPY . ./
RUN dotnet publish -c Release -o out
构建运行时映像
这里我们再次指定镜像文件和工作目录,如下所示:
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2
WORKDIR /app
不过这次有所不同,我们要将构建好的文件复制到app/out:
COPY --from=build-env /app/out .
启动应用程序
最后,我们添加一个启动应用程序的命令。我们使用 ENTRYPOINT 命令来实现这一点。ENTRYPOINT 接受一个数组,该数组会转换为带有参数的命令行调用。我们的命令如下所示:
ENTRYPOINT ["dotnet", "aspnetcoreapp.dll"]
简单来说,就是它会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"]
创建 .dockerignore 文件
在开始构建指令之前,Dockerfile我们需要解决一个问题,即我们不希望包含的文件/目录。为此,Docker 指示我们创建一个名为` .docker .dockerignore...binobj
首先,创建您的.dockerignore文件:
touch .dockerignore
请将以下内容输入到我们的.dockerignore文件中
# .dockerignore
Dockerfile
[b|B]in
[O|o]bj
注:#用于留言。
构建我们的镜像并启动容器
目前,我们只有想要实现的目标的雏形,也就是我们的方案Dockerfile。接下来,我们需要分两步完成:
- 从我们的 Dockerfile 创建镜像
- 使用我们的镜像创建并运行容器。
塑造我们的形象
要创建图像,我们可以使用命令docker build,如下所示:
docker build -t aspnetcoreapp .
如果我们仔细分析一下,就会发现我们用它-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
让我们来分析一下这条命令:
-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
移除容器的操作步骤如下:
docker rm myapp
您可以使用容器名称或 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
概括
我们在.NET Core中迈出了使用Docker的第一步。在此过程中,我们探讨了容器和Docker的优势。
我们还学习了如何指定文件内容Dockerfile,从而确定要将哪些内容放入镜像中。此外,我们还学习了如何创建.dockerignore文件来指定哪些内容不应该包含在镜像中,以确保构建过程体积小、速度快。
此外,我们还搭建并启动了我们的集装箱。
在下一部分中,我们将探讨如何构建微服务并将其部署到云端。
致谢
你应该关注Bruno,他是Java冠军和DevOps专家。
文章来源:https://dev.to/dotnet/how-you-can-dockerize-a-net-core-app-4h96





