Docker和ASP.NET Core

Docker和ASP.NET Core

Docker 正在逐漸成爲容器行業的事實標準,受到 Windows 和 Linux 生態系統領域最重要供應商的支持。 (Microsoft 是支持 Docker 的主要雲供應商之一。)如今,Docker 基本上已經在各大雲或本地的任何數據中心普及了。html

如何將.NET程序託管到Docker之中,相信這是廣大.NET開發者的一個疑問。事實上,.NET Framework 支持在Docker中運行,可是僅能在windows 容器中運行,這並不符合咱們的預期,所以,本篇咱們只側重於討論ASP.NET Core和Docker。前端

在使用以前,筆者仍是有必要介紹下ASP.NET Core。若是您對此很是熟悉和了解或者對此節不感興趣,能夠跳過本節。node

 

ASP.NET Core簡介

ASP.NET Core是一個跨平臺的高性能開源框架,用於生成基於雲且鏈接 Internet 的新式應用程序。使用 ASP.NET Core,咱們能夠:nginx

  • 建置 Web 應用程序和服務、IoT 應用和移動後端。git

  • 可以在 Windows、macOS 和 Linux 上進行開發和運行。部署到雲或本地。github

  • 在 .NET Core 或 .NET Framework 上運行。web

  • 可以在 IIS、Nginx、Apache、Docker 上進行託管或在本身的進程中進行自託管咱們的應用。docker

 

 

性能是.NET Core的一個關鍵特性,這裏有必要介紹下。在這塊,咱們摘取了一份社區的測試彙總統計,僅供參考:編程

 

具體過程你們能夠訪問此連接來查看詳情: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 應用的鏡像。

 

例如.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

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();

 

EventSource日誌提供程序

包依賴關係以下:

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

該提供程序可實現事件跟蹤。不過值得注意的是,該提供程序尚無支持 Linux 或 macOS 的事件集合和顯示工具。期待官方提供相關工具。

而在windows server,能夠經過開源工具https://github.com/Microsoft/perfview來收集和查看日誌,以下圖所示:

 

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配置中打開 「虛擬化配置」,打開以後,以下圖所示,虛擬化會顯示已啓用。反之安裝成功。

注意虛擬化已啓用,以下圖所示(這裏秀一把我NB的臺式機,是否是比大家的服務器都高端N個檔次):

以上配置完成後咱們推薦將docker容器切換到Linux環境,選擇右下角Docker圖標右鍵選擇」 Switch to Linux containers」進行切換,若是顯示」 Switch to Windows containers」則已處於Linux容器。

這是咱們能夠測試Docker環境是否正常,打開命令行,輸入docker –version:

注意:

咱們推薦使用Linux容器服務,由於目前主流的容器系統是Linux,而且從資源的利用來講,Linux可讓資源獲得更大的利用。

 

關於docker的安裝和配置,這裏再也不細說,你們能夠關注咱們的公衆號「magiccodes「來查閱相關的教程以及錄屏。

 

配置Docker本地環境

安裝完成而且啓動後,右下角有個小圖標:

右鍵打開設置。

Docker for Windows 中的共享驅動器必須配置爲支持卷映射和調試。右鍵單擊系統托盤中的 Docker 圖標,單擊「設置」,而後選擇「共享驅動器」。 選擇 Docker 存儲文件的驅動器。 單擊「應用」。

其餘的配置咱們這裏就很少說了,具體見公衆號「magiccodes」中提供的錄屏教程。

 

運行一個簡單的demo

咱們先運行官方的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操做系統下很是簡單,咱們也極力推薦你們使用此環境。畢竟,一個好的開發環境能夠大大提升你們的使用和開發效率。

 

做者: 雪雁
出處: http://www.cnblogs.com/codelove/ 
溝通渠道:編程交流羣<85318032> 產品交流羣<897857351> 
若是喜歡做者的文章,請關注【麥扣聊技術】訂閱號以便第一時間得到最新內容。本文版權歸做者和湖南心萊信息科技有限公司共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。
靜聽鳥語花香,漫賞雲捲雲舒。 
 
標籤:  DockerASP.NET Core編程教程軟件
相關文章
相關標籤/搜索