分離モード
適用対象: Windows Server 2025、Windows Server 2022、Windows Server 2019、Windows Server 2016
Windows コンテナーには、process
と Hyper-V
分離という 2 つの異なるランタイム分離モードが用意されています。 両方の分離モードで実行されているコンテナーは、同じように作成、管理、および機能します。 また、同じコンテナー イメージを生成して使用します。 分離モードの違いは、コンテナー、ホスト オペレーティング システム、およびそのホストで実行されている他のすべてのコンテナーの間で作成される分離の程度です。
プロセスの分離
これはコンテナーの "従来の" 分離モードであり、Windows コンテナーの概要で説明されています。 プロセスの分離では、名前空間、リソース制御、およびその他のプロセス分離テクノロジによって提供される分離を使用して、特定のホスト上で複数のコンテナー インスタンスが同時に実行されます。 このモードで実行する場合、コンテナーはホストと互いに同じカーネルを共有します。 これは、Linux コンテナーの実行方法とほぼ同じです。
何が隔離されるのか
Windows コンテナーは、さまざまなオペレーティング システム名前空間へのアクセスを仮想化します。 名前空間は、名前を介して情報、オブジェクト、またはリソースへのアクセスを提供します。 たとえば、ファイル システムはおそらく最もよく知られている名前空間です。 コンテナーごとに分離される Windows には、多数の名前空間があります。
- ファイル システム
- 登録簿
- ネットワーク ポート
- プロセスとスレッド ID の領域
- オブジェクト マネージャー名前空間
分離境界を貫通する
分離境界を超えることが有益な場合が存在します。 これらの操作はユーザーが意図的に要求する必要があり、コンテナーのセキュリティ体制が損なわれる可能性があるため、慎重に検討する必要があります。 Windows コンテナーでは、次のものがサポートされています。
- ホストからコンテナー への共有ファイルまたはボリュームのマッピングを する
- ホストからコンテナーへの名前付きパイプのマッピング
- ホストからコンテナーへのポートのマッピング
- ネットワーク名前空間のカスタマイズと 共有
- ホストデバイスの可視性をコンテナー に共有する
現在、Windows コンテナーでは次の機能はサポートされていません。
- 共有メモリ
- 同期オブジェクトの共有 (セマフォ、ミューテックスなど)
- 共有プロセス名前空間
Hyper-V 分離
この分離モードにより、セキュリティが強化され、ホストとコンテナーのバージョン間のより広範な互換性が提供されます。 Hyper-V 分離では、複数のコンテナー インスタンスがホスト上で同時に実行されます。ただし、各コンテナーは高度に最適化された仮想マシン内で実行され、実質的に独自のカーネルを取得します。 仮想マシンが存在すると、各コンテナーとコンテナー ホスト間でハードウェア レベルの分離が提供されます。
分離の例
コンテナーを作成する
Docker を使用した Hyper-V 分離コンテナーの管理は、プロセス分離コンテナーの管理とほぼ同じです。 Docker を使用して分離 Hyper-V コンテナーを作成するには、--isolation
パラメーターを使用して --isolation=hyperv
を設定します。
docker run -it --isolation=hyperv mcr.microsoft.com/windows/servercore:ltsc2019 cmd
Docker によるプロセス分離を使用してコンテナーを作成するには、--isolation
パラメーターを使用して --isolation=process
を設定します。
docker run -it --isolation=process mcr.microsoft.com/windows/servercore:ltsc2019 cmd
Windows Server で実行されている Windows コンテナーは、既定でプロセス分離で実行されます。 Windows 10 Pro および Enterprise で実行されている Windows コンテナーは、既定で Hyper-V 分離して実行されます。 Windows 10 October 2018 更新プログラム以降、Windows 10 Pro または Enterprise ホストを実行しているユーザーは、プロセスを分離して Windows コンテナーを実行できます。 ユーザーは、--isolation=process
フラグを使用してプロセスの分離を直接要求する必要があります。
警告
Windows 10 Pro と Enterprise でのプロセス分離を使用した実行は、開発/テストを目的としています。 ホストは Windows 10 ビルド 17763 以降を実行している必要があり、エンジン 18.09 以降の Docker バージョンが必要です。
運用環境の展開のホストとして Windows Server を引き続き使用する必要があります。 Windows 10 Pro および Enterprise でこの機能を使用することで、ホストとコンテナーのバージョン タグが一致することも確認する必要があります。そうしないと、コンテナーの起動に失敗したり、未定義の動作が発生したりする可能性があります。
分離の説明
この例では、プロセスと Hyper-V 分離の分離機能の違いを示します。
ここでは、プロセス分離コンテナーがデプロイされており、実行時間の長い ping プロセスをホストします。
docker run -d mcr.microsoft.com/windows/servercore:ltsc2019 ping localhost -t
docker top
コマンドを使用すると、コンテナー内に表示されているように ping プロセスが返されます。 この例のプロセスの ID は 3964 です。
docker top 1f8bf89026c8f66921a55e773bac1c60174bb6bab52ef427c6c8dbc8698f9d7a
3964 ping
コンテナー ホストでは、get-process
コマンドを使用して、実行中の ping プロセスをホストから返すことができます。 この例では 1 つあり、プロセス ID はコンテナーの ID と一致します。 コンテナーとホストの両方から同じプロセスが表示されます。
get-process -Name ping
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id SI ProcessName
------- ------ ----- ----- ----- ------ -- -- -----------
67 5 820 3836 ...71 0.03 3964 3 PING
これに対し、この例では、ping プロセスを使用して Hyper-V 分離コンテナーも開始します。
docker run -d --isolation=hyperv mcr.microsoft.com/windows/servercore:ltsc2019 ping localhost -t
同様に、docker top
を使用して、実行中のプロセスをコンテナーから返すことができます。
docker top 5d5611e38b31a41879d37a94468a1e11dc1086dcd009e2640d36023aa1663e62
1732 ping
ただし、コンテナー ホストでプロセスを検索すると、ping プロセスが見つからず、エラーがスローされます。
get-process -Name ping
get-process : Cannot find a process with the name "ping". Verify the process name and call the cmdlet again.
At line:1 char:1
+ get-process -Name ping
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (ping:String) [Get-Process], ProcessCommandException
+ FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShell.Commands.GetProcessCommand
最後に、ホストでは、実行中のコンテナーをカプセル化し、実行中のプロセスをホスト オペレーティング システムから保護している実行中の仮想マシンである、vmwp
プロセスが表示されます。
get-process -Name vmwp
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id SI ProcessName
------- ------ ----- ----- ----- ------ -- -- -----------
1737 15 39452 19620 ...61 5.55 2376 0 vmwp