上篇内容连接: https://www.cnblogs.com/codelove/p/10030439.htmlhtml
Docker 正在逐渐成为容器行业的事实标准,受到 Windows 和 Linux 生态系统领域最重要供应商的支持。 (Microsoft 是支持 Docker 的主要云供应商之一。)如今,Docker 基本上已经在各大云或本地的任何数据中心普及了。前端
如何将.NET程序托管到Docker之中,相信这是广大.NET开发者的一个疑问。事实上,.NET Framework 支持在Docker中运行,可是仅能在windows 容器中运行,这并不符合咱们的预期,所以,本篇咱们只侧重于讨论ASP.NET Core和Docker。node
在使用以前,笔者仍是有必要介绍下ASP.NET Core。若是您对此很是熟悉和了解或者对此节不感兴趣,能够跳过本节。nginx
ASP.NET Core是一个跨平台的高性能开源框架,用于生成基于云且链接 Internet 的新式应用程序。使用 ASP.NET Core,咱们能够:git
建置 Web 应用程序和服务、IoT 应用和移动后端。github
可以在 Windows、macOS 和 Linux 上进行开发和运行。部署到云或本地。web
在 .NET Core 或 .NET Framework 上运行。docker
可以在 IIS、Nginx、Apache、Docker 上进行托管或在本身的进程中进行自托管咱们的应用。小程序
性能是.NET Core的一个关键特性,这里有必要介绍下。在这块,咱们摘取了一份社区的测试汇总统计,仅供参考:windows
具体过程你们能够访问此连接来查看详情:https://www.cnblogs.com/savorboard/archive/2016/10/17/dotnet-benchmarks.html
刚才说了这么多,咱们回到主题。.NET Core天生就为跨平台设计,而且和Docker搭配很是友好,并且微软官方在这块提供了不少支持。好比说:
接下来,咱们一块儿来了解官方镜像。ASP.NET Core的官方镜像名称为microsoft/aspnetcore,微软针对Docker上的 ASP.NET Core 应用进行了优化,所以容器能够更快启动。为开发人员生成Docker镜像时,Microsoft 侧重于提供了如下主要方案:
例如.NET Core 2.1,官方提供的镜像:
为何是多个镜像?由于在开发、生成和运行容器化应用程序时,一般具备不一样的优先级。 经过为这些单独的任务提供不一样的镜像,有助于独立优化开发、生成和部署应用程序的过程。在开发期间,咱们侧重的是开发更改的速度以及调试的能力。在生产环境,咱们侧重的是应用部署和容器启动的速度和效率。
这里咱们顺便提下咱们基于.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压缩。
咱们回过来继续。.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。
注意:
.NET Framework也可使用Docker进行托管,不过仅能托管到windows容器之中。
在具体应用和实践以前,咱们有必要了解如下内容。
Kestrel是一个基于libuv的跨平台ASP.NET Core web服务器,libuv是一个跨平台的异步I/O库。ASP.NET Core模板项目使用Kestrel做为默认的web服务器。
Kestrel支持如下功能:
HTTPS
用于启用不透明升级的WebSockets
位于Nginx以后的高性能Unix sockets
Kestrel 被.NET Core支持的全部平台和版本所支持。Kestrel 能够单独使用,也能够与反向代理服务器(如 IIS、Nginx 或 Apache)一块儿使用。 反向代理服务器接收到来自 Internet 的 HTTP 请求,并在进行一些初步处理后将这些请求转发到 Kestrel。
在没有 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
而后就能够编写启动代码:
在上面的代码中,咱们经过了配置文件来配置Kestrel,咱们也推荐你们使用配置文件来配置Kestrel。相关配置Demo以下:
固然,咱们也能够经过代码来配置kestrel:
ASP.NET Core 基于使用环境变量的运行时环境配置应用行为。ASP.NET Core 在应用启动时读取环境变量ASPNETCORE_ENVIRONMENT,并将该值存储在 IHostingEnvironment.EnvironmentName 中。 ASPNETCORE_ENVIRONMENT 可设置为任意值,但框架支持三个值:Development、Staging 和 Production。 若是未设置 ASPNETCORE_ENVIRONMENT,则默认为 Production。
注意:
在Docker容器中,咱们常常会修改ASPNETCORE_ENVIRONMENT环境变量来模拟开发、测试和生产环境。
所以在代码中,咱们能够根据环境变量来启用或关闭相应的功能,其中场景最普遍的一点是——根据不一样的环境加载不一样的配置。同时,内置的环境变量配置提供程序(EnvironmentVariablesConfigurationProvider)还能够在运行时从环境变量键值对加载配置。具体见如下代码:
ASP.NET Core 提供如下内置日志记录提供程序,在不少状况下,对咱们会颇有帮助:
控制台日志提供程序
调试日志提供程序
EventSource日志提供程序
EventLog日志提供程序
在Docker环境下,为了便于排错,咱们推荐启用此日志提供程序。在日常的状况下,咱们经过控制台运行程序(好比经过dotnet run运行)也会输出控制台日志。在使用以前,须要安装如下包:
Install-Package Microsoft.Extensions.Logging.Console -Version 2.1.1
而后咱们能够在代码中经过如下代码启用:
logging.AddConsole();
完整代码如图所示:
添加了以后,咱们在云端的容器服务的日志中,就能够看到控制台日志了。下面以腾讯云容器服务为例。首先打开腾讯云【容器服务】的【服务】页面,如图所示:
咱们能够点击【日志】操做按钮的图标来查看日志:
咱们也能够点击具体的某个实例来查看相关日志,这里就很少写了。
注意:
经过控制台日志,咱们能够输出一些启动信息以用来作启动诊断,同时咱们也能够根据控制台日志来查看请求情况和运行情况。
和控制台日志同样,也须要安装相关依赖包:
Install-Package Microsoft.Extensions.Logging.Debug -Version 2.1.1
该包使用 System.Diagnostics.Debug 类(Debug.WriteLine 方法调用)来写入日志输出。注意,在 Linux 中,此提供程序将日志写入 /var/log/message。
代码启用方式以下所示:
logging.AddDebug();
包依赖关系以下:
Install-Package Microsoft.Extensions.Logging.EventSource -Version 2.1.1
该提供程序可实现事件跟踪。不过值得注意的是,该提供程序尚无支持 Linux 或 macOS 的事件集合和显示工具。期待官方提供相关工具。
而在windows server,能够经过开源工具https://github.com/Microsoft/perfview来收集和查看日志,以下图所示:
须要添加包:Microsoft.Extensions.Logging.EventLog。
主要用于向 Windows 事件日志发送日志输出。
关于ASP.NET Core的相关内容,咱们先介绍到这里。接下来咱们主要是围绕Docker开发工做流程在进行讲解。
Docker的安装很是简单,咱们这里仅以windows 10操做系统(推荐)为例进行讲解。
这里以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配置中打开 “虚拟化配置”,打开以后,以下图所示,虚拟化会显示已启用。反之安装成功。
注意虚拟化已启用,以下图所示(这里秀一把我NB的台式机,是否是比大家的服务器都高端N个档次):
以上配置完成后咱们推荐将docker容器切换到Linux环境,选择右下角Docker图标右键选择” Switch to Linux containers”进行切换,若是显示” Switch to Windows containers”则已处于Linux容器。
这是咱们能够测试Docker环境是否正常,打开命令行,输入docker –version:
注意:
咱们推荐使用Linux容器服务,由于目前主流的容器系统是Linux,而且从资源的利用来讲,Linux可让资源获得更大的利用。
关于docker的安装和配置,这里再也不细说,你们能够关注咱们的公众号“magiccodes“来查阅相关的教程以及录屏。
安装完成而且启动后,右下角有个小图标:
右键打开设置。
Docker for Windows 中的共享驱动器必须配置为支持卷映射和调试。右键单击系统托盘中的 Docker 图标,单击“设置”,而后选择“共享驱动器”。 选择 Docker 存储文件的驱动器。 单击“应用”。
其余的配置咱们这里就很少说了,具体见公众号“magiccodes”中提供的录屏教程。
咱们先运行官方的Hello world示例:
docker run hello-world
咱们也能够简单运行一个web示例,好比:
docker run --name aspnetcore_sample --rm -it -p 8000:80 microsoft/dotnet-samples:aspnetapp
应用程序启动后,使用浏览器打开http://localhost:8000,便可看到如下界面:
Docker的安装和配置在Windows 10操做系统下很是简单,咱们也极力推荐你们使用此环境。毕竟,一个好的开发环境能够大大提升你们的使用和开发效率。