RHEL 8 で .NET を使い始める

.NET 5.0

RHEL 8 での .NET 5.0 のインストールおよび実行

概要

本ガイドでは、RHEL 8 に .NET 5.0 をインストールして実行する方法を説明します。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。まずは、マスター (master)、スレーブ (slave)、ブラックリスト (blacklist)、ホワイトリスト (whitelist) の 4 つの用語の置き換えから始めます。この取り組みは膨大な作業を要するため、今後の複数のリリースで段階的に用語の置き換えを実施して参ります。詳細は、弊社の CTO、Chris Wright のメッセージ を参照してください。

Red Hat ドキュメントへのフィードバックの提供

ご意見ご要望をお聞かせください。ドキュメントの改善点はございませんか。改善点を報告する場合は、以下のように行います。

  • 特定の文章に簡単なコメントを記入する場合は、以下の手順を行います。

    1. ドキュメントの表示が Multi-page HTML 形式になっていて、ドキュメントの右上隅に Feedback ボタンがあることを確認してください。
    2. マウスカーソルで、コメントを追加する部分を強調表示します。
    3. そのテキストの下に表示される Add Feedback ポップアップをクリックします。
    4. 表示される手順に従ってください。
  • より詳細なフィードバックを行う場合は、Bugzilla のチケットを作成します。

    1. Bugzilla の Web サイトにアクセスします。
    2. Component で Documentation を選択します。
    3. Description フィールドに、ドキュメントの改善に関するご意見を記入してください。ドキュメントの該当部分へのリンクも記入してください。
    4. Submit Bug をクリックします。

第1章 .NET 5.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 Server にのみ依存することなく .NET アプリケーションを実行できます。

.NET 5.0 は、RHEL 7、RHEL 8、および OpenShift Container Platform バージョン 3.11 以降でサポートされます。

第2章 .NET 5.0 のインストール

.NET 5.0 は、RHEL 8 の AppStream リポジトリーに含まれています。AppStream リポジトリーは、RHEL 8 システムでデフォルトで有効になっています。

.NET 5.0 ランタイムは、最新の 5.0 Software Development Kit (SDK) でインストールできます。新しい SDK が .NET 5.0 で利用可能になったら、sudo yum install を実行してインストールできます。

前提条件

手順

  • .NET 5.0 とそのすべての依存関係をインストールします。

    $ sudo yum install dotnet-sdk-5.0 -y

検証手順

  • インストールを確認します。

    $ dotnet --info

    出力は、.NET インストールおよび環境に関する関連情報を返します。

第3章 .NET 5.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 5.0 を使用したアプリケーションの公開

.NET 5.0 アプリケーションを公開して、共有されたシステム全体で使用される .NET を使用するか、.NET を追加できます。

.NET 5.0 アプリケーションを公開するには、以下のメソッドがあります。

  • 単一ファイルアプリケーション: アプリケーションは自己完結型であり、単一のバイナリーに含まれる依存ファイルすべてを含む単一の実行可能ファイルとしてデプロイできます。
  • フレームワーク依存デプロイメント (FDD): アプリケーションは、共有されたシステム全体の .NET バージョンを使用します。
注記

RHEL にアプリケーションを公開する場合、Red Hat では FDD を使用することを推奨しています。これは、アプリケーションが、Red Hat が構築した最新バージョンの .NET を使用していることを保証するためです。これは、特定のネイティブ依存関係のセットを使用します。

  • SCD (自己完結型デプロイメント): アプリケーションには .NET が含まれます。この方法では、Microsoft が構築したランタイムを使用します。

前提条件

4.1. .NET アプリケーションの公開

以下の手順では、フレームワーク依存アプリケーションを公開する方法を概説します。

手順

  1. フレームワーク依存アプリケーションを公開します。

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

    my-app を公開するアプリケーションの名前に置き換えます。

  2. 任意: アプリケーションが RHEL 専用の場合は、次のコマンドを使用してその他のプラットフォームに必要な依存関係を削除します。

    $ dotnet restore my-app -r rhel.8-x64
    $ dotnet publish my-app -f net5.0 -c Release -r rhel.8-x64 --self-contained false

第5章 コンテナーでの .NET 5.0 アプリケーションの実行

ubi8/dotnet-50-runtime イメージを使用して、Linux コンテナー内で事前にコンパイルされたアプリケーションを実行します。

前提条件

  • 事前設定されたコンテナー。

    以下の例では podman を使用しています。

手順

  1. オプション: 別のプロジェクトのディレクトリーにあり、ネストされたプロジェクトを作成したくない場合は、プロジェクトの親ディレクトリーに戻ります。

    # cd ..
  2. mvc_runtime_example という名前のディレクトリーに新しい MVC プロジェクトを作成します。

    $ dotnet new mvc --output mvc_runtime_example
  3. プロジェクトを公開します。

    $ dotnet publish mvc_runtime_example -f net5.0 -c Release
  4. Dockerfile を作成します。

    $ cat > Dockerfile <<EOF
    FROM registry.access.redhat.com/ubi8/dotnet-50-runtime
    
    ADD bin/Release/net5.0/publish/ .
    
    CMD ["dotnet", "mvc_runtime_example.dll"]
    EOF
  5. イメージを構築します。

    $ podman build -t dotnet-50-runtime-example .
  6. イメージを実行します。

    $ podman run -d -p8080:8080 dotnet-50-runtime-example

検証手順

  • コンテナーで実行されているアプリケーションを表示します。

    $ xdg-open http://127.0.0.1:8080

第6章 OpenShift Container Platform での .NET 5.0 の使用

6.1. 概要

NET イメージは、s2i-dotnetcore からイメージストリーム定義をインポートすることで OpenShift に追加されます。

イメージストリーム定義には、サポートされる異なるバージョンの .NET の sdk イメージが含まれる dotnet イメージストリームが含まれます。.NET Life Cycle は、サポートされているバージョンの最新の概要を提供します。

バージョンタグエイリアス

.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 ベース (suffix -el7) は、registry.redhat.io イメージリポジトリーでホストされます。これらのイメージをプルするには、認証が必要です。これらの認証情報は、プルシークレットを OpenShift 名前空間に追加して設定されます。

UBI-8 ベースのイメージ (suffix -ubi8) は registry.access.redhat.com でホストされ、認証は必要ありません。

6.2. .NET イメージストリームのインストール

.NET イメージストリームをインストールするには、s2i-dotnetcore のイメージストリーム定義と OpenShift Client (oc) バイナリーを使用してインストールされます。イメージストリームは、Linux、Mac、Windows からインストールできます。スクリプトを使用すると、イメージストリームのインストール、更新、または削除を行うことができます。

.NET イメージストリームは、グローバルな openshift 名前空間で定義するか、プロジェクト名前空間でローカルにストリームします。openshift 名前空間の定義を更新するには、十分な権限が必要です。

6.2.1. OpenShift Client を使用したイメージストリームのインストール

OpenShift クライアント (oc) を使用して .NET イメージストリームをインストールできます。

前提条件

  • 名前空間には、既存のプルシークレットが存在する必要があります。名前空間にプルシークレットが存在しない場合。『Red Hat Container Registry Authentication』の手順に従ってこれを追加します。

手順

  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 に対して認証用のプルシークレットを追加します。

    ./install-imagestreams.sh --os rhel [--user subscription_username --password subscription_password]

    subscription_username はユーザーの名前に置き換え、subscription_password をユーザーのパスワードに置き換えます。RHEL7 ベースのイメージを使用する予定がない場合は、認証情報は省略できます。

    プルシークレットが存在する場合は、--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 に対して認証用のプルシークレットを追加します。

    .\install-imagestreams.ps1 --OS rhel [-User subscription_username -Password subscription_password]

    subscription_username はユーザーの名前に置き換え、subscription_password をユーザーのパスワードに置き換えます。RHEL7 ベースのイメージを使用する予定がない場合は、認証情報は省略できます。

    プルシークレットがすでに存在する場合は、-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-5.0 ブランチの app ディレクトリーにあります。

手順

  1. 新しい OpenShift プロジェクトを作成します。

    $ oc new-project sample-project
  2. ASP .NET Core アプリケーションを追加します。

    $ oc new-app --name=example-app 'dotnet:5.0-ubi8~https://github.com/redhat-developer/s2i-dotnetcore-ex#dotnet-5.0' --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:5.0-ubi8 --binary=true
  2. ビルドを開始し、ローカルマシンのバイナリーアーティファクトへのパスを指定します。

    $ oc start-build my-web-app --from-dir=bin/Release/net5.0/publish
  3. 新規アプリケーションを作成します。

    $ oc new-app my-web-app

6.5. .NET 5.0 の環境変数

.NET イメージは、.NET アプリケーションのビルド動作を制御する複数の環境変数をサポートします。これらの変数はビルド設定の一部として設定したり、アプリケーションのソースコードリポジトリーの .s2i/environment ファイルに追加できます。

変数名説明デフォルト

DOTNET_STARTUP_PROJECT

実行するプロジェクトを選択します。これは、プロジェクトファイル (csprojfsproj など) またはプロジェクトファイルを 1 つ含むディレクトリーである必要があります。

.

DOTNET_ASSEMBLY_NAME

実行するアセンブリーを選択します。これには .dll 拡張子を含めないでください。これを、csproj で指定した出力アセンブリー名 (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 モードでアプリケーションを実行します。この値は、Release または Debug でなければなりません。

Release

DOTNET_VERBOSITY

dotnet build コマンドの詳細度を指定します。設定すると、環境変数はビルドの開始時に出力されます。この変数は、msbuild の詳細度 (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 レジストリミラーを使用してパッケージをダウンロードします。

 

ASPNETCORE_URLS

この変数は http://*:8080 に設定され、イメージにより公開されるポートを使用するように ASP.NET Core を設定します。これを変更することは推奨されません。

http://*:8080

DOTNET_RESTORE_DISABLE_PARALLEL

true に設定すると、複数のプロジェクトを並行して復元できなくなります。これにより、ビルドコンテナーが CPU 制限の値が低く設定された状態で実行されている場合にも復元タイムアウトのエラーが減少します。

false

DOTNET_INCREMENTAL

true に設定すると、NuGet パッケージは保持され、インクリメンタルビルドに再利用できます。

false

DOTNET_PACK

true に設定すると、公開アプリケーションを含む tar.gz ファイルが /opt/app-root/app.tar.gz に作成されます。

 

6.6. MVC サンプルアプリケーションの作成

s2i-dotnetcore-ex は、.NET のデフォルトの .NET Core Model、View、Controller (MVC) テンプレートアプリケーションです。

このアプリケーションは、.NET S2I イメージによってサンプルアプリケーションとして使用され、Try Example リンクを使用して OpenShift UI から直接作成できます。

アプリケーションは、OpenShift クライアントバイナリー (oc) を使用して作成することもできます。

手順

oc を使用してサンプルアプリケーションを作成するには、以下を行います。

  1. .NET アプリケーションを追加します。

    $ oc new-app dotnet:5.0-ubi8~https://github.com/redhat-developer/s2i-dotnetcore-ex#dotnet-5.0 --context-dir=app
  2. アプリケーションが外部からアクセス可能にします。

    $ oc expose service s2i-dotnetcore-ex
  3. 共有可能な URL を取得します。

    $ oc get route s2i-dotnetcore-ex

6.7. CRUD サンプルアプリケーションの作成

s2i-dotnetcore-persistent-ex は、PostgreSQL データベースにデータを格納する単純な Create、Read、Update、Delete (CRUD) の .NET Core Web アプリケーションです。

手順

oc を使用してサンプルアプリケーションを作成するには、以下を行います。

  1. データベースを追加します。

    $ oc new-app postgresql-ephemeral
  2. .NET アプリケーションを追加します。

    $ oc new-app dotnet:5.0-ubi8~https://github.com/redhat-developer/s2i-dotnetcore-persistent-ex#dotnet-5.0 --context-dir app
  3. postgresql シークレットおよびデータベースサービス名環境変数から環境変数を追加します。

    $ oc set env dc/s2i-dotnetcore-persistent-ex --from=secret/postgresql -e database-service=postgresql
  4. アプリケーションによる外部アクセスを可能にします。

    $ oc expose service s2i-dotnetcore-persistent-ex
  5. 共有可能な URL を取得します。

    $ oc get route s2i-dotnetcore-persistent-ex

第7章 .NET の以前のバージョンからの移行

7.1. .NET の以前のバージョンからの移行

マイクロソフトは、ほとんどの旧バージョンの .NET Core からの移行手順を提供しています。

サポート対象外になったバージョンの .NET を使用している場合や、新しいバージョンの .NET に移行して機能を拡張する場合は、以下のアーティクルを参照してください。

注記

.NET Core 1.x から 2.0 に移行する場合は、「Migrate from ASP.NET Core 1.x to 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 や WPF (Windows Presentation Foundation) などのデスクトップアプリケーション
  • Windows Communication Foundation (WCF) サーバー (WCF クライアントがサポートされています)
  • .NET リモート処理

さらに、多くの .NET API は、Microsoft Windows 環境でのみ使用できます。次の一覧では、この Windows 固有の API の例を示しています。

  • Microsoft.Win32.Registry
  • System.AppDomains
  • System.Drawing
  • System.Security.Principal.Windows

.NET Portability Analyzer を使用して、API の相違点と交換の可能性を特定することを検討してください。

たとえば、次のコマンドを入力して、.NET Framework アプリケーションで使用される API が .NET 5.0 によってどの程度サポートされているかを確認します。

$ dotnet /path/to/ApiPort.dll analyze -f . -r html --target '.NET Framework,Version=<dotnet-framework-version>' --target '.NET Core,Version=<dotnet-version>'

&lt ;dotnet-framework-version&gt; を、現在使用している .NET Framework バージョンに置き換えます。例: 4.6& lt;dotnet-version& gt; を、移行する予定の .NET Core のバージョンに置き換えます。例: 3.1

重要

.NET のデフォルトバージョンでサポートされないいくつかの API は、Microsoft.Windows.Compatibility NuGet パッケージで利用できます。この NuGet パッケージを使用するときは注意してください。提供されている API の一部 (Microsoft.Win32.Registry など) は Windows でのみ動作し、アプリケーションが Red Hat Enterprise Linux と互換性がないようにします。