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 側重於提供瞭如下主要方案:
- 用於開發和生成 .NET Core 應用的鏡像。
- 用於運行 .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操做系統下很是簡單,咱們也極力推薦你們使用此環境。畢竟,一個好的開發環境能夠大大提升你們的使用和開發效率。