正如
前文提到的,強烈推薦在生產環境中使用反向代理伺服器轉發請求到Kestrel Http伺服器,本文將會實踐將Nginx —>ASP.NET Core 部署架構容器化的過程。
Nginx->ASP.NET Coe部署架構容器化
在Docker中部署Nginx—>ASP.NETCore 有兩種選擇, 第一種是在單容器內部署Nginx+ASP.NET Core, 這是本文著重要講述的,另外一種是以獨立容器分別部署Nginx和ASP.NET Core,容器之間透過Docker內建的network bridge完成通訊(請關註後續博文)。
本次實踐將會使用.NET Core CLI 建立預設的web應用
|
之後將專案釋出到指定目錄(dotnet publish), 釋出產生的檔案將會用於映象打包。
構建映象
本次將以 ASP.NETCore Runtime Image【mcr.microsoft.com/dotnet/core/aspnet:2.2】 作為基礎映象, 該映象包含.NET Core Runtime、ASP.NET Core框架元件、依賴項, 該映象為生產部署做了一些最佳化。
坑1:本次部署的是web app,不要使用【mcr.microsoft.com/dotnet/core/runtime:2.2】作為基礎映象,啟動容器會報錯:
It was not possible to find any compatible framework version
The specified framework ‘Microsoft.AspNetCore.App’, version ‘2.2.0’ was not found.
– Check application dependencies and target a framework version installed at:
– Installing .NET Core prerequisites might help resolve this problem:
https://go.microsoft.com/fwlink/?LinkID=798306&clcid;=0x409
– The .NET Core framework and SDK can be installed from:
https://aka.ms/dotnet-download
因為該基礎映象不包含ASP.NET Core框架元件。
本次Dokefile的定義將會包含nginx,在容器內啟用Nginx標準配置代理請求到Kestrel:
|
Line 1 指定基礎映象
Line 3-4 從Debian package management store安裝Nginx
Line 6-7 設定工作目錄,放置ASP.NET Core WebApp部署包
Line 9-10 設定啟動指令碼
Line 12-13 設定nginx配置檔案
Line 15-16 設定ASP.NETCore Kestrel在5000埠上監聽, 暴露5000,80 埠給容器外部
Line 18 稍後給出啟動指令碼
tip: 需要理解容器內是一個獨立的linux環境,Dockfile中EXPOSE用於指示容器打算暴露的埠。
這裡可只暴露80埠給外部,但是必須給ASPNETCORE_URLS定義一個非80埠,作為容器內kestrel監聽埠。
最終(tree -L 1)輸出的app目錄結構如下
|
Nginx配置
建立以上Dockerfile中需要的nginx配置檔案,在同一目錄,vim nginx.conf 建立檔案:
|
Line 8-10 定義一組伺服器(這裡只有webapp), 資源名稱(app_servers)可用在本檔案任意位置。
Line 13 通知Nginx在80埠監聽
Line 15-22 指示所有的請求都需要被代理到app_servers
總之,這個檔案定義了Nginx在80埠監聽外部請求,並將請求轉發給同一容器的5000埠。
啟動指令碼
對於Docker容器,只能使用一個CMD(或ENTRYPOINT定義),但是這種反向代理配置需要啟動Nginx和Kestrel, 所以我們定義一個指令碼去完成這兩個任務
|
構建映象
docker build -t example/hello-nginx .
該映象名稱為 example/hello-nginx 觀察輸出,會看到Dockerfile 中定義的每一步輸出。
該映象構建Dockerfile與vs docker tool生成的dockerfile進行對比,該檔案生成的映象更小,充分利用了映象分層的理念。
執行映象
docker run –name test -it -d -p 8080:80 example/test
該容器名稱為test, 現在可從 http://localhost:8080 埠訪問webapp, 透過curl -s -D – localhost:8080 -o /dev/null 驗證
透過shell終端進入容器內部, 可進一步分別探究Nginx和Kestrel服務:
docker exec -it test bash
|
tip:對於正在執行的容器,可使用docker exec -it [container_id] [command] 進入容器內部探究容器
對於啟動失敗的容器,可使用docker logs [container_id] 檢視容器輸出日誌
瞭解一下docker的網路基礎知識:
當Docker守護行程以其預設的配置引數在宿主機啟動時,會建立一個名為docker0的Linux網橋裝置, 該網橋會自動分配滿足標準的私有IP段的隨機IP直至和子網, 該子網決定了所有新建立容器將被分配的容器IP地址所屬網段。
可使用 docker inspect [container_id] 檢視network部分配置:
|
其中列出的NetworkID 正是 docker network ls 名為bridge的網橋, 這便是預設建立的docker0 網橋(docker inspect networkid 可繼續探究)。
正如上面所說,ASP.NET Core有兩種容器化反向代理部署架構,後續將會實踐以獨立容器分別部署Nginx、ASP.NET Core。
朋友會在“發現-看一看”看到你“在看”的內容