在 RHEL 8 中使用 .NET
使开源包含更多
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息。
对红帽文档提供反馈
我们感谢您对文档提供反馈信息。请让我们了解如何改进文档。要做到这一点:
关于特定内容的简单评论:
- 请确定您使用 Multi-page HTML 格式查看文档。另外,确定 Feedback 按钮出现在文档页的右上方。
- 用鼠标指针高亮显示您想评论的文本部分。
- 点在高亮文本上弹出的 Add Feedback。
- 按照显示的步骤操作。
要提交更复杂的反馈,请创建一个 Bugzilla ticket:
- 进入 Bugzilla 网站。
- 在 Component 中选择 Documentation。
- 在 Description 中输入您要提供的信息。包括文档相关部分的链接。
- 点 Submit Bug。
第 1 章 .NET 6.0 简介
.NET 是一个通用开发平台,它带有自动内存管理和现代编程语言。使用 .NET,您可以有效地构建高质量的应用程序。.NET 通过认证的容器在 Red Hat Enterprise Linux (RHEL)和 OpenShift Container Platform 上提供。
.NET 提供以下功能:
- 遵循基于微服务的方法,其中一些组件使用 .NET 和其他 Java 构建,但所有组件都可以在 RHEL 和 OpenShift Container Platform 上的通用支持平台上运行。
- 在 Microsoft Windows 上更轻松地开发新的 .NET 工作负载的容量。您可以在 RHEL 或 Windows Server 上部署并运行应用程序。
- 一个异构的数据中心,底层基础结构可以在不需要依赖 Windows 服务器的情况下运行 .NET 应用程序。
RHEL 7、RHEL 8、RHEL 9 和 OpenShift Container Platform 版本 3.11 及更新的版本支持 .NET 6.0。
第 2 章 安装 .NET 6.0
.NET 6.0 包括在 RHEL 8 的 AppStream 软件仓库中。AppStream 软件仓库在 RHEL 8 系统中默认启用。
您可以使用最新的 6.0 软件开发套件(SDK)安装 .NET 6.0 运行时。当一个较新的 SDK 变为 .NET 6.0 时,您可以通过运行 sudo yum install
来安装它。
先决条件
安装并注册了附加订阅的 RHEL 8。
如需更多信息,请参阅 执行标准的 RHEL 安装。
步骤
安装 .NET 6.0 及其所有依赖项:
$ sudo yum install dotnet-sdk-6.0 -y
验证步骤
验证安装:
$ dotnet --info
输出会返回有关 .NET 安装和环境的相关信息。
第 3 章 使用 .NET 6.0 创建应用程序
了解如何创建 C# hello-world
应用程序。
步骤
在名为
my-app
的目录中创建一个新的 Console 应用程序:$ dotnet new console --output my-app
输出返回:
The template "Console Application" was created successfully. Processing post-creation actions... Running 'dotnet restore' on my-app/my-app.csproj... Determining projects to restore... Restored /home/username/my-app/my-app.csproj (in 67 ms). Restore succeeded.
从模板创建一个简单的
Hello World
控制台应用。应用程序存储在指定的my-app
目录中。
验证步骤
运行项目:
$ dotnet run --project my-app
输出返回:
Hello World!
第 4 章 使用 .NET 6.0 发布应用程序
.NET 6.0 应用程序可以发布为使用共享的系统范围 .NET 版本,或包括 .NET。
发布 .NET 6.0 应用程序的方法存在以下方法:
- 单文件应用程序 - 应用程序自包含,可以部署为单个可执行文件,且所有依赖文件包含在单个二进制文件中。
- 框架独立部署(FDD)- 应用程序使用共享的系统范围 .NET 版本。
为 RHEL 发布应用程序时,红帽建议使用 FDD,因为它确保应用程序使用最新的 .NET 版本(由红帽构建),该版本使用一组原生依赖项。
- 自包含的部署(SCD)- 应用程序包括 .NET。此方法使用 Microsoft 构建的运行时。
IBM Z 和 LinuxONE 不提供 SCD。
先决条件
现有 .NET 应用程序。
有关如何创建 .NET 应用程序的更多信息,请参阅使用 .NET 创建应用程序。
4.1. 发布 .NET 应用程序
以下流程概述了如何发布独立于框架的应用程序。
步骤
发布独立于框架的应用程序:
$ dotnet publish my-app -f net6.0 -c Release
将 my-app 替换为您要发布的应用程序的名称。
可选: 如果应用程序仅用于 RHEL,请修剪其他平台所需的依赖项:
$ dotnet publish my-app -f net6.0 -c Release -r rhel.8-architecture --self-contained false
根据您要使用的平台替换 构架 :
-
对于 Intel:
x64
-
对于 IBM Z 和 LinuxONE:
s390x
-
对于 64 位 Arm:
arm64
-
对于 Intel:
第 5 章 在容器中运行 .NET 6.0 应用程序
使用 ubi8/dotnet-60-runtime
镜像在 Linux 容器内运行预编译的应用程序。
先决条件
预配置的容器。
以下示例使用 podman。
步骤
可选: 如果您位于另一个项目的目录中,且不想创建嵌套项目,请返回到项目的父目录:
# cd ..
在名为
mvc_runtime_example
的目录中创建一个新的 MVC 项目:$ dotnet new mvc --output mvc_runtime_example
发布项目:
$ dotnet publish mvc_runtime_example -f net6.0 -c Release
创建
Dockerfile
:$ cat > Dockerfile <<EOF FROM registry.access.redhat.com/ubi8/dotnet-60-runtime ADD bin/Release/net6.0/publish/ . CMD ["dotnet", "mvc_runtime_example.dll"] EOF
构建镜像:
$ podman build -t dotnet-60-runtime-example .
运行您的镜像:
$ podman run -d -p8080:8080 dotnet-60-runtime-example
验证步骤
查看在容器中运行的应用程序:
$ xdg-open http://127.0.0.1:8080
第 6 章 在 OpenShift Container Platform 中使用 .NET 6.0
6.1. 概述
NET 镜像通过从 s2i-dotnetcore 导入镜像流定义来添加到 OpenShift 中。
镜像流定义包括 dotnet
镜像流,其中包含用于不同支持的 .NET 版本的 sdk 镜像。.NET 生命周期 提供了支持版本的最新概述。
Version | 标签 | Alias |
---|---|---|
.NET Core 3.1 | dotnet:3.1-el7 | dotnet:3.1 |
dotnet:3.1-ubi8 | ||
.NET 5 | dotnet:5.0-ubi8 | dotnet:5.0 |
.NET 6 | dotnet:6.0-ubi8 | dotnet:6.0 |
sdk 镜像具有对应的运行时镜像,它们在 dotnet-runtime
镜像流下定义。
容器镜像可在不同版本的 Red Hat Enterprise Linux 和 OpenShift 中工作。
基于 RHEL7-based (suffix -el7)托管在 registry.redhat.io
镜像存储库上。需要身份验证才能拉取这些镜像。这些凭据是通过向 OpenShift 命名空间添加 pull secret 来配置的。
基于 UBI-8 的镜像(suffix -ubi8)托管在 registry.access.redhat.com
上,不需要身份验证。
6.2. 安装 .NET 镜像流
要安装 .NET 镜像流,请使用带有 OpenShift Client (oc
)二进制文件的 s2i-dotnetcore 中的镜像流定义。镜像流可以从 Linux、Mac 和 Windows 安装。脚本可让您安装、更新或删除镜像流。
您可以在全局 openshift
命名空间中或本地定义 .NET 镜像流。更新 openshift
命名空间定义需要足够的权限。
6.2.1. 使用 OpenShift 客户端安装镜像流
您可以使用 OpenShift Client (oc
)安装 .NET 镜像流。
先决条件
- 命名空间中必须存在现有的 pull secret。如果命名空间中不存在 pull secret。按照 Red Hat Container Registry 身份验证 指南中的说明添加一个。
步骤
列出可用的 .NET 镜像流:
$ oc describe is dotnet
输出显示已安装的镜像。如果没有安装镜像,则会显示
Error from server (NotFound)
信息。如果显示
Error from server (NotFound)
信息:安装 .NET 镜像流:
$ oc create -f https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/dotnet_imagestreams.json
如果没有显示
Error from server (NotFound)
信息:包括现有 .NET 镜像流的较新版本:
$ oc replace -f https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/dotnet_imagestreams.json
6.2.2. 在 Linux 和 macOS 上安装镜像流
您可以使用此脚本在 Linux 和 macOS 上安装、升级或删除镜像流。
步骤
下载脚本。
对于 Linux 使用:
$ wget https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/install-imagestreams.sh
在 Mac 中使用:
$ curl https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/install-imagestreams.sh -o install-imagestreams.sh
使脚本可执行:
$ chmod +x install-imagestreams.sh
登录到 OpenShift 集群:
$ oc login
安装镜像流并添加针对
registry.redhat.io
进行身份验证的 pull secret:./install-imagestreams.sh --os rhel [--user subscription_username --password subscription_password]
使用用户名替换 subscription_username,并使用用户的密码替换 subscription_password。如果您不打算使用基于 RHEL7- 的镜像,可以省略凭据。
如果 pull secret 已存在,则
--user
和--password
参数将被忽略。
附加信息
-
./install-imagestreams.sh --help
6.2.3. 在 Windows 上安装镜像流
您可以使用此脚本在 Windows 上安装、升级或删除镜像流。
步骤
下载脚本。
Invoke-WebRequest https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/install-imagestreams.ps1 -UseBasicParsing -OutFile install-imagestreams.ps1
登录到 OpenShift 集群:
$ oc login
安装镜像流并添加针对
registry.redhat.io
进行身份验证的 pull secret:.\install-imagestreams.ps1 --OS rhel [-User subscription_username -Password subscription_password]
使用用户名替换 subscription_username,并使用用户的密码替换 subscription_password。如果您不打算使用基于 RHEL7- 的镜像,可以省略凭据。
如果 pull secret 已存在,则忽略
-User
和-Password
参数。
PowerShell ExecutionPolicy
可能会禁止执行此脚本。要放松策略,请运行 Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force
。
附加信息
-
Get-Help .\install-imagestreams.ps1
6.3. 使用 oc
从源部署应用程序
以下示例演示了如何使用 oc
部署 example-app 应用程序,该应用程序位于 redhat-developer/s2i-dotnetcore-ex
GitHub 存储库的 {dotnet-branch}
分支上的 app
文件夹中:
步骤
创建新 OpenShift 项目:
$ oc new-project sample-project
添加 ASP.NET Core 应用程序:
$ oc new-app --name=example-app 'dotnet:6.0-ubi8~https://github.com/redhat-developer/s2i-dotnetcore-ex#{dotnet-branch}' --build-env DOTNET_STARTUP_PROJECT=app
监控构建的进度:
$ oc logs -f bc/example-app
构建完成后查看部署的应用程序:
$ oc logs -f dc/example-app
该应用现在可以在项目内访问。
可选 :使项目可以访问外部:
$ oc expose svc/example-app
获取可共享 URL:
$ oc get routes
6.4. 使用 oc
从二进制工件部署应用程序
您可以使用 .NET Source-to-Image (S2I)构建器镜像来使用您提供的二进制工件构建应用程序。
先决条件
发布的应用程序。
如需更多信息,请参阅使用 .NET 6.0 发布应用程序。
步骤
创建新的二进制构建:
$ oc new-build --name=my-web-app dotnet:6.0-ubi8 --binary=true
启动构建并指定本地机器中二进制工件的路径:
$ oc start-build my-web-app --from-dir=bin/Release/net6.0/publish
创建新应用程序:
$ oc new-app my-web-app
6.5. .NET 6.0 的环境变量
.NET 镜像支持多个环境变量来控制 .NET 应用程序的构建行为。您可以将这些变量设置为构建配置的一部分,或者将它们添加到应用源代码存储库的 .s2i/environment
文件中。
变量名称 | 描述 | Default(默认) |
---|---|---|
DOTNET_STARTUP_PROJECT |
选择要运行的项目。这必须是项目文件(如 |
|
DOTNET_ASSEMBLY_NAME |
选择要运行的 assembly。这不得包含 |
|
DOTNET_PUBLISH_READYTORUN |
当设置为 |
|
DOTNET_RESTORE_SOURCES |
指定恢复操作中使用的 NuGet 软件包源的逗号分隔列表。这会覆盖 | |
DOTNET_RESTORE_CONFIGFILE |
指定用于恢复操作的 | |
DOTNET_TOOLS |
指定在构建应用程序前要安装的 .NET 工具列表。可以通过使用 | |
DOTNET_NPM_TOOLS | 指定在构建应用程序前要安装的 NPM 软件包列表。 | |
DOTNET_TEST_PROJECTS |
指定要测试的测试项目列表。这必须是包含单个项目文件的项目文件或文件夹。为每个项目调用 | |
DOTNET_CONFIGURATION |
以 Debug 或 Release 模式运行应用程序。这个值应该是 |
|
DOTNET_VERBOSITY |
指定 | |
HTTP_PROXY, HTTPS_PROXY | 配置构建和运行应用时使用的 HTTP 或 HTTPS 代理。 | |
DOTNET_RM_SRC |
当设置为 | |
DOTNET_SSL_DIRS |
指定带有要信任的额外 SSL 证书的文件夹或文件列表。证书受构建期间运行的每个进程以及构建后在镜像中运行的所有进程(包括构建的应用程序)的信任。项目可以是绝对路径(从 | |
NPM_MIRROR | 在构建过程中使用自定义 NPM registry 镜像下载软件包。 | |
ASPNETCORE_URLS |
此变量被设置为 | |
DOTNET_RESTORE_DISABLE_PARALLEL |
当设置为 |
|
DOTNET_INCREMENTAL |
当设置为 |
|
DOTNET_PACK |
当设置为 |
6.6. 创建 MVC 示例应用程序
s2i-dotnetcore-ex
是 .NET 的默认 Model, View, Controller (MVC)模板应用程序。
此应用程序被 .NET S2I 镜像用作示例应用程序,并可使用 Try Example 链接直接从 OpenShift UI 创建。
也可以使用 OpenShift 客户端二进制文件(oc
)创建应用。
步骤
使用 oc
创建示例应用程序:
添加 .NET 应用程序:
$ oc new-app dotnet:6.0-ubi8~https://github.com/redhat-developer/s2i-dotnetcore-ex#{dotnet-branch} --context-dir=app
使应用程序可以被外部访问:
$ oc expose service s2i-dotnetcore-ex
获取 sharable URL:
$ oc get route s2i-dotnetcore-ex
6.7. 创建 CRUD 示例应用程序
s2i-dotnetcore-persistent-ex
是一个简单 Create, Read, Update, Delete (CRUD).NET web application,它将数据存储在 PostgreSQL 数据库中。
步骤
使用 oc
创建示例应用程序:
添加数据库:
$ oc new-app postgresql-ephemeral
添加 .NET 应用程序:
$ oc new-app dotnet:6.0-ubi8~https://github.com/redhat-developer/s2i-dotnetcore-persistent-ex#{dotnet-branch} --context-dir app
从
postgresql
secret 和数据库服务名称环境变量中添加环境变量:$ oc set env dc/s2i-dotnetcore-persistent-ex --from=secret/postgresql -e database-service=postgresql
使应用程序可以被外部访问:
$ oc expose service s2i-dotnetcore-persistent-ex
获取 sharable URL:
$ oc get route s2i-dotnetcore-persistent-ex
第 7 章 从以前的 .NET 版本迁移
7.1. 从以前的 .NET 版本迁移
Microsoft 提供了从最以前的 .NET Core 版本进行迁移的说明。
如果您使用不再支持的 .NET 版本,或希望迁移到较新的 .NET 版本来扩展功能,请参阅以下文章:
如果从 .NET Core 1.x 迁移到 2.0,请参阅从 ASP.NET Core 1.x 迁移到 2.0 中的前几个相关部分。这些部分提供了适用于 .NET Core 1.x 到 2.0 迁移路径的指导。
7.2. 从 .NET Framework 移植
在从 .NET Framework 迁移时,请参考以下 Microsoft 文章:
- 有关常规指南,请参阅 从 .NET Framework 移植到 .NET Core。
- 有关移植库,请参阅 .NET Core - Libraries。
- 有关迁移到 ASP.NET Core,请参阅 迁移到 ASP.NET Core。
.NET Framework 中的一些技术和 API 在 .NET Core 和 .NET 中不可用。如果您的应用程序或库需要这些 API,请考虑查找替代方案或继续使用 .NET Framework. .NET Core 和 .NET 不支持以下技术和 API:
- 桌面应用程序,例如 Windows Forms 和 Windows 演示基础(WPF)
- Windows 通信基础(WCF)服务器(支持WCF 客户端)
- .NET 远程
另外,一些 .NET API 只能在 Microsoft Windows 环境中使用。下表显示了这些特定于 Windows 的 API 示例:
-
Microsoft.Win32.Registry
-
System.AppDomains
-
System.Drawing
-
System.Security.Principal.Windows
Microsoft.Windows.Compatibility NuGet 软件包中可能会提供默认 .NET 版本不支持的多个 API。使用此 NuGet 软件包时要小心。提供的一些 API (如 Microsoft.Win32.Registry
)仅在 Windows 上工作,使您的应用程序与 Red Hat Enterprise Linux 不兼容。