搜索

在 RHEL 7 中使用 .NET

download PDF
.NET 6.0

在 RHEL 7 上安装并运行 .NET 6.0

Red Hat Customer Content Services

摘要

本指南论述了如何在 RHEL 7 上安装并运行 .NET 6.0。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息

对红帽文档提供反馈

我们感谢您对文档提供反馈信息。请让我们了解如何改进文档。要做到这一点:

  • 关于特定内容的简单评论:

    1. 请确定您使用 Multi-page HTML 格式查看文档。另外,确定 Feedback 按钮出现在文档页的右上方。
    2. 用鼠标指针高亮显示您想评论的文本部分。
    3. 点在高亮文本上弹出的 Add Feedback
    4. 按照显示的步骤操作。
  • 要提交更复杂的反馈,请创建一个 Bugzilla ticket:

    1. 进入 Bugzilla 网站。
    2. 在 Component 中选择 Documentation
    3. Description 中输入您要提供的信息。包括文档相关部分的链接。
    4. 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

要在 RHEL 7 上安装 .NET,首先需要启用 .NET 软件存储库并安装 scl 工具。

先决条件

步骤

  1. 启用 .NET 软件存储库:

    $ sudo subscription-manager repos --enable=rhel-7-variant-dotnet-rpms

    根据您正在运行的 RHEL 系统(RHEL 7 服务器、RHEL 7 工作站或 HPC Compute 节点),将 变体 替换为 serverworkstationhpc-node

  2. 验证附加到您的系统的订阅列表:

    $ sudo subscription-manager list --consumed
  3. 安装 scl 工具:

    $ sudo yum install scl-utils -y
  4. 安装 .NET 6.0 及其所有依赖项:

    $ sudo yum install rh-dotnet60 -y
  5. 启用 rh-dotnet60 Software Collection 环境:

    $ scl enable rh-dotnet60 bash

    现在,您可以在这个 bash shell 会话中运行 dotnet 命令。

    如果您注销,使用另一个 shell 或打开新终端,则不会启用 dotnet 命令。

    警告

    红帽不推荐永久启用 rh-dotnet60,因为它可能会影响其他程序。如果要永久启用 rh-dotnet,请将 源 scl_source 启用 rh-dotnet60~/.bashrc 文件。

验证步骤

  • 验证安装:

    $ dotnet --info

    输出会返回有关 .NET 安装和环境的相关信息。

第 3 章 使用 .NET 6.0 创建应用程序

了解如何创建 C# hello-world 应用程序。

步骤

  1. 在名为 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 版本(由红帽构建),该版本使用一组原生依赖项。这些原生库是 rh-dotnet60 软件集合的一部分。

  • 自包含的部署(SCD)- 应用程序包括 .NET。此方法使用 Microsoft 构建的运行时。由于原生库不可用,在 rh-dotnet60 软件集合外运行应用程序可能会导致问题。

先决条件

4.1. 发布 .NET 应用程序

以下流程概述了如何发布独立于框架的应用程序。

步骤

  1. 发布独立于框架的应用程序:

    $ dotnet publish my-app -f net6.0 -c Release

    my-app 替换为您要发布的应用程序的名称。

  2. 可选: 如果应用程序仅用于 RHEL,请修剪其他平台所需的依赖项:

    $ dotnet restore my-app -r rhel.7-x64
    $ dotnet publish my-app -f net6.0 -c Release -r rhel.7-x64 --self-contained false
  3. 启用 Software Collection 并传递应用程序以便在 RHEL 系统上运行应用程序:

    $ scl enable rh-dotnet60 -- dotnet <app>.dll
  4. 您可以将 scl enable rh-dotnet60PROFILE-mvapichdotnet <app>.dll 命令添加到应用程序发布的脚本中。

    在项目中添加以下脚本并更新变量:

    #!/bin/bash
    
    APP=<app>
    SCL=rh-dotnet60
    DIR="$(dirname "$(readlink -f "$0")")"
    
    scl enable $SCL -- "$DIR/$APP" "$@"
  5. 要在发布时包含脚本,请将此 ItemGroup 添加到 csproj 文件中:

    <ItemGroup>
        <None Update="<scriptname>" Condition="'$(RuntimeIdentifier)' == 'rhel.7-x64' and '$(SelfContained)' == 'false'" CopyToPublishDirectory="PreserveNewest" />
    </ItemGroup>

第 5 章 在容器中运行 .NET 6.0 应用程序

使用 ubi8/dotnet-60-runtime 镜像在 Linux 容器内运行预编译的应用程序。

先决条件

  • 预配置的容器。

    以下示例使用 podman。

步骤

  1. 可选: 如果您位于另一个项目的目录中,且不想创建嵌套项目,请返回到项目的父目录:

    # cd ..
  2. 在名为 mvc_runtime_example 的目录中创建一个新的 MVC 项目:

    $ dotnet new mvc --output mvc_runtime_example
  3. 发布项目:

    $ dotnet publish mvc_runtime_example -f net6.0 -c Release
  4. 创建 Dockerfile

    $ cat > Dockerfile <<EOF
    FROM registry.redhat.io/ubi8/dotnet-60-runtime
    
    ADD bin/Release/net6.0/publish/ .
    
    CMD ["dotnet", "mvc_runtime_example.dll"]
    EOF
  5. 构建镜像:

    $ podman build -t dotnet-60-runtime-example .
  6. 运行您的镜像:

    $ 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 镜像流。

先决条件

步骤

  1. 列出可用的 .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 上安装、升级或删除镜像流。

步骤

  1. 下载脚本。

    1. 对于 Linux 使用:

      $ wget https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/install-imagestreams.sh
    2. 在 Mac 中使用:

      $ curl https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/install-imagestreams.sh -o install-imagestreams.sh
  2. 使脚本可执行:

    $ chmod +x install-imagestreams.sh
  3. 登录到 OpenShift 集群:

    $ oc login
  4. 安装镜像流并添加针对 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 上安装、升级或删除镜像流。

步骤

  1. 下载脚本。

    Invoke-WebRequest https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/install-imagestreams.ps1 -UseBasicParsing -OutFile install-imagestreams.ps1
  2. 登录到 OpenShift 集群:

    $ oc login
  3. 安装镜像流并添加针对 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 文件夹中:

步骤

  1. 创建新 OpenShift 项目:

    $ oc new-project sample-project
  2. 添加 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
  3. 监控构建的进度:

    $ oc logs -f bc/example-app
  4. 构建完成后查看部署的应用程序:

    $ oc logs -f dc/example-app

    该应用现在可以在项目内访问。

  5. 可选 :使项目可以访问外部:

    $ oc expose svc/example-app
  6. 获取可共享 URL:

    $ oc get routes

6.4. 使用 oc从二进制工件部署应用程序

您可以使用 .NET Source-to-Image (S2I)构建器镜像来使用您提供的二进制工件构建应用程序。

先决条件

  1. 发布的应用程序。

    如需更多信息,请参阅使用 .NET 6.0 发布应用程序

步骤

  1. 创建新的二进制构建:

    $ oc new-build --name=my-web-app dotnet:6.0-ubi8 --binary=true
  2. 启动构建并指定本地机器中二进制工件的路径:

    $ oc start-build my-web-app --from-dir=bin/Release/net6.0/publish
  3. 创建新应用程序:

    $ oc new-app my-web-app

6.5. .NET 6.0 的环境变量

.NET 镜像支持多个环境变量来控制 .NET 应用程序的构建行为。您可以将这些变量设置为构建配置的一部分,或者将它们添加到应用源代码存储库的 .s2i/environment 文件中。

变量名称描述Default(默认)

DOTNET_STARTUP_PROJECT

选择要运行的项目。这必须是项目文件(如 csprojfsproj)或包含单个项目文件的文件夹。

.

DOTNET_ASSEMBLY_NAME

选择要运行的 assembly。这不得包含 .dll 扩展。把它设置为 csproj 中指定的输出 assembly 名称(PropertyGroup/AssemblyName)。

csproj 文件的名称

DOTNET_PUBLISH_READYTORUN

当设置为 true 时,应用程序将提前编译。这可减少启动时间,从而减少了应用程序加载时 JIT 需要执行的工作量。

false

DOTNET_RESTORE_SOURCES

指定恢复操作中使用的 NuGet 软件包源的逗号分隔列表。这会覆盖 NuGet.config 文件中指定的所有源。此变量不能与 DOTNET_RESTORE_CONFIGFILE 结合使用。

 

DOTNET_RESTORE_CONFIGFILE

指定用于恢复操作的 NuGet.Config 文件。此变量不能与 DOTNET_RESTORE_SOURCES 结合使用。

 

DOTNET_TOOLS

指定在构建应用程序前要安装的 .NET 工具列表。可以通过使用 @ <version> 来等待软件包名安装特定版本。

 

DOTNET_NPM_TOOLS

指定在构建应用程序前要安装的 NPM 软件包列表。

 

DOTNET_TEST_PROJECTS

指定要测试的测试项目列表。这必须是包含单个项目文件的项目文件或文件夹。为每个项目调用 dotnet test

 

DOTNET_CONFIGURATION

以 Debug 或 Release 模式运行应用程序。这个值应该是 ReleaseDebug

Release

DOTNET_VERBOSITY

指定 dotnet 构建 命令的详细程度。设置后,环境变量会在构建开始时打印。这个变量可以被设置为 msbuild verbosity 值(q[uiet]m[inimal]n[ormal]d[etailed]diag[nostic])。

 

HTTP_PROXY, HTTPS_PROXY

配置构建和运行应用时使用的 HTTP 或 HTTPS 代理。

 

DOTNET_RM_SRC

当设置为 true 时,镜像中不包含源代码。

 

DOTNET_SSL_DIRS

指定带有要信任的额外 SSL 证书的文件夹或文件列表。证书受构建期间运行的每个进程以及构建后在镜像中运行的所有进程(包括构建的应用程序)的信任。项目可以是绝对路径(从 /开始)或源存储库中的路径(如证书)。

 

NPM_MIRROR

在构建过程中使用自定义 NPM registry 镜像下载软件包。

 

ASPNETCORE_URLS

此变量被设置为 http://*:8080,将 ASP.NET Core 配置为使用镜像公开的端口。不建议修改它。

http://*:8080

DOTNET_RESTORE_DISABLE_PARALLEL

当设置为 true 时,会禁用并行恢复多个项目。这可减少构建容器以低 CPU 限值运行时恢复超时错误。

false

DOTNET_INCREMENTAL

当设置为 true 时,将保留 NuGet 软件包,以便将其用于增量构建。

false

DOTNET_PACK

当设置为 true 时,在 /opt/app-root/app. tar.gz 中创建一个 tar.gz 文件,其中包含公布的应用程序。

 

6.6. 创建 MVC 示例应用程序

s2i-dotnetcore-ex 是 .NET 的默认 Model, View, Controller (MVC)模板应用程序。

此应用程序被 .NET S2I 镜像用作示例应用程序,并可使用 Try Example 链接直接从 OpenShift UI 创建。

也可以使用 OpenShift 客户端二进制文件(oc)创建应用。

步骤

使用 oc 创建示例应用程序:

  1. 添加 .NET 应用程序:

    $ oc new-app dotnet:6.0-ubi8~https://github.com/redhat-developer/s2i-dotnetcore-ex#{dotnet-branch} --context-dir=app
  2. 使应用程序可以被外部访问:

    $ oc expose service s2i-dotnetcore-ex
  3. 获取 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 创建示例应用程序:

  1. 添加数据库:

    $ oc new-app postgresql-ephemeral
  2. 添加 .NET 应用程序:

    $ oc new-app dotnet:6.0-ubi8~https://github.com/redhat-developer/s2i-dotnetcore-persistent-ex#{dotnet-branch} --context-dir app
  3. postgresql secret 和数据库服务名称环境变量中添加环境变量:

    $ oc set env dc/s2i-dotnetcore-persistent-ex --from=secret/postgresql -e database-service=postgresql
  4. 使应用程序可以被外部访问:

    $ oc expose service s2i-dotnetcore-persistent-ex
  5. 获取 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 中的一些技术和 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 不兼容。

法律通告

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.