某一刻,你已經把 .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 這類做爲基礎鏡像。