仮想化道場

Windows Server 2016 Technical Preview 3のコンテナ機能を見る・前編

コンテナのおさらい

 8月末に提供されたWindows Server 2016 Technical Preview 3(TP3)は、以前から約束されていたようにDockerコンテナがサポートされた。今回は、そのDockerコンテナ対応を中心に、Windows Server 2016 TP3を紹介していく。

コンテナって何?

 Windows Server 2016 TP3を紹介する前に、コンテナに関して解説していきたい。

 コンテナは、仮想化テクノロジーの一種だ。

 一般によく知られているハイパーバイザーは、OSの下層(ハードウェアとOSの間)に置かれ、ハードウェアを抽象化して、1つのハードウェア上で複数のOSを動かすテクノロジーである。

 1つのハードウェア上で複数の仮想マシンを動作させ、その上でOSを動かすため、各環境は分離されている。したがって、仮想マシン上のアプリケーションでトラブルが起こっても、ほかの仮想マシンに影響をおよぼすことはほとんどない。ただ、1つのハードウェア上に複数の仮想マシンが搭載され、別々のOSが動作する仕組み上、仮想マシンの数だけOSが動作する、つまりハードウェアリソースを消費するというデメリットもある。

 1つのハードウェアで数台の仮想マシンを動かしているだけなら、OSのリソース負荷はそれほど問題にならない。しかし、数十台、数百台のOSを1つのハードウェアで動かすとなると、そのリソースの負荷も大きくなってくる。同じバージョンのWindows Serverばかりなら、何とかOSのリソースを集約してほしいと思うだろう。

 一方、コンテナはハイパーバイザーとは異なり、OS自体に手を入れて、アプリケーションが動作する環境(OS)を仮想化しようというものだ。大ざっぱに言ってしまえば、OSは基本的な機能だけにコンパクト化して、アプリケーションが動作するために必要な環境を差分として中間層を用意する。その中間層とアプリケーションが一体となって動作する。

 異なるバージョンのプログラムが共存できない場合でも、コンテナを利用すれば、簡単に異なるバージョンで動作するアプリケーションを実行することができる。例えば、PHP 4.0を使用しているアプリケーションとPHP 5.0を使用しているアプリケーションを1つのOS環境で利用することができる。

 OS自体は1つだけのため、コンテナが複数あっても、OSに関するリソースの負荷は大きくない。

 もともとコンテナは、ハイパーバイザーよりも前に開発されていた仮想化のテクノロジーだが、現在、これだけコンテナ化が流行してきたのは、2013年にLinux環境においてDockerが登場したことからだ。

 安定して動作するDockerコンテナ環境が登場したことで、多くのデベロッパーがDockerコンテナを採用し始めた。例えば、AWSがクラウドサービスに採用したり、GoogleがDockerコンテナの管理システムとしてKubernetes(クーバンネティス)を開発して、コミュニティに提供したりしている。

コンテナ化によりアプリケーションはどう変わるのか?

 ハイパーバイザーにより、サーバーは集約化が行われた。1つのハードウェア上に複数の仮想OS環境を搭載するのは当たり前になった。また、ハイパーバイザーの登場により、コンピューティング環境を低価格で時間貸しするパブリッククラウドサービスが登場した。AWSやAzureなども、ハイパーバイザーができたことでビジネス化されたといえる。

 Dockerコンテナに注目が集まったのは、さまざまな要因があるが、何よりも、DevOps(開発と運用)のサイクルを簡単に回せるようになるからだ。

 IT管理者は、現在運用している環境に、アプリケーションをインストールするのは非常に慎重になっている。これは、開発されたアプリケーションが、どのようなミドルウェアを使用しているのか、ほかのアプリケーションとトラブルが起こらないのかを慎重にチェックせず、安易に新規アプリケーションをインストールしてしまうと、既存のアプリケーションにまで悪影響をおよぼす可能性があるからだ。

 しかし、急速に変化していくビジネス環境を考えれば、短期間で新しいアプリケーションを開発してユーザーに提供し、ユーザーのフィードバックを受けて、さらにブラッシュアップや再開発を繰り返していくという、ラピッド・デベロップメントが当たり前になってくる。

 ラピッド・デベロップメントは、運用側においては相当な負荷になっている。しかしITの重要性が増し、ビジネスの中核にITが置かれるようになると、ラピッド・デベロップメントに対応できないようでは、ビジネス自体が陳腐化してしまう可能性もある。

 Dockerコンテナでは、ミドルウェアの違いに関しても、差分をとって、アプリケーションごとに異なるミドルウェア環境で動作させる、といったことができるため、ハイパーバイザーよりも簡単にアプリケーションのDevOpsができるようになった。サーバー側ではミドルウェアをOSにインストールするのではなく、アプリケーションに付属するものとして運用することができる。これにより、バージョン違いによるトラブルは少なくなる。

 つまりDockerコンテナを利用すると、新しいアプリケーションを簡単に導入・廃棄できる。

 またDockerでは、DevOpsが容易になっただけでなく、Docker Hubというリポジトリが用意されているのもメリットといえる。これは、さまざまなコミュニティ、個人、企業が、開発したDockerコンテナを公開しているサイトで、ユーザーは、一からコンテナを開発しなくとも、既存のコンテナに自分のアプリケーションを搭載し、コンテナとして利用することができる。

 Docker Hubでは、パブリックなリポジトリだけでなく、社内に自社専用のリポジトリを用意することもできる。自社で使用する標準的なコンテナ環境を用意することで、開発者が素性の分からないコンテナを使用してアプリケーションを開発する、といったこともなくなるし、自社のコンプライアンスルールにマッチしたコンテナしか使用しないようにすることができる。

 なおMicrosoftでは、Azure上にWindows向けのコンテナのマーケットプレイスを用意する予定で、これにより、企業はミドルウェアをコンテナとして販売することもできるようになる。

 このように、コンテナは、アプリケーション開発を大きく変えると思う。今までは、モノリシックな環境においてアプリケーションは作られてきた。しかしコンテナは、サーバーをMicroServicesの集合体としていく。

 多くのアプリケーションは、さまざまなモジュールや機能を一体化して作られる。しかし、コンテナにより、アプリケーションを数多くのMicroServicesに分割して構成することができる。Microservicesごとに開発し、デバッグを行うことができる。また、機能を追加したり変更したり場合でも、MicroServicesごとの追加や改修を行える。

 もし、あるMicroServicesを改修してトラブルが起こったなら、そのMicroServicesをもとのMicroServicesに戻せばいい。これが、コンテナを使うメリットだろう。

 MicroServicesというコンセプトと同じような考え方は、これまでもSoAやEnterprise SoAなどのキーワードで提唱されているため、全く新しいモノとはいえない。しかし、Dockerコンテナという開発や運用環境が用意されたことで、実際に運用できるものになってきたといえるだろう。

Microsoftでは、パブリッククラウドのAzure、プライベートクラウド、オンプレミスサーバーなど、すべての環境でMicroServicesがサポートされるようにしようとしている

Windowsベースのコンテナが作成・運用できるWindowsコンテナ

 さて、ここからは実際のWindows環境を見ていこう。

 Windows Server 2016 TP3では、Windows Server OSを整理して、Dockerコンテナを動かせるように、新たにWindowsコンテナという機能を用意した。これにより、Windowsベースのコンテナが作成、運用できるようになった。

 注意が必要なのは、Linuxで動作しているDockerコンテナがWindows Server 2016 TP3で動作するようになったわけではない点だ。あくまでも、動作するのは、WindowsベースのDockerコンテナだけである。

Windows Server 2016は、OSを根本的にリファクタリングして、コンテナ化をサポートしている。またコンテナ化に合わせて、コンパクトなOS「Nano Server」がサポートされた
Windowsコンテナは、直接OS上でDockerコンテナをサポートする
コンテナは、Windowsのミドルウェアなどをパッケージ化してアプリケーションと一緒に動作させる。OS上では、ミドルウェアの差分などをリポジトリに登録する
コンテナはServer Coreでも動作するが、よりコンパクトなNano ServerがベストなOSだ。ただしNano Serverは、Server Coreよりも機能がそぎ落とされているため、アプリ開発には注意が必要

 Windowsコンテナでは、WindowsのPowerShellで作成したり、管理したりすることができる。ただ、PowerShellでWindowsコンテナを作成すると、Dockerから管理することができない(逆もまたしかり)。これでは不便なので、PowerShellでもDockerでもコンテナが作成・管理できるようになってほしい。もしかすると製品版では、可能になっているかもしれない。

 なおWindows Server 2016では、Windowsコンテナだけでなく、Hyper-Vコンテナが計画されている。Windowsコンテナは、Windows Server 2016上で直接Dockerコンテナをサポートしている。一方Hyper-Vコンテナは、ハイパーバイザーのHyper-V上にDockerコンテナの実行環境を構築して、コンテナが動作するようにする。Microsoftでは、Hyper-Vコンテナは、ベースのOS環境を分離することで、トラブルに強い実行環境が構築できるとしている。

 ただ、Windows Server 2016 TP3ではWindowsコンテナだけが提供されている。Hyper-Vコンテナに関しては、年末ごろにリリースされる次のTPでインプリメントされる予定だ。

Windows Server 2016では、WindowsコンテナとHyper-Vコンテナの2つが用意される。
Hyper-Vコンテナは、ハイパーバイザーのHyper-V上でコンテナを動作させる。年末にリリースされる次のTPでサポートされる予定だ

 今回は、コンテナに関して解説した。次回は、実際にWindows Server 2016 TP3でコンテナを動かしつつ解説していきたい。

山本 雅史