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

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

640?wx_fmt=png

640?wx_fmt=gif

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》,搞那么多包,好像很复杂似的,其实我们只需谨记如下两点

640?wx_fmt=gif

若需构建.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稳定版,继续往下走。

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

因为容器存在对旧镜像的引用,所以旧的会仍然存在而不是以新的进行完全覆盖,所以我们接下来执行如下命令将旧的镜像给移除:

640?wx_fmt=png

通过执行如上命令会删除别名/标签,由于75a287b4f21c具有其他名称,因此不会删除实际图像。

640?wx_fmt=png

回到正题,接下来我们开始通过Dockerfile来构建webapi镜像,如下:

640?wx_fmt=png

640?wx_fmt=png

首先我们构建基础镜像SDK来构建应用程序,我们指定/app作为我们构建的工作目录。然后将文件从本地文件系统复制到镜像中,我们将只复制csproj文件并运行restore,然后复制其他剩余文件并运行dotnet publish来构建我们的应用程序并发布。


该文件的运行时部分使用不同的docker基础映像也就是使用aspnetcore-runtime映像,它复制构建中的所有文件,然后定义应用程序入口点。我们发现在整个构建镜像过程的不同阶段都是可交互的,因为如上我们第一阶段获取构建程序镜像也就是别名为build,在第二阶段获取运行程序镜像也就是runtime,我们引用了build。

640?wx_fmt=png

从如上我们构建镜像命令和上一节对比知道,构建命令可以通过如下两种方式来进行皆可。

640?wx_fmt=png

构建镜像就是基于上一镜像层并创建一个新的镜像层的过程,每个新的镜像层都对应一个唯一的标识id,我们可以通过如下命令来查看镜像构建的历史记录:

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=gif

镜像“《none》”说明

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

640?wx_fmt=png

如上生成的镜像none的作用是什么呢?我们是不是可以将其删除呢?

640?wx_fmt=gif

优点:它用来维护中间镜像层,因为对于每个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,如下:

640?wx_fmt=png

640?wx_fmt=png

接下来如果我们访问http:// localhost/api/values,我们会看到无法连接,也就是说没有得到我们所期望的JSON响应。

640?wx_fmt=png

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

640?wx_fmt=png

接下来我们通过终端运行容器管理命令来修复,我们首先将容器停止,然后进行移除,命令如下:

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

640?wx_fmt=png

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

640?wx_fmt=png

上述我猜测可能是因为容器名称随机生成的问题,然后指定了容器名称,结果好使了,但是上述我们再次获取容器名称时发现依然是随机生成的容器名称,所以我认为不是这个问题导致,


和上一节我们运行容器做本节对比,只是指定了映射端口号,而本节未指定端口号,默认启动端口号为80,容器也运行起来了呀,最终发现还是未指定端口号的缘故,因为当我启动容器时,也如下明确指定端口号为80就好使了,所以这里需要注意下。

640?wx_fmt=png

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

640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDU 6750 Function(莫比乌斯反演)(2020百度之星初赛1)

Function 推式子 S(n)∑i1n∑d∣id[gcd(d,id)1]∑d1nd∑d∣i[gcd(d,id)1]∑d1nd∑i1nd[gcd(d,i)1]∑d1nd∑i1nd∑k∣gcd(d,i)μ(k)∑k1nμ(k)k∑d1nkd∑i1nk2dtk2d∑t1nnt∑k2∣tμ(k)ktk2∑k1nμ(k)k∑k2∣tnttk2itk2∑k1nμ(k)k∑i1nk2nik2iS(n) \sum_{i 1} ^{n} \sum_{d …

P5170 【模板】类欧几里得算法

P5170 【模板】类欧几里得算法 https://www.cnblogs.com/bztMinamoto/p/10334354.html 对于类欧几里得算法,本质上可以理解为一条直线下的整点个数,是一个矩形区域。 然后将整数部分提出,就可以使得这个直线斜率较小,那么我们就可…

.NET Core跨平台部署于Docker(Centos)- 视频教程

.NET Core跨平台部署于Docker,Docker部署于Centos中,演示跨平台特性!以下视频教程,请带上耳机开始聆听往期教程:.NET开发框架(一)-框架介绍与视频演示.NET开发框架(二)-框架功能简述.NET开发框架(三)-高可用服务器端设计.NET开发框…

矩阵快速幂各类题型总结(一般,共轭,1 * n, 矩阵简化)

Reading comprehension 这个不难找出递推式f[n]f[n−1]2f[n−2]1f[n] f[n - 1] 2f[n - 2] 1f[n]f[n−1]2f[n−2]1。 /*Author : lifehappy */ #pragma GCC optimize(2) #pragma GCC optimize(3) #include <bits/stdc.h>using namespace std;typedef long long ll;co…

【清华集训2014】Sum)(类欧几里得算法)

【清华集训2014】Sum 然后本质上我们需要求解的就是那个带根号式子的奇偶性&#xff0c;然后我们发现这个式子很像是类欧几里得算法&#xff0c;求解一个斜率为无理数直线下的整点个数&#xff0c;然后我们直接对于一般形式求解&#xff0c;那么就是每次利用整数部分将斜率减小…

一本让我多花2倍时间读的书

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「87」篇原创敬上Hi&#xff0c;大家好&#xff0c;我是Z哥。熟悉我的小伙伴应该知道&#xff0c;我平时看书大多都很快&#xff0c;之前还把自己的速读技巧分享给了…

P3355 骑士共存问题(网络流)

P3355 骑士共存问题 经典的最大独立集问题&#xff0c;最大独立集就是最小点覆盖的补集&#xff0c;因为最小点覆盖等于最大匹配&#xff0c;所以最大独立集等于点数减去最大匹配。

[NOI2005]月下柠檬树 (自适应辛普森)

P4207 [NOI2005]月下柠檬树 如图&#xff0c;我们要求的面积就是这些圆形跟梯形的组合&#xff0c;由于投射到地面上&#xff0c;显然有h′htanθh \frac{h}{tan \theta}h′tanθh​&#xff0c;由此我们就可以开始推导这个f(x)f(x)f(x)函数了。 所以转换为我们要推导出直线a…

Kong 1.3发布,原生gRPC代理、上游TLS交叉认证

Kong 1.3 发布了&#xff0c;此版本亮点包括支持原生 gRPC 代理、上游 TLS 交叉认证&#xff0c;以及一系列新功能和性能改进。原生 gRPC 代理越来越多的用户转向微服务架构&#xff0c;并且希望有对原生 gRPC 代理的支持&#xff0c;Kong 1.3 解决了这个问题&#xff0c;为支持…

自适应辛普森(算法简要 + 模板)

简述&#xff1a; 对于普通的二次函数有f(x)ax2bxcf(x) ax ^ 2 bx cf(x)ax2bxc&#xff0c;原函数F(x)ax33bx22cxF(x) \frac{a x^3}{3} \frac{bx ^2}{2} cxF(x)3ax3​2bx2​cx。 有 ⎰lrf(x)F(r)−F(l)a3(r−l)3b2(r−l)2c(r−l)(r−l)6(2a(l2r2lr)3b(lr)c)(r−l)6((al…

P3358 最长k可重区间集问题(网络流:串联思想)

P3358 最长k可重区间集问题 这是一个经典模型&#xff0c;给定n个开区间&#xff0c;选择一些区间使得每个位置被覆盖次数不超过k&#xff0c;并最大化选择的区间长度之和。 首先一个直接的想法就是每一个区间匹配了它所对应的点&#xff0c;但是我们要求选择一个区间就必须要…

对Windows桌面应用程序进行UI自动化测试

所谓UI自动化测试&#xff0c;就是模拟一个用户&#xff0c;对应用程序的UI进行操作&#xff0c;以完成特定场景的功能性集成测试。要对Windows桌面应用程序进行UI自动化测试&#xff0c;目前可选的技术主要是两种&#xff1a;VS自带的CodedUI Test和AppiumWinAppDriver。但是&…

2019年ICPC银川区域赛 Easy Problem(简单莫比乌斯函数 + 欧拉降幂)

Easy Problem ∑a11m∑a21m∑a31m⋯∑an−1m∑anm[gcd(a1,a2,a3,…,an−1,an)d](a1,a2,a3,…,an−1,an)kdkd∑a11md∑a21md∑a31md⋯∑an−1md∑anmd[gcd(a1,a2,a3,…,an−1,an)1](a1,a2,a3,…,an−1,an)kdkd∑i1mdikdμ(i)∑a11mid∑a21mid∑a31mid⋯∑an−11mid∑an1mid(∏j1…

P3357 最长k可重线段集问题(网络流/串联/拆点)

P3357 最长k可重线段集问题 对于n条开线段&#xff0c;选择一个子集使得任意xp和子集相交的直线个数小于等于k&#xff0c;并使得选择的线段长度之和最大。 这道题看上去和区间集没有什么区别&#xff0c;只是费用发生变化&#xff0c;但是要注意一个特殊情况&#xff0c;那就…

项目实战中如何使用抽象类和接口

引子&#xff1a;时常会有这么一个疑惑&#xff0c;抽象类和接口功能好像&#xff0c;真正用起来该如何抉择呢&#xff1f;&#xff1f;好问题。。来看看书上怎么说的&#xff08;C#7.0本质论&#xff09;虽然方法可在基类中声明为抽象成员&#xff0c;但是&#xff01;&#x…

番茄日志发布1.0.3版本-增加Kafka支持

番茄日志&#xff08;TomatoLog&#xff09;能做什么可能你是第一次听说TomatoLog&#xff0c;没关系&#xff0c;我可以从头告诉你&#xff0c;通过了解番茄日志&#xff0c;希望能帮助有需要的朋友&#xff0c;番茄日志处理将大大降低你采集、分析、处理日志的过程。介绍Toma…

Java String类型变量的比较问题

今天写程序的时候&#xff0c;发现了一个很奇怪的问题&#xff0c;代码如下&#xff1a; if((address.getCountry())!"国家"){ ad.insertAddress(address); //将只有国家、省份、城市三列的Address对象插入到数据库表格中 } 其中&#xff0c;我设置了断点进行调试…

P2494 [SDOI2011]保密(网络流/最小割/01分数规划)

P2494 [SDOI2011]保密 这道题是一个很综合的题目 首先有一个二分图&#xff0c;到达一个点就可以到达所有该点相连的边&#xff0c;然后需要覆盖所有边&#xff0c;然后给定一张图你从起点出发然后可以到达二分图的节点&#xff0c;保证没有环&#xff0c;每条边有时间和花费&…

B. Product(2019ICPC西安邀请赛)(杜教筛)

Product ∑i1n∑j1n∑k1ngcd⁡(i,j)[k∣gcd⁡(i,j)]∑k1n∑i1nk∑j1nkgcd⁡(ik,jk)∑k1nk∑i1nk∑j1nkgcd⁡(i,j)∑k1nk∑d1nkd∑i1nkd∑j1nkd[gcd⁡(i,j)1]∑k1nk∑d1nkd(∑i1nkd2ϕ(i)−1)Tkd∑T1n∑k∣TkTk(∑i1nT2ϕ(i)−1)∑T1nTσ0(T)(∑i1nT2ϕ(i)−1)\sum_{i 1} ^{n} …

ArangoDB 3.5发布:流事务API、蒙面数据、搜索性能大幅提升、最短路径功能

ArangoDB 3.5 发布了。ArangoDB 是一个分布式原生的多模型数据库&#xff0c;具有灵活的文档、图形和键值数据模型。使用方便的 SQL 查询语言或 JavaScript 扩展构建高性能应用程序。此版本亮点包括&#xff1a;期待已久的 Streaming Transactions API&#xff0c;可以直接使用…