Docker最全教程——从理论到实战(三)

容器是应用走向云端之后必然的发展趋势,因此笔者非常乐于和大家分享我们这段时间对容器的理解、心得和实践。

本篇教程持续编写了2个星期左右,只是为了大家更好地了解、理解和消化这个技术,能够搭上这波车。

你可以关注我们的公众号“magiccodes”给我们留言,也可以加入我们的QQ群(85318032)一起讨论,我们希望能够多多交流,多多分享。

如果觉得不错,请多多点赞或者请我们喝杯咖啡,你们的支持是我们前进的最大动力!


640?wx_fmt=png

640?wx_fmt=png640?wx_fmt=png640?wx_fmt=jpeg


Docker和ASP.NET Core

Docker 正在逐渐成为容器行业的事实标准,受到 Windows 和 Linux 生态系统领域最重要供应商的支持。 (Microsoft 是支持 Docker 的主要云供应商之一。)现在,Docker 基本上已经在各大云或本地的任何数据中心普及了。

如何将.NET程序托管到Docker之中,相信这是广大.NET开发者的一个疑问。事实上,.NET Framework 支持在Docker中运行,但是仅能在windows 容器中运行,这并不符合我们的预期,因此,本篇我们只侧重于讨论ASP.NET CoreDocker

在使用之前,笔者还是有必要介绍下ASP.NET Core。如果您对此非常熟悉和了解或者对此节不感兴趣,可以跳过本节。

ASP.NET Core简介

ASP.NET Core是一个跨平台的高性能开源框架,用于生成基于云且连接 Internet 的新式应用程序。使用 ASP.NET Core,我们可以:

  • 建置 Web 应用程序和服务、IoT 应用和移动后端。

  • 能够在 Windows、macOS Linux 上进行开发和运行。部署到云或本地。

  • .NET Core.NET Framework 上运行。

  • 能够在 IIS、Nginx、Apache、Docker 上进行托管或在自己的进程中进行自托管我们的应用。


性能是.NET Core的一个关键特性,这里有必要介绍下。在这块,我们摘取了一份社区的测试汇总统计,仅供参考:

640?wx_fmt=png

具体过程大家可以访问此链接来查看详情:

https://www.cnblogs.com/savorboard/archive/2016/10/17/dotnet-benchmarks.html


ASP.NET Core和Docker

刚才说了这么多,我们回到主题。.NET Core天生就为跨平台设计,并且和Docker搭配非常友好,而且微软官方在这块提供了很多支持。比如说:

  • 轻量

  • 跨平台,天生对Linux友好

  • 模块化

  • 提供了轻量型容器镜像

  • 高性能(领先于Java servlets、Go 和 node.js)

接下来,我们一起来了解官方镜像。ASP.NET Core的官方镜像名称为microsoft/aspnetcore,微软针对Docker上的 ASP.NET Core 应用进行了优化,因此容器可以更快启动。为开发人员生成Docker镜像时,Microsoft 侧重于提供了以下主要方案:

  1. 用于开发和生成 .NET Core 应用的镜像。

  2. 用于运行 .NET Core 应用的镜像。

640?wx_fmt=png

为什么是多个镜像?因为在开发、生成和运行容器化应用程序时,通常具有不同的优先级。 通过为这些单独的任务提供不同的镜像,有助于独立优化开发、生成和部署应用程序的过程。在开发期间,我们侧重的是开发更改的速度以及调试的能力。在生产环境,我们侧重的是应用部署和容器启动的速度和效率。


这里我们顺便提下我们基于.NET Core 2.1开发的免费开源框架——Magicodes.Admin,其demo现在已经完全托管在Docker之中,部署在腾讯云的容器服务之中,大家可以点击访问测试下速度和稳定性,启动速度这点没得说。推荐访问Https地址,因域名在备案之中,http域名可能无法访问。

Magicodes.Admin开源库地址:https://gitee.com/xl_wenqiang/Magicodes.Admin.Core


Demo地址:https://demoadmin.xin-lai.com

Admin

123456abcD


在本篇Docker教程中,我们会结合Magicodes.Admin的实践进行讲解,同时我们也会尽量提供一些实践案例分享给大家,比如Magicodes.Admin demo、Magicodes云服务、小程序商城(即将开源)、爱车APP等Docker完整托管案例,以便大家更易于理解和使用Docker。在Magicodes.Admin框架中,接口服务使用.NET Core 2.1开发,在docker上基于microsoft/dotnet:2.1-aspnetcore-runtime镜像使用Kestrel web服务器,后台前端使用Angular开发,在docker上基于nginx镜像使用nginx服务器进行托管,并启用了HTTPS支持和GZIP压缩。

640?wx_fmt=jpeg

我们回过来继续。.NET镜像 (microsoft/dotnet) 同样适用于基于 .NET Core 的控制台应用。使用 Docker 和 .NET Core非常适用于生产部署和托管,主要有以下几点:

  • 无需本地安装——可以直接使用 .NET Framework,而无需本地安装。只下载相关的Docker 镜像,其中包含 .NET Framework。

  • 在容器中开发——你可以在一致的环境中开发,使开发和生产环境类似(可避免一些问题,例如开发人员计算机上的全局状态)。 通过VS的一些扩展插件,我们甚至可以直接从 Visual Studio 启动容器。

  • 容器中测试——可以在容器中测试,减少由于环境配置不当或上次测试遗留的其他更改而导致的故障。

  • 在容器中生成——可以在容器中生成代码。

  • 在所有环境中部署——可以通过你的所有环境部署镜像。 这种方法减少了配置差异导致的故障,通常通过外部配置(例如,注入的环境变量)改变镜像行为。

注意:

Docker 镜像容器可以在 Linux 和 Windows 上本机运行。 但是,Windows 镜像仅能在 Windows 主机上运行,Linux 镜像可以在 Linux 主机和 Windows 主机上运行(到目前为止,使用 Hyper-V Linux VM),其中主机是指服务器或 VM。

640?wx_fmt=jpeg

注意:

.NET Framework也可以使用Docker进行托管,不过仅能托管到windows容器之中。

在具体应用和实践之前,我们有必要了解以下内容。


Kestrel

Kestrel是一个基于libuv的跨平台ASP.NET Core web服务器,libuv是一个跨平台的异步I/O库。ASP.NET Core模板项目使用Kestrel作为默认的web服务器。

Kestrel支持以下功能:

  • HTTPS

  • 用于启用不透明升级的WebSockets

  • 位于Nginx之后的高性能Unix sockets

Kestrel .NET Core支持的所有平台和版本所支持Kestrel 可以单独使用,也可以与反向代理服务器(如 IISNginx Apache)一起使用。 反向代理服务器接收到来自 Internet HTTP 请求,并在进行一些初步处理后将这些请求转发到 Kestrel

640?wx_fmt=png640?wx_fmt=png

在没有 Kestrel 或自定义服务器实现的情况下,不能使用 IIS、Nginx 和 Apache。 ASP.NET Core 设计为在其自己的进程中运行,以实现跨平台统一操作。 IIS、Nginx 和 Apache 规定自己的启动过程和环境。 若要直接使用这些服务器技术,ASP.NET Core 必须满足每个服务器的需求。 使用 Kestrel 等 Web 服务器实现时,ASP.NET Core 可以控制托管在不同服务器技术上的启动过程和环境。

注意:

Kestrel 可以单独使用,也可以与反向代理服务器(如 IIS、Nginx 或 Apache)一起使用。在docker容器中,我们推荐使用Kestrel。

在大部分情况下,我们推荐使用反向代理服务器。主要是有以下好处:

  • 可以限制所承载的应用中的公开的公共外围应用。

  • 可以提供额外的配置和防护层。

  • 可以更好地与现有基础结构集成。

  • 可以简化负载均衡和 SSL 配置。 仅反向代理服务器需要 SSL 证书,并且该服务器可使用普通 HTTP 在内部网络上与应用服务器通信。

说了这么多,总归还是“纸上得来终觉浅,绝知此事要躬行”。我们来一起实践:

首先我们需要安装以下包:

Install-Package Microsoft.AspNetCore.Server.Kestrel -Version 2.1.3

然后就可以编写启动代码:

640?wx_fmt=png

在上面的代码中,我们通过了配置文件来配置Kestrel,我们也推荐大家使用配置文件来配置Kestrel。相关配置Demo如下:

640?wx_fmt=png

当然,我们也可以通过代码来配置kestrel:

640?wx_fmt=png


按环境加载配置

ASP.NET Core 基于使用环境变量的运行时环境配置应用行为。ASP.NET Core 在应用启动时读取环境变量ASPNETCORE_ENVIRONMENT,并将该值存储在 IHostingEnvironment.EnvironmentName 中。 ASPNETCORE_ENVIRONMENT 可设置为任意值,但框架支持三个值:Development、Staging 和 Production。 如果未设置 ASPNETCORE_ENVIRONMENT,则默认为 Production。

注意:

在Docker容器中,我们经常会修改ASPNETCORE_ENVIRONMENT环境变量来模拟开发、测试和生产环境。

因此在代码中,我们可以根据环境变量来启用或关闭相应的功能,其中场景最广泛的一点是——根据不同的环境加载不同的配置。同时,内置的环境变量配置提供程序(EnvironmentVariablesConfigurationProvider)还可以在运行时从环境变量键值对加载配置。具体见以下代码:

640?wx_fmt=png


内置的日志记录提供程序

ASP.NET Core 提供以下内置日志记录提供程序,在很多情况下,对我们会很有帮助:

  • 控制台日志提供程序

  • 调试日志提供程序

  • EventSource日志提供程序

  • EventLog日志提供程序


控制台日志提供程序

在Docker环境下,为了便于排错,我们推荐启用此日志提供程序。在平常的情况下,我们通过控制台运行程序(比如通过dotnet run运行)也会输出控制台日志。在使用之前,需要安装以下包:

Install-Package Microsoft.Extensions.Logging.Console -Version 2.1.1

然后我们可以在代码中通过以下代码启用:

logging.AddConsole();

完整代码如图所示:

640?wx_fmt=png

添加了之后,我们在云端的容器服务的日志中,就可以看到控制台日志了。下面以腾讯云容器服务为例。首先打开腾讯云【容器服务】的【服务】页面,如图所示:

640?wx_fmt=png

我们可以点击【日志】操作按钮的图标来查看日志:

640?wx_fmt=png

我们也可以点击具体的某个实例来查看相关日志,这里就不多写了。

注意:

通过控制台日志,我们可以输出一些启动信息以用来做启动诊断,同时我们也可以根据控制台日志来查看请求状况和运行状况。


调试日志提供程序

和控制台日志一样,也需要安装相关依赖包:

Install-Package Microsoft.Extensions.Logging.Debug -Version 2.1.1

该包使用 System.Diagnostics.Debug 类(Debug.WriteLine 方法调用)来写入日志输出。注意,在 Linux 中,此提供程序将日志写入 /var/log/message

代码启用方式如下所示:

logging.AddDebug();


EventSource日志提供程序

包依赖关系如下:

Install-Package Microsoft.Extensions.Logging.EventSource -Version 2.1.1

该提供程序可实现事件跟踪。不过值得注意的是,该提供程序尚无支持 LinuxmacOS 的事件集合和显示工具。期待官方提供相关工具。

而在windows server,可以通过开源工具https://github.com/Microsoft/perfview来收集和查看日志,如下图所示:

640?wx_fmt=png


EventLog日志提供程序

需要添加包:Microsoft.Extensions.Logging.EventLog。

主要用于向 Windows 事件日志发送日志输出。


关于ASP.NET Core的相关内容,我们先介绍到这里。接下来我们主要是围绕Docker开发工作流程在进行讲解。


搭建并使用Docker

Docker的安装非常简单,我们这里仅以windows 10操作系统(推荐)为例进行讲解。


安装Docker

这里以Docker for windows为例,其他环境请参考官网教程。

注意:

不推荐使用Docker Toolbox,Docker Toolbox适用于较旧的Mac和Windows系统。

要安装 Docker,请先查看用于 Windows 的 Docker:安装须知了解相关信息。

安装须知链接:https://docs.docker.com/docker-for-windows/install/#what-to-know-before-you-install

注意:

使用Docker for windows需要启用Hyper-V功能。以下是系统要求:

  • Windows 10 64位:Pro,Enterprise或Education(Build 14393或更高版本)。

  • 在BIOS中启用虚拟化。通常,默认情况下启用虚拟化。这与启用Hyper-V不同。

  • 支持CPU SLAT的功能。

  • 至少4GB的RAM。

Docker for Windows安装包括:安装提供 Docker Engine,Docker CLI客户端,Docker Compose,Docker Machine和 Kitematic。

安装包下载链接:https://store.docker.com/editions/community/docker-ce-desktop-windows

参考:https://docs.docker.com/docker-for-windows/

安装完后,会提示点击重启电脑。重启后会自动启动Docker程序,如果弹出下图所示提示,则需要在Windows 功能中启用Hyper-V功能和 在BIOS CPU配置中打开 “虚拟化配置”,打开之后,如下图所示,虚拟化会显示已启用。反之安装成功。

640?wx_fmt=png

注意虚拟化已启用,如下图所示(这里秀一把我NB的台式机,是不是比你们的服务器都高端N个档次):

640?wx_fmt=png

以上配置完成后我们推荐将docker容器切换到Linux环境,选择右下角Docker图标右键选择” Switch to Linux containers”进行切换,如果显示” Switch to Windows containers”则已处于Linux容器。

640?wx_fmt=png640?wx_fmt=png



640?wx_fmt=png

这是我们可以测试Docker环境是否正常,打开命令行,输入docker –version:

640?wx_fmt=png

注意:

我们推荐使用Linux容器服务,因为目前主流的容器系统是Linux,并且从资源的利用来说,Linux可以让资源得到更大的利用。

关于docker的安装和配置,这里不再细说,大家可以关注我们的公众号“magiccodes“来查阅相关的教程以及录屏。


配置Docker本地环境

安装完成并且启动后,右下角有个小图标:

640?wx_fmt=png

右键打开设置。

640?wx_fmt=png

Docker for Windows 中的共享驱动器必须配置为支持卷映射和调试。右键单击系统托盘中的 Docker 图标,单击“设置”,然后选择“共享驱动器”。 选择 Docker 存储文件的驱动器。 单击“应用”。

640?wx_fmt=png

其他的配置我们这里就不多说了,具体见公众号“magiccodes”中提供的录屏教程。


运行一个简单的demo

我们先运行官方的Hello world示例:

docker run hello-world

640?wx_fmt=png

我们也可以简单运行一个web示例,比如:

docker run --name aspnetcore_sample --rm -it -p 8000:80 microsoft/dotnet-samples:aspnetapp

640?wx_fmt=png

应用程序启动后,使用浏览器打开http://localhost:8000,即可看到以下界面:

640?wx_fmt=png

Docker的安装和配置在Windows 10操作系统下非常简单,我们也极力推荐大家使用此环境。毕竟,一个好的开发环境可以大大提高大家的使用和开发效率。

前期内容:

Docker最全教程——从理论到实战(一)

Docker最全教程——从理论到实战(二)

长按识别二维码,了解更多精彩内容

640?wx_fmt=gif640?wx_fmt=jpeg640?wx_fmt=gif

如果喜欢作者的文章,请关注“magiccodes”订阅号以便第一时间获得最新内容。本文版权归作者和湖南心莱信息科技有限公司共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。


QQ群:

编程交流群<85318032> 

产品交流群<897857351> 


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

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

相关文章

高并发、低延迟之C#玩转CPU高速缓存(附示例)

写在前面好久没有写博客了&#xff0c;一直在不断地探索响应式DDD&#xff0c;又get到了很多新知识&#xff0c;解惑了很多老问题&#xff0c;最近读了Martin Fowler大师一篇非常精彩的博客The LMAX Architecture&#xff0c;里面有一个术语Mechanical Sympathy&#xff0c;姑且…

RMQ问题:与众不同(st表的高端应用)

解析 预处理 用pre[i]表示以i结尾的最长完美序列起始点&#xff0c;用last[i]表示数字i最后出现的位置 那么可以得到递推式&#xff1a; pre[i]max(pre[i-1],last[x[i]]1);也就是说这个pre要么是受前一位一样的限制&#xff0c;要么是受自己的限制 用f[i]表示以i结尾的最长完…

Docker最全教程——从理论到实战(四)

容器是应用走向云端之后必然的发展趋势&#xff0c;因此笔者非常乐于和大家分享我们这段时间对容器的理解、心得和实践。本篇教程持续编写了2个星期左右并且一直在完善、补充具体的细节和实践&#xff0c;预计全部完成需要1到2个月的时间。由于编写的过程中极其费时&#xff0c…

动态规划:openjudge 2.6-3532 最大上升子序列和 解题心得

传送门 题目描述 一个数的序列bi&#xff0c;当b1 < b2 < … < bS的时候&#xff0c;我们称这个序列是上升的。对于给定的一个序列(a1, a2, …,aN)&#xff0c;我们可以得到一些上升的子序列(ai1, ai2, …, aiK)&#xff0c;这里1 < i1 < i2 < … < iK…

边缘化搭建 DotNet Core 2.1 自动化发布和部署(下)

写在前面本篇文章是上一篇边缘化搭建 DotNet Core 2.1 自动化发布和部署(上)的后续操作&#xff0c;本文主要讲解如何开启Docker Remote API&#xff0c;开启Remote API后的权限安全问题。配置Jenkins构建项目&#xff0c;并在云服务器上构建成功。废话不多说&#xff0c;我们一…

边缘化搭建DotNet Core 2.1 自动化构建和部署环境(上)

写在前面写这篇文章的缘由是由于笔者的对新兴技术方向有所追求&#xff0c;但个人资产有限&#xff0c;只能容许购买一台阿里云低配1核2G服务器。服务器上搭建了 Centos7 & Docker & Jenkins & ASP.NET Core 2.0 自动化发布和部署 环境后牺牲了大部分性能。造成了一…

.NET Core实战项目之CMS 第六章 入门篇-Vue的快速入门及其使用

写在前面上面文章我给大家介绍了Dapper这个ORM框架的简单使用&#xff0c;大伙会用了嘛&#xff01;本来今天这篇文章是要讲Vue的快速入门的&#xff0c;原因是想在后面的文章中使用Vue进行这个CMS系统的后台管理界面的实现。但是奈何Vue实现的SPA有一定的门槛&#xff0c;不太…

不止代码:ybtoj-棋盘分割(二维区间dp)

题目描述 将一个8*8的棋盘进行如下分割&#xff1a;将原棋盘割下一块矩形棋盘并使剩下部分也是矩形&#xff0c;再将剩下的部分继续如此分割&#xff0c;这样割了n-1次后&#xff0c;连同最后剩下的矩形棋盘共有n块矩形棋盘。 (每次切割都只能沿着棋盘格子的边进行) 原棋盘上…

通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span

前言作为.net程序员&#xff0c;使用过指针&#xff0c;写过不安全代码吗&#xff1f;为什么要使用指针&#xff0c;什么时候需要使用它&#xff1f;如果能很好地回答这两个问题&#xff0c;那么就能很好地理解今天了主题了。C#构建了一个托管世界&#xff0c;在这个世界里&…

AC自动机:例题与机制详解

介绍 AC自动机是kmp算法和trie树的结合 大体就是做这样的题用&#xff1a; 可以发现&#xff0c;这题和trie树的区别是把多个单词往一篇文章匹配&#xff0c;而trie恰好相反 匹配的时候其实就是判断子串&#xff0c;所以又用到了kmp 定义失配指针nxt[i]&#xff1a;表示root到…

.NET Core实战项目之CMS 第七章 设计篇-用户权限极简设计全过程

写在前面这篇我们对用户权限进行极简设计并保留其扩展性。首先很感谢大家的阅读&#xff0c;前面六章我带着大家快速入门了ASP.NET Core、ASP.NET Core的启动过程源码解析及配置文件的加载过程源码解析并引入依赖注入的概念、Git的快速入门、Dapper的快速入门、Vue的快速入门。…

2021“MINIEYE杯”中国大学生算法设计超级联赛(5)Random Walk 2(推式子+矩阵逆+矩阵乘)

Random Walk 2 【2.4】Gauss-Jordan消元法求矩阵的逆 高斯消元求矩阵的逆&#xff0c;伴随单位矩阵一起消元即可。 [A,I]→[I,A−1][\text A,\text I]\to [\text I,\text A^{-1}][A,I]→[I,A−1] 移项变形&#xff0c;后就是个矩阵的逆&#xff0c;为啥赛时不写&#xff1f;&a…

参加胶东开发者技术大会有感

2015年的时候&#xff0c;也是在12月&#xff0c;我和Bob(https://www.cnblogs.com/nianming/)去北京参加了“全球架构师峰会”&#xff0c;在那次会议上&#xff0c;来自百度、腾讯、阿里巴巴、京东、美团、新浪微博、Twitter等公司的架构师、技术专家们分享了各自在架构方面的…

专题:数列信息传递问题转化为图论合点问题(ybtoj-数列询问+序列破解)

文章目录前言&#xff1a;一、数列询问&#xff08;取模&#xff09;解析代码二、序列破解&#xff08;奇偶性&#xff09;解析代码thanks for reading&#xff01;前言&#xff1a; 在一个数列a中&#xff0c;对于一个大区间A和组成它的两个小区间a&#xff0c;b&#xff1b;…

Docker最全教程——从理论到实战(五)

在笔者参加腾讯容器服务技术交流会时&#xff0c;我们了解到了藏区牧民的目前的生活艰辛状况&#xff0c;因此除了在同事朋友之间推荐其土特产之外&#xff0c;我们也在此进行初步分享&#xff0c;希望略尽绵薄之力&#xff0c;能够帮助到他们&#xff1a;货真价实、确保都是37…

2021牛客暑期多校训练营6 J-Defend Your Country(无向图点双+思维)

无向图联通分量 点u是割点&#xff0c;当且仅当 特判树根&#xff1a;u为树根&#xff0c;且u有多于1棵子树u不为树根&#xff0c;在递归树上u存在子节点v&#xff0c;满足&#xff1a;dfnu≤lowv\text{dfn}_u\leq \text{low}_vdfnu​≤lowv​ 如上图&#xff0c;v想走到u的组…

不止代码:循环比赛(分治)

循环比赛日程表&#xff08;match&#xff09; 【问题描述】 解析 dfs或分治 分治可以不断递归4个小正方形 左上右下为前一半&#xff0c;左下右上后一半 dfs就很无脑了 代码 #include<cstdio> #include<cstring> #include<algorithm> #include<cmath…

前瞻科技,引领未来!Microsoft Connect(); 2018即将重磅来袭!

怎么用一句话点燃全球的开发者&#xff1f;——Microsoft Connect(); 2018即将重磅来袭&#xff01;每一个观点都能引发科技狂潮&#xff0c;每一项技术都将提速技术进程&#xff0c;由微软举办的 Microsoft Connect(); 2018 即将在太平洋时间12月4日8:30拉开帷幕&#xff01;大…

P5048-[Ynoi2019 模拟赛]Yuno loves sqrt technology III【分块】

正题 题目链接:https://www.luogu.com.cn/problem/P5048 题目大意 就是这个 【QA】区间众数&#xff0c;但空间很小 长度为nnn的序列&#xff0c;要求支持查找区间众数出现次数。 强制在线 1≤n,m≤51051\leq n,m\leq 5\times 10^51≤n,m≤5105 解题思路 空间小就不能用蒲公…

通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)

前言读完上篇《通俗易懂&#xff0c;C#如何安全、高效地玩转任何种类的内存之Span(一)》&#xff0c;相信大家对span的本质应该非常清楚了。含着金钥匙出生的它&#xff0c;从小就被寄予厚望要成为.NET下编写高性能应用程序的重要积木&#xff0c;而且很多老前辈为了接纳它&…