Docker系列之AspNetCore Runtime VS .NetCore Runtime VS .NET Core SDK(四)

前言

接下来咱们就要慢慢步入在.NET Core中使用Docker的殿堂了,在开始以前如题,咱们须要搞清楚一些概念,要否则看到官方提供以下一系列镜像,咱们会一脸懵逼,不知道到底要使用哪个。web

AspNetCore Runtime  VS .NetCore Runtime VS .NET Core SDK 

本节咱们所讲解的官方所提供的一系列镜像都是最新镜像,并且阅读本文的您还需明白一点,要是您看到其余博文中提供的镜像以microsoft开头,那么说明已过期再也不可取。这里额外再多说一句,不少时候咱们看到一些资料,而后亲自实践却没达到文章中所描述的效果,大部分状况下可能都是官方已更新致使,一切以官方文档为主才是最佳。咱们将官方所提供的镜像做以下说明:docker

镜像地址json

镜像名称 镜像说明

mcr.microsoft.com/dotnet/core/runtimeubuntu

 .NET Core Runtime 部署.NET Core控制台程序
mcr.microsoft.com/dotnet/core/runtime-deps 

.NET Core Runtime Dependenciesapi

部署自包含的部署应用程序

mcr.microsoft.com/dotnet/core/sdk 缓存

.NET Core SDK 构建.NET Core(或ASP.NET Core应用程序)

mcr.microsoft.com/dotnet/core/aspnet 网络

ASP.NET Core Runtime 部署ASP.NET Core应用程序

上述对于.NET Core Runtime Dependencies镜像包我没作过多了解,在官方文档上有对这个的详细介绍名叫《SCD》,送上地址《https://docs.microsoft.com/en-gb/dotnet/core/deploying/index#self-contained-deployments-scd》,搞那么多包,好像很复杂似的,其实咱们只需谨记以下两点:架构

若需构建.NET Core应用程序,请使用.NET Core SDK并发

若需运行.NET Core应用程序,请使用.NET Core Runtimeapp

好比上一节咱们构建、发布应用程序直接在本地进行,因此咱们只构建了.NET Core Runtime镜像,若在镜像中发布则还需提早下载.NET Core SDK镜像,接下来咱们运行webapi来讲明经过SDK镜像来构建程序,Runtime来运行程序。这里须要注意下,若下载了3.0预览版本直接运行以下命令所建立的程序版本为3.0,此时可能会因缺乏对应包而还原失败,因此这里咱们将经过命令( dotnet new globaljson --sdk-version 2.2.203 --force )回退到2.2稳定版,继续往下走。

到这里为止咱们并未如上一节那样直接发布,咱们将其直接拖到ubuntu中,以下:

这里针对上一节内容补充说一句(我的有强迫症,上一节建立的镜像名称为(hellowrold),这个镜像所打的标签单词名称打错了,应该是helloworld,因此这里咱们重命名下镜像标签名称。又掌握了一个命令,哈哈。首先,咱们查看镜像,以下

在Docker中重命名镜像标签名称有两种方式,一是直接经过标签名称来重命名,而是经过镜像id来重命名,以下:

docker tag hellowrold:latest helloworld:latest

或

docker tag 75a287b4f21c helloworld:latest

咱们经过如上任何一种方式重命名后再查看镜像,以下:

由于容器存在对旧镜像的引用,因此旧的会仍然存在而不是以新的进行彻底覆盖,因此咱们接下来执行以下命令将旧的镜像给移除:

docker rmi hellowrold

经过执行如上命令会删除别名/标签,因为75a287b4f21c具备其余名称,所以不会删除实际图像。

回到正题,接下来咱们开始经过Dockerfile来构建webapi镜像,以下:

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

COPY *.csproj ./
RUN dotnet restore

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

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
WORKDIR /app

COPY --from=build /app/out .

ENTRYPOINT ["dotnet", "WebApi.dll"]

首先咱们构建基础镜像SDK来构建应用程序,咱们指定/app做为咱们构建的工做目录。而后将文件从本地文件系统复制到镜像中,咱们将只复制csproj文件并运行restore,而后复制其余剩余文件并运行dotnet publish来构建咱们的应用程序并发布。该文件的运行时部分使用不一样的docker基础映像也就是使用aspnetcore-runtime映像,它复制构建中的全部文件,而后定义应用程序入口点。咱们发如今整个构建镜像过程的不一样阶段都是可交互的,由于如上咱们第一阶段获取构建程序镜像也就是别名为build,在第二阶段获取运行程序镜像也就是runtime,咱们引用了build。

从如上咱们构建镜像命令和上一节对比知道,构建命令能够经过 docker build . -t tagname  或 docker build -t tagname .  这两种方式来进行皆可。构建镜像就是基于上一镜像层并建立一个新的镜像层的过程,每一个新的镜像层都对应一个惟一的标识id,咱们能够经过以下命令来查看镜像构建的历史记录:

docker image history webapi:latest

镜像“《none》”说明

当咱们构建完镜像后,咱们查看镜像列表会看到此时会多出了镜像标签名称为none的,以下:

如上生成的镜像none的做用是什么呢?咱们是否是能够将其删除呢?

优势:它用来维护中间镜像层,由于对于每一个Dockerfile说明的每一步骤,都会为中间层建立一个新的哈希值,经过容许缓存每一个步骤来提升可重用性,减小磁盘使用量并加速docker构建。

缺点:它做为悬空镜像,可能会致使磁盘空间问题,可是它被列为docker镜像的一部分。(Docker中空的文件系统层是未使用的,而且没有被任何镜像所引用,所以咱们须要一种机制让Docker清除这些空的镜像)

none的镜像只是为临时容器保存而已,因为Docker的架构,即便容器中止了,这些悬空的镜像也依然会保留,因此咱们能够对其进行清理,咱们可使用 docker rmi $(docker images -f "dangling=true" -q) 来清理它们,-f "dangling = true" -q显示全部悬空镜像,rmi将删除全部这些图像,若没有任何悬空镜像但执行了此命令,则会返回错误,可是咱们可使用 docker images prune -a (仅适用于1.25以上的docker版本)。

接下来则是建立并启动容器运行程序,上一节咱们在代码中配置了端口号为5000,而且也经过 docker run -p 5050:5050 hellowrold 指定相同端口号运行程序,这里咱们在代码中并未配置端口,因此默认端口号为80,以下:

docker run webapi:latest

接下来若是咱们访问http:// localhost/api/values,咱们会看到没法链接,也就是说没有获得咱们所指望的JSON响应。

这是为什么呢?咱们来看看docker给咱们生成容器的名称,docker给容器随机生成例如以下一个名称:

接下来咱们经过终端运行容器管理命令来修复,咱们首先将容器中止,而后进行移除,命令以下:

docker container stop gracious_chaplygin
docker container rm gracious_chaplygin

咱们须要将gracious_chaplygi替换为从docker container ls返回的容器名称,咱们使用如下命令再次启动容器:

docker run --name webapi --env ASPNETCORE_ENVIRONMENT=Production -p 80:80 webapi:latest

如上咱们配置了3个参数,--name是容器启动和运行时的名称,--env容许咱们将环境变量传递给正在运行的容器,-p容许咱们将容器上的端口映射到在咱们的机器上的端口。

如上容器已启动,咱们再次使用ls命令查看咱们提供的名称和端口映射:

上述我猜想多是由于容器名称随机生成的问题,而后指定了容器名称,结果好使了,可是上述咱们再次获取容器名称时发现依然是随机生成的容器名称,因此我认为不是这个问题致使,和上一节咱们运行容器作本节对比,只是指定了映射端口号,而本节未指定端口号,默认启动端口号为80,容器也运行起来了呀,最终发现仍是未指定端口号的缘故,由于当我启动容器时,也以下明确指定端口号为80就好使了,因此这里须要注意下。

总结 

本节咱们讲解了在Docker中安装对应.NET Core镜像包的问题,而且以一个例子来讲明,同时呢,咱们在上一节使用指令的基础上又额外添加了对WORKDIR和RUN指令的使用,以及对容器中止、移除、镜像列表查看、镜像重命名、镜像删除、镜像构建历史记录查看指令的使用。接下来咱们会继续经过例子来灵活使用各类指令,而后在这个过程当中还涉及到一些可优化、以及Docker中好比卷、网络更深刻的讲解。

相关文章
相关标签/搜索