个人合法网站怎么做,网站介绍词,oa系统品牌,电商网页设计图片接下来我们就要慢慢步入在.NET Core中使用Docker的殿堂了#xff0c;如题在开始之前#xff0c;我们需要搞清楚一些概念#xff0c;要不然看到官方提供如下一系列镜像#xff0c;我们会一脸懵逼#xff0c;不知道到底要使用哪一个。AspNetCore Runtime VS .NetCore Runti… 接下来我们就要慢慢步入在.NET Core中使用Docker的殿堂了如题在开始之前我们需要搞清楚一些概念要不然看到官方提供如下一系列镜像我们会一脸懵逼不知道到底要使用哪一个。AspNetCore Runtime VS .NetCore Runtime VS .NET Core SDK 本节我们所讲解的官方所提供的一系列镜像都是最新镜像而且阅读本文的您还需明白一点要是您看到其他博文中提供的镜像以microsoft开头那么说明已过时不再可取。这里额外再多说一句很多时候我们看到一些资料然后亲自实践却没达到文章中所描述的效果大部分情况下可能都是官方已更新导致一切以官方文档为主才是最佳。我们将官方所提供的镜像作如下说明镜像地址镜像名称镜像说明mcr.microsoft.com/dotnet/core/runtime .NET Core Runtime部署.NET Core控制台程序mcr.microsoft.com/dotnet/core/runtime-deps .NET Core Runtime Dependencies部署自包含的部署应用程序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 Runtime比如上一节我们构建、发布应用程序直接在本地进行所以我们只构建了.NET Core Runtime镜像若在镜像中发布则还需提前下载.NET Core SDK镜像接下来我们运行webapi来说明通过SDK镜像来构建程序Runtime来运行程序。这里需要注意下若下载了3.0预览版本直接运行如下命令所创建的程序版本为3.0此时可能会因缺少对应包而还原失败所以这里我们将通过如下命令回退到2.2稳定版继续往下走。到这里为止我们并未如上一节那样直接发布我们将其直接拖到ubuntu中如下这里针对上一节内容补充说一句(个人有强迫症上一节创建的镜像名称为(hellowrold)这个镜像所打的标签单词名称打错了应该是helloworld所以这里我们重命名下镜像标签名称。又掌握了一个命令哈哈。首先我们查看镜像如下在Docker中重命名镜像标签名称有两种方式一是直接通过标签名称来重命名而是通过镜像id来重命名如下我们通过如上任何一种方式重命名后再查看镜像如下因为容器存在对旧镜像的引用所以旧的会仍然存在而不是以新的进行完全覆盖所以我们接下来执行如下命令将旧的镜像给移除通过执行如上命令会删除别名/标签由于75a287b4f21c具有其他名称因此不会删除实际图像。回到正题接下来我们开始通过Dockerfile来构建webapi镜像如下首先我们构建基础镜像SDK来构建应用程序我们指定/app作为我们构建的工作目录。然后将文件从本地文件系统复制到镜像中我们将只复制csproj文件并运行restore然后复制其他剩余文件并运行dotnet publish来构建我们的应用程序并发布。该文件的运行时部分使用不同的docker基础映像也就是使用aspnetcore-runtime映像它复制构建中的所有文件然后定义应用程序入口点。我们发现在整个构建镜像过程的不同阶段都是可交互的因为如上我们第一阶段获取构建程序镜像也就是别名为build在第二阶段获取运行程序镜像也就是runtime我们引用了build。从如上我们构建镜像命令和上一节对比知道构建命令可以通过如下两种方式来进行皆可。构建镜像就是基于上一镜像层并创建一个新的镜像层的过程每个新的镜像层都对应一个唯一的标识id我们可以通过如下命令来查看镜像构建的历史记录镜像“《none》”说明当我们构建完镜像后我们查看镜像列表会看到此时会多出了镜像标签名称为none的如下如上生成的镜像none的作用是什么呢我们是不是可以将其删除呢优点它用来维护中间镜像层因为对于每个Dockerfile说明的每一步骤都会为中间层创建一个新的哈希值通过允许缓存每个步骤来提高可重用性减少磁盘使用量并加速docker构建。缺点它作为悬空镜像可能会导致磁盘空间问题但是它被列为docker镜像的一部分。Docker中空的文件系统层是未使用的并且没有被任何镜像所引用因此我们需要一种机制让Docker清除这些空的镜像none的镜像只是为临时容器保存而已由于Docker的架构即使容器停止了这些悬空的镜像也依然会保留所以我们可以对其进行清理我们可以使用docker rmi $(docker images -f danglingtrue -q)来清理它们-f dangling true -q显示所有悬空镜像rmi将删除所有这些图像。若没有任何悬空镜像但执行了此命令则会返回错误但是我们可以使用docker images prune -a仅适用于1.25以上的docker版本。接下来则是创建并启动容器运行程序上一节我们在代码中配置了端口号为5000并且也通docker run -p 5050:5050 hellowrold 指定相同端口号运行程序这里我们在代码中并未配置端口所以默认端口号为80如下接下来如果我们访问http:// localhost/api/values我们会看到无法连接也就是说没有得到我们所期望的JSON响应。这是为何呢我们来看看docker给我们生成容器的名称docker给容器随机生成例如如下一个名称接下来我们通过终端运行容器管理命令来修复我们首先将容器停止然后进行移除命令如下我们需要将gracious_chaplygi替换为从docker container ls返回的容器名称我们使用以下命令再次启动容器如上我们配置了3个参数--name是容器启动和运行时的名称--env允许我们将环境变量传递给正在运行的容器-p允许我们将容器上的端口映射到在我们的机器上的端口。如上容器已启动我们再次使用ls命令查看我们提供的名称和端口映射上述我猜测可能是因为容器名称随机生成的问题然后指定了容器名称结果好使了但是上述我们再次获取容器名称时发现依然是随机生成的容器名称所以我认为不是这个问题导致和上一节我们运行容器做本节对比只是指定了映射端口号而本节未指定端口号默认启动端口号为80容器也运行起来了呀最终发现还是未指定端口号的缘故因为当我启动容器时也如下明确指定端口号为80就好使了所以这里需要注意下。本节我们讲解了在Docker中安装对应.NET Core镜像包的问题并且以一个例子来说明同时呢我们在上一节使用指令的基础上又额外添加了对WORKDIR和RUN指令的使用以及对容器停止、移除、镜像列表查看、镜像重命名、镜像删除、镜像构建历史记录查看指令的使用。接下来我们会继续通过例子来灵活使用各种指令然后在这个过程中还涉及到一些可优化、以及Docker中比如卷、网络更深入的讲解。