Windows で Service Fabric Reliable Services と Reliable Actors をコンテナー化する
Service Fabric は、Service Fabric マイクロサービス (Reliable Services と Reliable Actor ベースのサービス) のコンテナー化をサポートしています。 詳細については、「Service Fabric とコンテナー」を参照してください。
このドキュメントは、Windows コンテナー内でサービスを実行させるためのガイダンスとなっています。
Note
現在、この機能は Windows でのみ機能します。 コンテナーを実行するには、Windows Server 2016 with Containers でクラスターを実行する必要があります。
Service Fabric アプリケーションをコンテナー化する手順
Visual Studio で Service Fabric アプリケーションを開きます。
クラス SFBinaryLoader.cs をプロジェクトに追加します。 このクラスのコードは、コンテナー内で実行すると、アプリケーション内の Service Fabric ランタイム バイナリを適切に読み込むことができるヘルパーです。
コンテナー化するコード パッケージごとに、プログラムのエントリ ポイントのローダーを初期化します。 次のコード スニペットに示されている静的コンストラクターをプログラム エントリ ポイント ファイルに追加します。
namespace MyApplication { internal static class Program { static Program() { SFBinaryLoader.Initialize(); } /// <summary> /// This is the entry point of the service host process. /// </summary> private static void Main() {
プロジェクトをビルドしてパッケージを作成します。 ビルドしてパッケージを作成するには、ソリューション エクスプローラーでアプリケーション プロジェクトを右クリックして [パッケージ] コマンドを選択します。
コンテナー化する必要があるコード パッケージごとに、PowerShell スクリプト CreateDockerPackage.ps1 を実行します。 使用方法は次のとおりです。
完全版の .NET
$codePackagePath = 'Path to the code package to containerize.' $dockerPackageOutputDirectoryPath = 'Output path for the generated docker folder.' $applicationExeName = 'Name of the Code package executable.' CreateDockerPackage.ps1 -CodePackageDirectoryPath $codePackagePath -DockerPackageOutputDirectoryPath $dockerPackageOutputDirectoryPath -ApplicationExeName $applicationExeName
.NET Core
$codePackagePath = 'Path to the code package to containerize.' $dockerPackageOutputDirectoryPath = 'Output path for the generated docker folder.' $dotnetCoreDllName = 'Name of the Code package dotnet Core Dll.' CreateDockerPackage.ps1 -CodePackageDirectoryPath $codePackagePath -DockerPackageOutputDirectoryPath $dockerPackageOutputDirectoryPath -DotnetCoreDllName $dotnetCoreDllName
次のスクリプトでは、$dockerPackageOutputDirectoryPath に Docker アーティファクトを含むフォルダーを作成します。 生成された Docker ファイルを変更して、必要に応じて任意のポートを
expose
したり、セットアップ スクリプトを実行したりします。ApplicationManifest.xml と ServiceManifest.xml を変更し、コンテナー イメージ、リポジトリ情報、レジストリ認証、ポートとホスト間のマッピングを追加します。 マニフェストを変更する方法については、「Windows で初めての Service Fabric コンテナー アプリケーションを作成する」を参照してください。 サービス マニフェストのコード パッケージ定義は、対応するコンテナー イメージで置き換える必要があります。 EntryPoint 型を ContainerHost 型に変更します。
<!-- Code package is your service executable. --> <CodePackage Name="Code" Version="1.0.0"> <EntryPoint> <!-- Follow this link for more information about deploying Windows containers to Service Fabric: https://aka.ms/sfguestcontainers --> <ContainerHost> <ImageName>myregistry.azurecr.io/samples/helloworldapp</ImageName> </ContainerHost> </EntryPoint> <!-- Pass environment variables to your container: --> </CodePackage>
レプリケーターとサービス エンドポイントについてポートとホスト間のマッピングを追加します。 Service Fabric によって実行時に両方のポートが割り当てられているため、割り当て済みポートをマッピングに使用するには、ContainerPort をゼロに設定します。
<Policies> <ContainerHostPolicies CodePackageRef="Code"> <PortBinding ContainerPort="0" EndpointRef="ServiceEndpoint"/> <PortBinding ContainerPort="0" EndpointRef="ReplicatorEndpoint"/> </ContainerHostPolicies> </Policies>
コンテナーの分離モードを構成するには、「分離モードの構成」を参照してください。 Windows では、コンテナーの 2 つの分離モード (プロセスおよび Hyper-V) がサポートされます。 以下のスニペットは、アプリケーション マニフェスト ファイルで分離モードがどのように指定されるかを示しています。
<Policies> <ContainerHostPolicies CodePackageRef="Code" Isolation="process"> ... </ContainerHostPolicies> </Policies>
<Policies> <ContainerHostPolicies CodePackageRef="Code" Isolation="hyperv"> ... </ContainerHostPolicies> </Policies>
Note
Service Fabric クラスターはシングル テナントとして設計されており、ホストされるアプリケーションは信頼できるものと見なされます。 信頼されていないコンテナー アプリケーションのホストを検討している場合は、それらをゲスト コンテナーとしてデプロイすることを検討し、「Service Fabric クラスターでの信頼されていないアプリケーションのホスト」をご覧ください。
このアプリケーションをテストするには、バージョン 5.7 以降を実行しているクラスターにデプロイする必要があります。 ラインタイム バージョンが 6.1 以前の場合は、このプレビュー機能を有効にするようにクラスター設定を編集および更新する必要があります。 この記事の手順に従って、次のように設定を追加します。
{ "name": "Hosting", "parameters": [ { "name": "FabricContainerAppsEnabled", "value": "true" } ] }
次に、編集したアプリケーション パッケージをこのクラスターにデプロイします。
以上の手順で、クラスターを実行しているコンテナー化された Service Fabric アプリケーションが作成されます。
次のステップ
- Service Fabric でのコンテナーの実行について確認します。
- Service Fabric のアプリケーション ライフサイクルについて確認します。