某一刻,你已经把 .Net Core 的程序写好了。接下来,还能够作什么呢?那就是部署了。linux
做为一名开发工程师,若是不会部署本身开发的应用,那么这也是不完整的。接下来,咱们就来讲说,如何部署咱们的 .Net Core 应用程序(主要是 Asp.Net Core 应用)。git
对于虚拟机中执行的语言来讲,大都会有 SDK(Software Development Kit) 以及 XRE(X Runtime Environment)。对于 C#来讲,也不例外。在 C#中,这二者的区别在于:github
既然要部署 Asp.Net Core,天然离不开 Runtime(若是装 SDK 也能跑,不过不推荐在运行环境装 SDK)。如下的部署方式的前提都是已经安装 Runtime 环境。docker
下载地址:https://dotnet.microsoft.com/downloadwindows
Asp.Net Core 程序在发布后,会产生一个入口 dll 文件,要运行该程序,只须要经过 dotnet 命令执行该 dll 文件。因此,第一种方式就是直接找到 dll 文件,并使用 dotnet 命令来运行。(你说 dotnet 命令哪来的?安装了 Runtime 就有了。)浏览器
# 进行控制台执行 dotnet xxx.dll
优点:bash
缺陷:服务器
用 .Net Framework 开发的应用,你们都比较熟悉用 IIS 来部署。那 .Net Core 呢?虽然二者的运行模式并不相同,但微软为了减小迁移难度,天然也提供了用 IIS 的部署方法。app
与 Asp.Net 不一样,ASP.NET Core 再也不是由 IIS 工做进程(w3wp.exe)托管,而是使用自托管 Web 服务器(Kestrel)运行,IIS 则是做为反向代理的角色转发请求到 Kestrel 不一样端口的 ASP.NET Core 程序中,随后就将接收到的请求推送至中间件管道中去,处理完你的请求和相关业务逻辑以后再将 HTTP 响应数据从新回写到 IIS 中,最终转达到不一样的客户端(浏览器,APP,客户端等)。asp.net
若是要使用 IIS 部署 Asp.Net Core 程序,步骤以下:
iisreset
)无托管代码
,如图:优点:
劣势:
了解更多,请参考:IIS 部署.Net Core 应用
在 2.2 的部署方式中,较大的缺陷就是性能损失。那么,有没有什么办法可以能够避开这个问题呢?。答案就是 Windows Service,经过 Windows Service,咱们可以解决 2.1 中的开机启动和持久运行问题,也能避开 2.2 中的性能损失。具体如何作呢?以下提供一种方式(固然,也能够用其余方式来部署 Windows Service):
优点:
劣势:
因为 .Net Core 天生支持跨平台,若是在廉价又稳定的 Linux 上部署 .Net Core 程序逐渐成为主流。对于 Linux 上的部署,和 Windows 上并无什么区别。首先是安装 Runtime 环境,而后拷贝程序,并经过命令行运行。
再进一步,可使用后台模式,让程序在后台运行。
更进一步,也能够效仿 Windows,把程序启动管理做为一个服务,来达到开机启动和灵活管理的目的。
做为当前我的认为的最棒的 .Net Core 应用部署方式,建议你们都了解下。
首先,是 Docker 的基本使用:
docker build
构建镜像docker run
建立容器并运行好,咱们来依次说明,对于 Docker 来讲,须要先安装 Docker 环境。
接着,咱们假设发布包路径以下:
root-folder/ app/ # 发布包目录 xxx.dll # 程序入口点 Dockerfile # Dockerfile文件
而后针对该程序,编写以下 Dockerfile:
# 根镜像 FROM microsoft/dotnet:2.2-runtime # 拷贝程序发布包 COPY app /app # 设置工做目录 WORKDIR /app # 导出的端口 EXPOST 80 # 程序运行命令 CMD ["dotnet", "xxx.dll"]
接下来,经过在 root-folder
中执行 docker build -t xxx:0.0.1 .
来构建一个镜像。
接着,再经过 docker run -it -p 8000:80 --name xxx-demo xxx:0.0.1
来建立并运行容器。
这样,就能够经过 http://localhost:8000
来访问到你的应用程序了。
此处只是大概写下 Docker 部署的步骤,抛砖引玉。真正须要将其用于产线,还须要去学习下足够的 Docker 知识。
额外提一下,如何选择基础镜像
对于 .Net Core 来讲,通常有以下几类基础镜像:
综上,我我的推荐你们选择 runtime 这类做为基础镜像。