在本文中,咱們將介紹如何將 Blazor 應用程序放入Jexus 容器以進行開發和部署。咱們將使用 .NET Core CLI,所以不管平臺如何,使用的命令都將是相同的。css
Blazor 託管模型html
Blazor 有兩個託管模型,它們的要求不一樣,本文主要基於WebAssembly模型介紹容器化。git
WebAssembly 託管模型的目標是在瀏覽器中託管整個應用程序。Blazor WebAssembly 應用程序中的項目包括 HTML、JavaScript、.NET 運行時版本和二進制文件。它們都在瀏覽器中運行,所以您能夠將它託管爲靜態網站。不須要服務器運行時或解釋器。github
Blazor WebAssembly 仍處於預覽模式,是最後一個預覽版,5.19 將正式發佈,所以您必須手動安裝模板才能建立 Blazor WebAssembly 應用程序。web
dotnet new -i Microsoft.AspNetCore.Components.WebAssembly.Templates::3.2.0-rc1.20223.4docker
如今,您已經安裝了模板,您可使用如下 .NET CLI 命令建立新的 Web 組裝應用程序:瀏覽器
dotnet new blazorwasm -o wasmtest安全
這將建立一個新的 Blazor WebAssembly 應用程序,名稱爲"wasmtest"。您能夠將"wasmtest" 更改成項目名稱。服務器
生成並測試應用後,便可發佈應用。運行點網發佈命令:負載均衡
dotnet publish -c Release
你會看到以下輸出:
PS C:\workshop\idt2019\wasmtest> dotnet publish -c Release -o publish
用於 .NET Core 的 Microsoft (R) 生成引擎版本 16.5.0+d4cbfca49
版權全部(C) Microsoft Corporation。保留全部權利。
C:\workshop\idt2019\wasmtest\wasmtest.csproj 的還原在 93.3 ms 內完成。
wasmtest -> C:\workshop\idt2019\wasmtest\bin\Release\netstandard2.1\wasmtest.dll
wasmtest (Blazor output) -> C:\workshop\idt2019\wasmtest\bin\Release\netstandard2.1\wwwroot
wasmtest -> C:\workshop\idt2019\wasmtest\publish\
在這裏,你能夠看到咱們的程序的文件都發布到了路徑C:\workshop\idt2019\wasmtest\publish\, 咱們的全部成果輸出都是靜態文件,都放在文件夾wwwroot 目錄下:
PS C:\workshop\idt2019\wasmtest\publish> ls wwwroot
目錄: C:\workshop\idt2019\wasmtest\publish\wwwroot
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2020/5/4 12:38 css
d----- 2020/5/4 12:38 sample-data
d----- 2020/5/4 12:38 _framework
-a---- 2020/5/4 12:34 32038 favicon.ico
-a---- 2020/5/4 12:34 651 index.html
能夠從任何靜態web 站點上運行這個文件,咱們就使用一個Jexus 容器來運行blazor 應用。Jexus 是一款國產的 Linux 平臺上的高性能WEB服務器 和負載均衡網關,以支持 ASP.NET、 ASP.NET CORE、 PHP 爲特點, 同時具有反向代理、 入侵 檢測等重要功能。 能夠這樣說, Jexus是 .NET、 .NET CORE 跨平臺的最優秀的宿主服務器,如 果咱們認爲它是 Linux平臺 的 IIS ,這並不爲過,由於, Jexus 不但很是快,並且擁有 IIS 和 其它 Web 服務器所不具有的高度的安全性,這是政府機構和重要企業對web服務器最必要也是最重要的 品質需求。張志敏同窗在維護這個Jexus鏡像,獲得了Jexus做者宇內流雲的承認, Docker Hub 地址: https://hub.docker.com/r/beginor/jexus-x64。
咱們來建立一個Jexus 託管靜態網站的配置wasmtest:
######################
# Web Site: wasmtest.csharpkit.com
########################################
port=80
root=/ /var/www/wasmtest/
hosts= wasmtest.csharpkit.com
NoFile=/index.html
UseGZIP=true
建立一個容器打包鏡像的Dockerfile:
FROM beginor/jexus-x64:6.2.1.12
COPY ./jexus/wasmtest /usr/jexus/siteconf/wasmtest
COPY ./publish/wwwroot /var/www/wasmtest
CMD [ "jws", "start"]
此文件將拉下jexus 鏡像,而後將jexus網站的配置文件複製到容器文件系統中的(默認的jexus 配置文件夾)。它將在每次生成鏡像時執行此操做,所以若是你須要對項目進行更改,則須要從新生成鏡像。
這就是咱們須要啓動和運行Blazor WebAssembly靜態文件所需的之前,如今咱們就來建立一個鏡像:
docker build –f ./Dockfile –t geffzhang/wasmtest:lastest .
PS C:\workshop\idt2019\wasmtest> docker build -f .\Dockerfile -t geffzhang/wasmtest:lastest .
Sending build context to Docker daemon 29.42MB
Step 1/4 : FROM beginor/jexus-x64:6.2.1.12
6.2.1.12: Pulling from beginor/jexus-x64
68ced04f60ab: Already exists 08da89b1ce63: Pull complete e1c7e1fba2a2: Pull complete 7bb8aca5914e: Pull complete Digest: sha256:385f8a80d06dc25cc72e072e57983316c7c4faa5e793825fc3bea3fe09701e0c
Status: Downloaded newer image for beginor/jexus-x64:6.2.1.12
---> d2b984e7898c
Step 2/4 : COPY ./jexus/wasmtest /usr/jexus/siteconf/wasmtest
---> 1ffe6bdc10de
Step 3/4 : COPY ./publish/wwwroot /var/www/wasmtest
---> a60b338191aa
Step 4/4 : CMD [ "jws", "start"]
---> Running in da8c19f7849b
Removing intermediate container da8c19f7849b
---> a04cf465b883
Successfully built a04cf465b883
Successfully tagged geffzhang/wasmtest:lastest
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.
咱們能夠運行它:
docker run –name wasm1 –p 80:80 –d geffzhang/wasmtest:lastest
PS C:\workshop\idt2019\wasmtest> docker run --name wasm1 -p 80:80 -d geffzhang/wasmtest:lastest
101ecc49b5913d69300a7554022ecef681760922640fc39faf6195d69e04bb56
這將容器做爲守護進程運行,所以他將可以持續運行,直到你中止它。如今咱們有了一個靜態的Jexus 服務器在端口80上運行應用程序。你能夠經過瀏覽器上看到它:
在生產環境中,咱們能夠經過Jexus配置更多的操做,上面這些步驟是託管你的Blazor WebAssembly 應用程序在容器中進行開發。