Windows Sysinternalsの「Process Explorer(Procexp.exe)」ユーティリティーを使用して、Windowsコンテナの実行と終了の様子を見てみましょう。まずは、Windows 10の既定のHyper-Vコンテナ(Hyper-V分離)として実行してみます。
「docker run」コマンドを実行すると、「vmcompute.exe」プロセス(Hyper-Vホストコンピューティングサービス)の子プロセスとして、新たに「vmwp.exe」プロセス(仮想マシンワーカープロセス)と「vmmem」プロセスが一つずつ生成されます(画面3のProcess Explorerで緑色にハイライトされた2プロセス)。これらは分離されたカーネル環境をコンテナに提供するもので、Hyper-Vコンテナごとに生成されます。
また、Hyper-V分離をサポートするために、1つのvmwp.exeプロセスと2つのvmmemプロセスが常駐しています。前出の画面3を見ると、約1GBのメモリが新しいコンテナのためのプロセス専用に割り当てられているのが分かるでしょう(Private Bytes)。
対話的に実行中のコンテナを「exit」コマンドで終了すると、コンテナ用に生成された2つのプロセスも終了します(画面4のProcess Explorerで赤色にハイライトされた2プロセス)。
一方、Windows Serverコンテナ(プロセス分離)として実行した場合、新たにvmwp.exeプロセスとvmmemプロセスが生成されることはありません。
代わりに、Windows Serverコンテナごとに「CExecSvc.exe」プロセス(Container Execution Agent)が生成され、その子プロセスとして「conhost.exe」プロセス(コンソールウィンドウホスト)と孫プロセスとして「powershell.exe」プロセス(Windows PowerShell)が生成されます。Process Explorerで見るこれらのプロセスツリーは、ホスト(Windows 10)のカーネル環境で実行されるプロセスにすぎないのです(画面5、画面6)。
プロセス分離のWindows Serverコンテナでは、Docker EngineおよびWindows 10のコンテナ機能が、ファイルシステム構造などコンテナ用の抽象化レイヤーを提供し、コンテナはホストのカーネルを共有します。そのため、CPUやメモリリソースをコンテナ専用に割り当てる必要もなく、少ないリソースでコンテナを実行でき、コンテナの起動時間も短縮されます。これは開発者にとって多くのメリットがあるでしょう。
ここまでの例では「servercore:1809」イメージを使用しましたが、Windows 10 バージョン1809上では「nanoserver:1809」イメージをプロセス分離で実行することも可能です。以下の画面7は、「nanoserver:1803」をHyper-V分離、「nanoserver:1809」をプロセス分離、「Linuxコンテナ(ubuntu)」をLCOW(Docker Engine 18.09から--platform=linuxオプションの指定は不要)で実行しているところです。
注意点があるとすれば、Hyper-Vコンテナはホストと同一バージョンおよび下位バージョンのWindowsコンテナイメージを実行できますが、Windows Serverコンテナはホストのカーネルを共有するため、ホストのOSビルドとイメージのOSビルドが一致している必要があります。例えば、Windows 10 バージョン1809(OSビルド10.0.17763.x、.xは一致していなくてよい)上で実行できるのは、同じOSビルドのnanoserver:1809およびservercore:1809です。
岩手県花巻市在住。Microsoft MVP:Cloud and Datacenter Management(2018/7/1)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。Microsoft製品、テクノロジーを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。近著は『ITプロフェッショナル向けWindowsトラブル解決 コマンド&テクニック集』(日経BP社)。
Copyright © ITmedia, Inc. All Rights Reserved.