创建一个自定义ASP.NET Core RazorPage Docker镜像
admin
2021-06-03[YoYoMooc]创建一个自定义ASP.NET Core RazorPage Docker镜像
推荐视频:
本节课,我们通过创建一个自定义Dockerfile文件,将示例YoYoMooc.Exampleapp
应用程序制作为Docker镜像。
创建Dockerfile文件
Docker Hub包含了很多的一系列的应用程序镜像,但是没有我们当前YoYoMooc.Exampleapp
程序的镜像,所以我们会使用Docker的技术来创建一个自定义镜像。
Dockerfile文件,它是Docker镜像的描述文件,其中会包含一系列的命令,而Docker则会遵循这些规则命令一一执行。
在YoYoMooc.Exampleapp
根目录中,添加一个Dockerfile
文件,添加内容如下:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
COPY dist /app
WORKDIR /app
EXPOSE 80/tcp
ENTRYPOINT ["dotnet", "YoYoMooc.ExampleApp.dll"]
这五行命令就是为示例应用程序创建Docker镜像所需的全部内容。每一条 的命令在后面的章节中详细介绍。
配置基础镜像
Docker镜像最强大的特点之一就是可以基于现有镜像,这意味着命令中包含了基本镜像所包含的所有文件。FROM命令是第一个命令,在Docker文件,它指定了要使用的基础镜像。
在本例中,基础镜像被称为mcr.microsoft.com/dotnet/core/aspnet
,而我指定的版本是3.1的版本,这是一个ASP.NET Core镜像。
该镜像由微软制作,它包含了.NET Core运行时和ASP.NET Core,我们可以通过它运行我们的项目,它不包含.NET SDK,所以我们的Razorpage应用必须提前编译完成,等待制作为镜像。
当然微软还提供了其他镜像:
- SDK地址: mcr.microsoft.com/dotnet/core/sdk:3.1
- runtime地址: mcr.microsoft.com/dotnet/core/runtime:3.1
复制应用程序文件
当您将ASP.NET Core应用程序容器化时,所有已编译的类文件,NuGet包,配置文件,并将Razor视图添加到镜像中。 COPY命令复制文件或文件夹放入容器。
COPY dist /app
此命令是将dist
的文件夹中的文件复制到容器/app
的文件夹中。
目前dist文件夹不存在,我们会在后面准备它。
设置工作目录
WORKDIR
命令便是设置容器的工作目录,这是在运行时非常有用命令,当你需要指定某个路径或者文件的时,不必指定完整路径。
Dockerfile文件中的命令会将COPY 命令创建的/app
文件夹的路径,包含到容器的应用程序中。
公开HTTP端口
容器中的进程无需任何特殊措施即可打开网络端口,但Docker不允许外部世界访问它们,除非Dockerfile包含一个指定端口的EXPOSE
命令,如下所示:
EXPOSE 80/tcp
这个命令告诉Docker,它可以使容器外的TCP请求可用端口80。 对我们的示例应用程序,也需要这样做,这样ASP.NET Core Kestrel服务器才能接收到HTTP请求。
提示:在容器中处理端口是一个两步走的过程。在后面 "使用容器的工作 "部分,了解更多关于 关于如何完成配置,使服务器能够接收请求的详细信息。
运行应用程序
Docker文件的最后一步是ENTRYPOINT命令,它告诉Docker此为容器的起点。
ENTRYPOINT ["dotnet", "YoYoMooc.ExampleApp.dll"]
该命令告诉Docker运行dotnet cli命令行工具来执行YoYoMooc.ExampleApp
文件,我将在下一节中创建。 不必指定YoYoMooc.ExampleApp
文件的路径,因为它假定位于WORKDIR命令指定的目录中,而目录将包含所有的应用程序文件。
预备的应用程序镜像
Dockerfile文件中的一些行命令可能并不是立即就能理解的,特别是如果你习惯于使用Visual Studio
或Visual Studio Code
处理ASP.NET Core MVC项目。
在当前项目中的Dockerfile文件中的镜像不包括.NET Core SDK,如果你现在进行编译肯定会编译失败,并且由于我们指定了dist
文件夹,所以也无法通过自动编译到指定文件夹。
输入以下命令:
dotnet restore ##还原包
dotnet publish --framework netcoreapp3.1 --configuration Release --output dist
dotnet restore
命令是为了确保项目已经拥有所有需要的Nuget包。
重要的命令是 dotnet publish
,它可以编译应用程序,然后将其转换为转换成一个独立的文件集,其中包含了应用程序所需的所有内容。输出参数指定了编译后的项目应该被写到一个名为 dist 的文件夹中,这个文件夹对应Dockerfile中的 COPY命令。
这里拆分成了两步,你可以直接使用
dotnet publis
h命令也是可以的,如果没有还原他会自动还原。
创建一个自定义镜像
要处理Docker文件并为示例应用程序生成镜像,请运行以下所示的命令
docker build . -t yoyomooc/exampleapp -f Dockerfile
docker build
命令会创建一个新的镜像。build关键字后面的句号提供了上下文,也就是Docker文件中的COPY等命令所使用的位置。
参数说明:
-t
参数 :用于标记新的镜像名称为yoyomooc/exampleapp
。-f
参数:指定了创建镜像的说明文件即Dockerfile的完整名称。镜像取名规则的惯例是使用您的名字或您的组织名称,后面是应用的名称。
Docker会下载它所需要的基本镜像,然后按照Dockerfile中的说明来进行生成新的镜像。当构建过程完成后,你可以通过运行docker images
命令,查询生成的镜像列表。
REPOSITORY | TAG | IMAGE | ID | CREATED | SIZE |
---|---|---|---|---|---|
hello-world | latest | bf756fb1ae65 | 4 months ago | 13.3kB | |
yoyomooc/exampleapp | latest | d79e42555679 | About an hour ago | 212MB | |
mcr.microsoft.com/dotnet/core/aspnet | 3.1 | 79e79777c3bf | 2 weeks ago | 207MB |
小结
从3.X开始微软的镜像就不再由hub.docker.com托管,是由微软官方进行独立维护,所以我们指定了镜像域名地址
mcr.microsoft.com
。 所以产生了一个问题,网速慢,可以采用我自制的镜像。
- aspnet地址:
registry.cn-hangzhou.aliyuncs.com/yoyosoft/dotnet/core/aspnet:3.1
- sdk地址:
registry.cn-hangzhou.aliyuncs.com/yoyosoft/dotnet/core/sdk
下节课,我们带着大家来操作这个镜像组成容器。