分離モード
適用対象: Windows Server 2022、Windows Server 2019、Windows Server 2016
Windows コンテナーには、2 種類のランタイム分離モードがあります。process
による分離と Hyper-V
による分離です。 両方の分離モードで実行されるコンテナーは、同様に作成、管理され、機能します。 また、作成および使用するコンテナー イメージも同じです。 分離モードの違いは、コンテナー、ホスト オペレーティング システム、およびそのホストで実行されている他のすべてのコンテナーの間に生じる分離の程度です。
プロセスによる分離
これはコンテナーの "従来の" 分離モードであり、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 による分離を使用して実行されます。 2018 年 10 月の Windows 10 更新プログラム以降、Windows 10 Pro または Enterprise ホストを実行しているユーザーは、プロセスによる分離を使用して Windows コンテナーを実行できるようになりました。 ユーザーは、--isolation=process
フラグを使用してプロセスによる分離を直接要求する必要があります。
警告
Windows 10 Pro および Enterprise 上でのプロセスによる分離を使用した実行は、開発およびテストを目的としています。 ホストでは Windows 10 ビルド 17763 以降を実行している必要があり、Docker バージョンは Engine 18.09 以降である必要があります。
運用環境のデプロイでは、引き続き 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 プロセスを返すことができます。 この例では、コンテナーの ID と一致するプロセス ID は 1 つです。 コンテナーとホストの両方で表示されるプロセスは同じです。
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