在本文中,咱们将介绍如何将 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 应用程序在容器中进行开发。