以下の画面4は、Windows 10に「Docker for Windows」をインストールして、Docker Hubから取得(docker pull)したLinuxコンテナを実行(docker run)したものです。
この環境を技術的に図示すると、以下の図3のようになります。
図3を見れば分かるように、Windows上でLinuxコンテナが動いているように“見せているだけ”で、その実体はHyper-Vの仮想マシン(MobyLinuxVM)で実行されるLinuxのネイティブなDockerホスト環境のDockerデーモンに、Windows上のDockerクライアントからリモート接続(名前付きパイプを介して)しているのです。
Docker for Windowsは、Windows 10 Anniversary Update以降の「コンテナ」機能に対応しており、こちらに切り替えることで、WindowsコンテナをHyper-Vコンテナとして実行することも可能です(画面5)。
その場合、Linux仮想マシン内のDockerデーモンは使用せず、Windows側でDockerバイナリをデーモンとして起動するDockerサービスがWindowsコンテナのサポートを提供し、Dockerクライアントはローカルのデーモンに接続することになります(後述の図5を参照)。
以下の画面6は、Hyper-VコンテナとしてLinuxコンテナを実行するという、Windows 10 Fall Creators Update(バージョン1709)、およびWindows Server バージョン1709(Server Coreのみ)以降で利用可能になる予定の新機能です([注]バージョン1709は米国時間2017年10月17日にリリースされましたが、この機能についてはプレビュー段階です)。
このテクノロジーの実現方式を見る前に、Windows Server 2016におけるWindowsコンテナの実装を確認しておきましょう。
Windowsコンテナは、簡単に言うと、Docker Hubで提供されるWindowsのベースOSイメージを使用して作成、実行する、Windows向けのアプリケーション実行環境を提供するDockerコンテナです。Windows Server 2016はWindowsの機能として「コンテナ」を提供します。また、最新のDockerのソースコードには、Windowsコンテナのサポートが統合され、Windows Server 2016には「Docker Enterprise Edition(Docker EE)」の使用権が含まれます。
そして、Docker Hubでは、運用環境向けにWindows Server 2016のServer Coreインストールをベースにした「microsoft/windowsservercore」と、Nano Serverインストールをベースにした「microsoft/nanoserver」、そしてこれらのベースOSイメージにアプリケーションを追加した幾つかのイメージが公開されています(本稿はWindows Server バージョン1709のリリース以前に執筆したものであることに注意してください)。
Windows Server 2016では、これらのベースOSイメージから作成したWindowsコンテナを「Windows Serverコンテナ」(--isolation=process)、または「Hyper-Vコンテナ」(--isolation=hyperv)のいずれかの分離モードで実行することができます。Windows 10は、Hyper-Vコンテナの作成と実行をサポートしています。
Windows ServerコンテナはLinuxのDocker環境と同じように、ホストOSのカーネル上で動く、プロセスベースのサンドボックス環境を提供します。これを図示したものが、以下の図4になります。
Dockerクライアントによる操作やDockerデーモン(サービス)のリモート接続の構成、「Dockerfile」による構成など、ほとんどがLinuxのDocker環境と共通です。
なお、Windows Serverコンテナの場合、Windowsコンテナの実体はホストOSのカーネル上で動作するプロセスです(画面7)。そのため、ホストOSがWindows Server 2016(ビルド14393)なら、同じビルド番号であるバージョン10.0.14393.xのベースOSイメージから作成したWindowsコンテナの実行が可能です。
LinuxのネイティブなDocker環境では、「cgroups」というプロセスベースのサンドボックス環境のコンテナ技術が用いられています。Windows Serverコンテナは、Windowsの「ジョブ」(プロセス、スレッド、ジョブのジョブ)の機能を拡張した「サーバサイロ(Server Silo)」という技術が利用されています。また、ネットワークやディスクI/Oには、Hyper-Vの仮想スイッチやNetNAT、Windowsファイアウォール、仮想HDD(vhd/vhdx)の機能が利用されています。
一方、Hyper-Vコンテナは、Windows Serverコンテナの環境をさらにHyper-Vの仮想化技術で分離し、コンテナ間およびコンテナとホスト間の隔離性を高めたものです(画面8)。
こちらは、ホストOSのカーネルに依存しないため、異なるバージョンのベースOSイメージのWindowsコンテナを実行できます(少なくとも下位バージョンの実行は可能になると思いますが、変化が激しい分野ですので、上位バージョンの実行サポートは難しいかもしれません)。
そして、前出の画面6で示したように、Hyper-Vの分離によりLinuxコンテナの実行も可能になる予定です。これを図示したものが、以下の図5になります。
Hyper-Vコンテナでは「Utility VM」と呼ばれる分離環境(Hyper-V仮想マシンのようなものですが、Hyper-Vからは見えません)がOSカーネルを提供し、その上にサンドボックス環境が準備され、コンテナが実行されます。
Windowsコンテナの場合は、ベースOSイメージの一部として、Hyper-Vコンテナ用のUtility VMのイメージ(ファイルシステムとレジストリハイブ)が用意されています。Linuxコンテナの場合、プレビュー時点では、「LinuxKit」のコンテナ用Linux、またはUbuntuベースのコンテナ用LinuxがUtility VMの機能を提供します。
岩手県花巻市在住。Microsoft MVP:Cloud and Datacenter Management(Oct 2008 - Sep 2016)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。Microsoft製品、テクノロジーを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。近著は『Windows Server 2016テクノロジ入門−完全版』(日経BP社)。
Copyright © ITmedia, Inc. All Rights Reserved.