Windows Server および Hyper-V コンテナーと分離モードの定義
Contoso Windows Server 管理者は、コンテナーが Windows Server でどのように実行されるか、そしてランタイム環境の分離がどのように達成されるか (主にプロセス分離と Hyper-V 分離モード) について理解する必要があります。 管理者は、さまざまな分離モードを実行する方法や、どのような状況でどのような分離モードが適切か、または必要かについても理解する必要があります。
分離モード
Windows サーバー上では、2 つの異なる分離モードのいずれかでコンテナーを実行できます。 どちらのモードも、コンテナーを作成、管理、実行するための同一のプロセスをサポートしています。 ただし、コンテナーに提供される分離の度合いには違いがあり、それに伴い、コンテナー、他のコンテナー、ホスト OS 間のセキュリティにも違いがあります。
Windows Server は、次のコンテナー分離モードをサポートしています。
プロセスの分離。 "プロセス分離" モードで実行されているコンテナーは、"Windows Server コンテナー" と呼ぶことができます。
Hyper-V 分離。 "Hyper-V 分離" モードで実行されているコンテナーは、"Hyper-V コンテナー" と呼ぶことができます。
Windows Server コンテナーのプロセス分離モード
プロセス分離モードは、Windows Server コンテナーの従来の分離モードと考えられており、1 つのホスト上で複数のコンテナー インスタンスを同時に実行することができます。 このモードで実行すると、コンテナーは相互に、またホスト OS と同じカーネルを共有します。 プロビジョニングされた各コンテナーには独自のユーザー モードがあり、Windows とアプリのプロセスを他のコンテナーから分離して実行することができます。 プロセス分離モードを使用するように Windows コンテナーを構成すると、コンテナーにより、同じコンピューター上で分離状態で複数のアプリを実行できますが、セキュリティが強化された分離は提供されません。
注意
Docker は、オープンソース ツール、ソリューション、クラウドベースのサービスのコレクションであり、ソフトウェア開発用に標準化されたユニットへとアプリ コードをパッケージ化するための共通モデル ("コンテナー化" とも呼ばれます) が用意されています。 Docker とコンテナー ランタイムついては、次のユニットでさらに学習します。
新しいコンテナーを起動すると、Docker (または既定のコンテナー ラインタイム) ではコンピューティング サービスとの通信が行われ、イメージに基づく新しいコンテナーが作成されます。 Docker により、コンテナーごとに Windows コンテナーが作成されます。 各 Windows コンテナーには、すべてのコンテナーで常に同じである、一連のシステム プロセスが必要です。 その結果、独自のアプリケーション プロセスを使用して各コンテナーを区別できるようになります。 これを行うために、.NET などのアプリケーション フレームワーク、インターネット インフォメーション サービス (IIS) などの Windows Server コンポーネント、またはコンテナーで実行するサードパーティのフレームワークまたはプロセスを使用できます。
Hyper-V コンテナーの Hyper-V 分離モード
コンテナーがカーネルとメモリを共有していると、攻撃者が脆弱性を探索した場合に、アプリケーションがサンドボックス環境から逸脱し、誤って悪意のある動作が実行される可能性があります。 これを回避するために、Windows には、"Hyper-V 分離" モードと呼ばれる、より安全にコンテナーを実行できる代替方法が用意されています (Hyper-V コンテナーと呼ばれることもあります)。
Hyper-V 分離モードでは、各コンテナーは高度に最適化された VM 内で実行されます。 Hyper-V 分離モードの利点は、各コンテナーが実質的に独自のカーネルを持つことで、安定性とセキュリティが強化されることです。 VM により、各コンテナーとホスト コンピューターの間にハードウェアレベルの分離のレイヤーが追加されます。 デプロイすると、Hyper-V 分離モードを使用するコンテナーは数秒で起動します。これは、完全な Windows OS がインストールされた VM よりもはるかに高速です。
注意
Windows Server 上で実行されている Windows ベースのコンテナーには、既定でプロセス分離モードが使用されます。 Windows 10 Pro および Enterprise 上で実行されている Windows ベースのコンテナーには、既定で Hyper-V 分離モードが使用されます。
次の図は、Windows Server と Hyper-V コンテナーのアーキテクチャと、2 つの分離モードを比較したものです。 この図は、ホスト Windows カーネルがホスト ユーザー モードと Windows Server によって共有されていることを示しています。 その共有カーネル上では仮想マシンが動作しており、その中には Hyper-V コンテナーがあります。 Hyper-V コンテナーには、共有されない独自の Windows カーネルがあります。
注意事項
Windows 10 のプロセス分離モードは、開発とテストのみを目的としています。 2018 年 10 月の Windows 10 更新プログラム以降、Windows 10 Pro または Enterprise ホストを実行しているユーザーは、プロセス分離モードで Windows コンテナーを実行できるようになりました。 ユーザーは、--isolation=process パラメーターを使用してプロセス分離モードを直接要求する必要があります。 ホストでは Windows 10 ビルド 17763 以降を実行している必要があり、Docker バージョンは Engine 18.09 以降である必要があります。
重要
Windows Server コンテナーとホスト オペレーティング システムはカーネルを共有しているため、ホストとコンテナーのイメージ バージョン タグが一致していることを確認する "必要があります"。そうでない場合、コンテナーの起動に失敗したり、未定義の動作が発生したりする可能性があります。 Hyper-V コンテナーは、より新しいホストでより古いコンテナー イメージを実行する代わりに使用できます。たとえば、Windows Server 2022 ホスト上の Windows Server 2019 イメージは Hyper-V 分離でのみ機能します。
Docker コマンドを使用して分離モードを指定する方法
Docker とコンテナー ランタイムについては次のユニットで詳しく説明しますが、このコンテキストでは、コンテナーの作成に使用できる一連のコマンドが Docker に用意されていることを認識しておけばよいでしょう。 Docker を使用してコンテナーを作成する場合、--isolation パラメーターと、プロセス分離モードまたは Hyper-V 分離モードのいずれかを使って分離モードを指定できます。
- プロセス分離モードを使用してコンテナーを作成するには、次のコマンドを使用します。
docker run -it --isolation=process mcr.microsoft.com/windows/servercore:ltsc2019 cmd
- Hyper-V 分離モードを使用してコンテナーを作成するには、次のコマンドを使用します。
docker run -it --isolation=hyperv mcr.microsoft.com/windows/servercore:ltsc2019 cmd`
Windows Server コンテナーではなく Hyper-V コンテナーを使用すべき場合
Hyper-V コンテナーと Windows Server コンテナーのどちらを使用するかを選択する際に考慮すべき要素は、信頼、セキュリティ、分離です。 次の場合は、Hyper-V コンテナーの使用を検討してください。
アプリケーションには専用の Windows カーネルが必要である。
次の理由からアプリケーションの信頼が必要である。
ホスト OS により、その上で動作するアプリケーションが完全に信頼されていない可能性がある。
同じホスト上で並列で実行されているアプリケーション間に相互の信頼関係がない可能性がある。
より高いセキュリティが必要である。
より高度な分離が必要である。
このような判断を迫られるシナリオには次のようなものがあります。
クラウド プロバイダー。 ハードウェア リソースが共有および利用される場合、さまざまな顧客から実行されるワークロードに、前述のすべての要因が適用される可能性があります。
コンプライアンス ポリシー。 場合によっては、ワークロードと実行中のアプリケーションにおいて分離とセキュリティの強化を必要とするセキュリティ、データ、またはその他のポリシーに従う必要があります。
ランタイム環境 (開発環境、テスト環境、または運用環境とも呼ばれます)。 開発環境やテスト環境では追加の分離は必要ないかもしれませんが、運用環境では必要になるかもしれません。 また、マイクロサービス モデルの分散型アプリケーションを使用する場合もあります。 マイクロサービス アプリケーション アーキテクチャでは、異なるコンテナー ワークロードには異なる分離ニーズがあり、それを考慮する必要があるかもしれません。
注意
Kubernetes など、すべてのオーケストレーション サービスによって、Hyper-V コンテナーがサポートされているわけではありません。 Hyper-V コンテナーはサポートされていないが、より大きな分離が必要なときは、サイド バイ サイドで実行できる一連のコンテナーを完全な VM で繰り返し実行する必要がある場合があります。