Windows 10 November 2019 Update(バージョン1909)の新機能の一つに、Windowsコンテナの「プロセス分離モード」に関する制限緩和があります。今回は、Windows 10のプロセス分離モード対応について振り返りながら、この新機能について紹介します。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
「Windows Server 2016」で初めて実装されたDockerのサポートは、Windows 10 Anniversary Update(バージョン1607、ビルド14393)に対しても提供されました。
Windows Serverには「Docker Enterprise for Windows Server」(旧称、Docker Enterprise Edition、Docker EE)の使用権が提供され、Windows ServerでDockerのコンテナホスト(Dockerサーバ)を構築することができ、Windowsコンテナを「プロセス分離モード」(Windows Serverコンテナ)と「Hyper-V分離モード」(Hyper-Vコンテナ)のいずれかで実行することができます。
Windows 10では、「Docker Community Edition」(Docker CE、現在はDocker Desktop Community)でHyper-V分離モードのみの実行がサポートされました。
本連載第42回では、「Stable版Docker Desktop 2.0.0.2」(Docker Engine 18.09.1)とWindows 10 October 2018 Update(バージョン1809)との組み合わせで、Windows 10でもWindowsコンテナをプロセス分離モードで実行できるようになったことを紹介しました。
Windows 10におけるプロセス分離モードへの対応は、以下の「Windows Container Version Compatibility(Windowsコンテナのバージョン互換性)」ページには現状含まれていませんが、「コンテナーについてよく寄せられる質問」ページの「Windows 10でプロセス分離モードでWindowsコンテナを実行できますか?」のところで説明されています。
また、「コンテナーについてよく寄せられる質問」ページの「コンテナーのライセンスについて、実行できるコンテナーの数に制限はありますか?」では、Windows 10でWindows Server CoreやNano ServerのベースOSイメージを使用するライセンス条件についても説明されています。
Windows 10では、テストおよび開発目的でのみ、上限なくWindowsコンテナを実行できます。それ以外の目的でWindowsコンテナを実行することはできません。それ以外の目的(運用環境での実行)にはWindows Serverのコンテナホストが必要であり、そのライセンス条件に従う必要があります。
プロセス分離モードのWindowsコンテナはホスト上のプロセスとして実行され、ホストOSと同じ容量のメモリとCPU数(論理プロセッサ数)を認識し、複数のコンテナ間でリソースを共有します。Hyper-V分離モードのコンテナには、コンテナごとに「UtilityVM」という仮想マシンが準備され、既定で仮想メモリ1GB、仮想プロセッサ2個が割り当てられます。そのため、プロセス分離モードを利用できると少ないリソースで素早くコンテナをビルドでき、スタートアップも早いという利点があります。
Windows ServerまたはWindows 10でWindowsコンテナをプロセス分離モードで実行する場合、WindowsコンテナはホストOS上のプロセスとして実行されることになります。そのため、ホストOSとWindowsコンテナのベースOSのOSビルド番号が一致している必要があります(リビジョン番号までの一致は不要)。
つまり、同じビルドのWindowsコンテナはプロセス分離モードまたはHyper-V分離モードで実行でき、下位ビルドのWindowsコンテナはHyper-V分離モードでのみ実行できます。上位ビルドのWindowsコンテナはサポートされません。
例えば、Windows 10 May 2019 Update(バージョン1903、ビルド18362)のDocker Desktopでは、Windows Server, version 1903(ビルド18362)のWindows Server CoreおよびNano Serverイメージをプロセス分離モード(Windows Serverの既定、Windows 10では--isolation=processの指定が必要)で実行できますが、それ以前のビルドのイメージを実行するにはHyper-V分離モード(Windows 10の既定、Windows Serverでは--isolation=hypervの指定が必要)で実行する必要があります(画面1、画面2)。
ホストとWindowsコンテナのビルドが一致しない場合、「Error response from daemon:……:The container operating system does not match the host operating system.」のエラーが発生します。
プロセス分離モードのビルド一致要件は、Windows Server, version 1903およびWindows 10 バージョン1903(ビルド18362)までの要件です。Windows Server, version 1909およびWindows 10バージョン1909(ビルド18363)ではこの要件が緩和され、下位ビルドのWindowsコンテナをプロセス分離モードで実行できるようになりました。
この新機能については、以下のページの「Containers on Windows」で説明されています。また、別の連載「Microsoft Azure最新機能フォローアップ」の第94回では、Windows Serverについて紹介しました。
プロセス分離モードの要件の緩和は、全ての下位ビルドに対してというわけではありません。筆者が確認した限り、Windows 10 バージョン1909(ビルド18363)の場合は、同一ビルド18363に加えて、1つ前のビルド18362のWindows Server CoreおよびNano Serverイメージをプロセス分離モードで実行することができました(画面3)。
Windows Server, version 1909では、2つ前のビルド17763のNano Serverイメージもプロセス分離モードで実行できましたが、Windows 10バージョン1909でもリリース直後は実行できましたが、その後の更新された環境では「Error response from daemon: … encountered an error during Start: failure in a Windows system call: The virtual machine or container exited unexpectedly.(0xc0370106).」というエラーが表示されたり、STOPエラー(ブルースクリーン)でホストがクラッシュしたりすることもありました。
Windows 10の品質更新プログラムの影響なのか、更新されたイメージの影響なのか、それともDocker Desktopの新バージョンの影響なのかは不明です。通常のビルド不一致のエラーとは異なりますが、Hyper-V分離モードでは引き続き問題なく実行できます(画面4)。
Windows Server 2016 Hyper-Vで利用可能になった、Windowsを実行するHyper-V仮想マシンに対する「PowerShell Direct」は、Windowsコンテナに対してもサポートされます。PowerShell DirectによるWindowsコンテナへの接続は、「docker attach」や「docker exec」コマンドのようにWindowsコンテナのシェルに対話接続するのに利用できます。実は、この機能につい最近まで気が付きませんでした。
Hyper-V仮想マシンについては、「Enter-PSSession」および「Invoke-Command」コマンドレットの「-VMName」または「-VMId」オプションに仮想マシンを指定することで、PowerShell Remotingと同じように仮想マシンのPowerShellセッションに接続できます。Windowsコンテナについては、「-ContainerId」オプションが用意されています(画面5)。
Enter-PSSessionコマンドレットのヘルプにはこのオプションがありますが、Invoke-Commandコマンドレットのヘルプにはありません。しかし、Invoke-Commandコマンドレットでも-ContainerIdオプションは機能します。
Enter-PSSessionやInvoke-Commandコマンドレットの-ContainerIdオプションにコンテナIDを指定すると、「docker run」コマンドの「-it(対話的)」や「-d(デタッチ)」オプションで実行中のWindowsコンテナに接続することができます。
このとき指定するコンテナIDとは、「docker ps」で表示される短いIDではなく、「docker ps --no-trunc」で表示される完全なIDである必要があります。docker runを-dオプションで実行した場合は、実行結果としてこの完全なIDが返されます。
その他の注意点としては、Windows PowerShellは管理者として実行する必要があることと、接続先のWindowsコンテナがWindows PowerShellを搭載していることです。Windows Server CoreイメージはWindows PowerShell 5.1を標準搭載しているので、PowerShell Directで接続できます。現在サポートされるNano Serverイメージは、Windows PowerShellや関連コンポーネントが削除されているため、PowerShell Directで接続することはできません。
岩手県花巻市在住。Microsoft MVP:Cloud and Datacenter Management(2019-2020)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。Microsoft製品、テクノロジーを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。近著は『ITプロフェッショナル向けWindowsトラブル解決 コマンド&テクニック集』(日経BP社)。
Copyright © ITmedia, Inc. All Rights Reserved.