RHEL 9 で .NET を使い始める

.NET 3.1

RHEL 9 への .NET Core 3.1 のインストールおよび実行

概要

本ガイドでは、RHEL 9 に .NET Core 3.1 をインストールして実行する方法を説明します。.NET Core 3.1 は、RHEL 9 Beta でのみ利用できます。.NET Core 3.1 は、RHEL 9 GA では .NET 6.0 に置き換えられます。

はじめに

重要

.NET Core 3.1 は、RHEL 9 Beta でのみ提供されます。.NET Core 3.1 は削除され、RHEL 9 GA では .NET 6.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 Core 3.1 の概要

.NET Core は、自動メモリー管理と最新のプログラミング言語を備えた汎用開発プラットフォームです。.NET を使用することで、ユーザーは高品質のアプリケーションを効率的に構築できます。.NET Core は、認定済みのコンテナーを介して Red Hat Enterprise Linux (RHEL) および OpenShift Container Platform で利用できます。

.NET Core には次の機能があります。

  • マイクロサービスベースのアプローチに従う機能。一部のコンポーネントは .NET で構築され、他のコンポーネントは Java で構築されますが、すべてが RHEL および OpenShift Container Platform でサポートされている共通プラットフォームで実行できます。
  • Microsoft Windows で新しい .NET Core ワークロードをより簡単に開発する能力。RHEL または Windows Server のいずれかにアプリケーションをデプロイして実行できます。
  • 異機種環境のデータセンター。基盤となるインフラストラクチャーが Windows Server にのみ依存することなく .NET アプリケーションを実行できます。

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

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

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

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

前提条件

手順

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

    $ sudo yum install dotnet-sdk-3.1 -y

検証手順

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

    $ dotnet --info

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

第3章 .NET Core 3.1 を使用したアプリケーションの作成

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 Core 3.1 を使用したアプリケーションの公開

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

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

  • フレームワーク依存デプロイメント (FDD): アプリケーションは、共有されたシステム全体の .NET バージョンを使用します。
注記

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

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

前提条件

  • 既存の .NET Core アプリケーション。

    .NET Core アプリケーションの作成方法は、次を参照してください。

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

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

手順

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

    $ dotnet publish my-app -f netcoreapp3.1 -c Release

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

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

    $ dotnet restore my-app -r rhel.9-x64
    $ dotnet publish my-app -f netcoreapp3.1 -c Release -r rhel.9-x64 --self-contained false
    注記

    arm64/aarch64 マシンを使用している場合は、以下を使用します。

    $ dotnet restore my-app -r rhel.9-arm64
    $ dotnet publish my-app -f netcoreapp3.1 -c Release -r rhel.9-arm64 --self-contained false

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

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

前提条件

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

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

手順

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

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

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

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

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

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

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

検証手順

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

    $ xdg-open http://127.0.0.1:8080

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

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

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

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

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

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

前提条件

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

手順

  1. 利用可能な .NET Core イメージストリームの一覧を表示します。

    $ oc describe is dotnet

    出力には、インストールされているイメージが表示されます。イメージがインストールされていない場合は、Error from server (NotFound) メッセージが表示されます。

  2. .NET Core イメージストリームをインストールします。

    $ oc create -f https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/dotnet_imagestreams.json
  3. 既存の .NET Core イメージストリームの新しいバージョンを含めます。

    $ oc replace -f https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/dotnet_imagestreams.json

6.1.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.1.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.sh --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.2. oc を使用したソースからのアプリケーションのデプロイメント

以下の例では、oc を使用した example-app アプリケーションのデプロイ方法を説明します。これは、redhat-developer/s2i-dotnetcore-ex GitHub リポジトリーの dotnetcore-3.1 ブランチの app ディレクトリーにあります。

手順

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

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

    $ oc new-app --name=example-app 'dotnet:3.1~https://github.com/redhat-developer/s2i-dotnetcore-ex#dotnetcore-3.1' --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.3. oc を使用したバイナリーアーティファクトからアプリケーションのデプロイ

.NET Core Source-to-Image (S2I) ビルダーイメージを使用して、提供するバイナリーアーティファクトを使用してアプリケーションをビルドできます。

前提条件

  1. 公開済みアプリケーション。

    詳細は以下を参照してください。

手順

  1. 新しいバイナリービルドを作成します。

    $ oc new-build --name=my-web-app dotnet:3.1 --binary=true
  2. ビルドを開始し、ローカルマシンのバイナリーアーティファクトへのパスを指定します。

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

    $ oc new-app my-web-app

6.4. .NET Core 3.1 の環境変数

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

変数名説明デフォルト

DOTNET_STARTUP_PROJECT

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

.

DOTNET_ASSEMBLY_NAME

実行するアセンブリーを選択します。これには .dll 拡張子を含めないでください。これを、csproj で指定した出力アセンブリー名 (PropertyGroup/AssemblyName) に設定します。

csproj ファイルの名前

DOTNET_PUBLISH_READRYTORUN

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.5. MVC サンプルアプリケーションの作成

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

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

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

手順

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

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

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

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

    $ oc get route s2i-dotnetcore-ex

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

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

手順

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

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

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

    $ oc new-app dotnet:3.1~https://github.com/redhat-developer/s2i-dotnetcore-persistent-ex#dotnetcore-3.1 --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