仮想化道場

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

実際に試してみよう!

 前回は、コンテナの重要性を解説した。今回は、Windows Server 2016 Technical Preview 3(TP3)を使って、実際にコンテナを試してみよう。

コマンドラインのPowerShellでの操作が前提に

 今回は、適当なサーバーが手元になかったため、Windows Server 2016 TP3のテストに、パブリッククラウドのMicrosoft Azureを使用した。AzureのギャラリーにはWindows Server 2016 TP3が用意されているため、テスト環境も簡単に構築できる。

 今回紹介するコンテナなどのテストはAzureで問題なくできるが、オンプレミスの物理環境とは異なるため、もしかすると異なる部分があるかもしれない。その点、ご了承いただきたい。

Azureには、Windows Server 2016 TP3がギャラリーに用意されている。このため、簡単にAzure上でテストできる

 またWindows Server 2016 TP3は英語版のみが提供されているので、日本語表示は正式にはサポートされていない。機能によっては、日本語化するとトラブルが起きて、動作しなくなる場合もあるようだ。このため、当面は英語環境のままでテストしていった方がいいだろう。今回も、英語環境でテストを行った。

 Windows Server 2016 TP3では、Windowsコンテナをサポートしているが、現状ではコマンドライン(PowerShell)での操作だけだ。コンテナの操作、管理などのGUIが用意されているわけではない。このため、PowerShellをある程度知っていないと使えないだろう。Windows Server 2016のリリース版において管理用のGUIが用意されるかどうかは、現状では不明だ。ただ、コンテナを使っていく上ではPowerShellが非常に便利なため、今後のことを考えれば、IT管理者はPowerShellを覚えておく方がいい。

 さて、Windows Server 2016 TP3でWindowsコンテナを使えるようにするには、Windows Server 2016 TP3にコンテナホストを構築する必要がある。

 まず、「Add Roles and Features」の「Features」で「Container」を追加する必要がある。ただ、これですぐにWindowsコンテナが利用できるわけではない。コンテナホストを設定する必要がある。

ContainerをWindows Server 2016 TP3に機能追加する

 コンテナホストを手動で設定するのは、非常に手順が多く面倒くさい。そこで利用したいのが、GitHubに用意されている、Windowsコンテナのセットアップ用のスクリプトだ。

 ます、Windows Server 2016 TP3のコマンドプロンプトを管理者権限で起動して、PowerShellを管理者権限で起動する(コマンドプロンプトを通常ユーザーで起動して、PowerShellを管理者権限で起動してもいい)。

 その後、

wget -uri http://aka.ms/setupcontainers -OutFile .\ContainerSetup.ps1

を実行する。

 すると、GitHubからContainerSetup.ps1というスクリプトを現在のディレクトリに作成してくれる。

 その後、

ContainerSetup.ps1

を実行する。

 このスクリプトでは、Windows Server 2016 TP3内部で、仮想スイッチやNATの構成を行うほか、GitHubからWindows Serverコンテナのファイルをダウンロードし、セットアップを行ってくれる。

 便利ではあるのだが、スクリプトが終了するまで非常に時間がかかった。GitHubからのファイルのダウンロードに時間がかかったのか、原因はよく分からなかったが、Azureの環境において1時間ほどかかったている。途中で中断すると、いろいろ面倒なことになるため、セットアップが終了するまでそのままにしておく。

PowerShellを起動して、GitHubからSetupcontainer.ps1をダウンロードしてくる
SetupContainer.ps1を実行して、Containerのセットアップを行う。GitHubからさまざまなファイルをダウンロードするためか、セットアップの終了に1時間ほどかかった
Get-VMSwitchコマンドでは、コンテナセットアップが作成した仮想ネットワークスイッチの状態が確認できる(ここではNATになっている)。また、Get-ContainerImageコマンドでは、ダウンロードされたコンテナイメージが表示されている(Server Coreがダウンロードされている)

 セットアップが終了した後に、再起動を行う。

 これで、Windowsコンテナが利用できる。Windowsコンテナでは、GUIが搭載されたフルスペックのWindows Serverが搭載されているわけではなく、Windows Server 2016のServer Coreに相当する環境が提供されている(現状、Windows Server 2012/2008などのOS環境をWindowsコンテナのOS環境として利用することはできない)。将来的には、Windows Server 2016で新たにサポートされるNano Serverも、Windowsコンテナとして提供される予定だ。

 GUIが搭載されたフルスペックのWindows Server 2016が、Windowsコンテナとしては提供されるかどうかは不明だ。しかしコンテナの使われ方を考えると、GUIがない、コンパクトなOSとして利用するのが便利だろう。

 なお、ハイパーバイザーとコンテナの違いとして、一般的には、コンテナで利用できるOS環境としては、同じOSがベースとなるという点が挙げられる。つまりハイパーバイザーのように、複数のバージョンのOSを混在して利用することはできない。

 Windows Server 2016のコンテナにこのような制限があるかどうかは、現状では不明だ
Windows Server 2016で利用できるWindowsコンテナは、GUIなしのWindows Server 2016のServer CoreやNano Server(予定)となっているため、OSのカーネルを大幅に変更した新バージョンがリリースされると、Windowsコンテナにも影響が出てくる。ただWindows Server 2012とWindows Server 2012 R2などのように、OSカーネルにあまり変更がない状況では動作する可能性もある。このあたりは、Windows Server 2016が正式にリリースされてからはっきりしてくるだろう。

 また、実際にWindowsコンテナが利用される環境を考えれば、Windows Server 2016上でWindowsコンテナを構成して、アプリケーションをインストールするのではなく、開発環境のVisual StudioでWindowsコンテナを構成し、アプリケーションを開発して、パッケージ化することになるだろう。

 Visual Studio 2015では、Docker向けのツールが用意されている。このツールを利用すれば、Docker APIを経由して、Windowsコンテナにアプリケーションが展開できる。ただし厳密に言えば、Dockerは、Windows Server 2016のカーネルに追加されるWindowsコンテナにアクセスするための、Docker用のサービスを経由して利用できる(このため、PowerShellで直接コントロールするWindowsコンテナとDockerコンテナは若干異なる)。

実際にWindowsコンテナを動かしてみよう

 WindowsコンテナはGUIを持たないため、見た目はあまりにも地味だ。動作しているWindowsコンテナにアクセスするにはリモートコンピュータにアクセスするPSセッションを利用する。このため、見た目はWindowsコンテナが動作しているか分かりにくい。

 まず、Windowsコンテナを作成する。PowerShell環境において、

$cont01 = New-Container -name "Cont01" -ContainerImageName WindowsServerCore -SwitchName "Virtual Switch"

を実行する。

 このコマンドでは、cont01という名称で、Server Coreベースのコンテナを作成する。ネットワークは、コンテナのセットアップ時に作成されているVirtual Switchを使用する。
 これにより、cont01というWindowsコンテナは、仮想ネットワークに接続され、リモートアクセスができるようになる。Windowsコンテナのネットワークアドレスは、起動した順番に172.16.0.0からアドレスが振られていく。コンテナホストに172.16.0.1が付与されるため、作成したWindowsコンテナには、172.16.0.2が振られる。

 作成したWindowsコンテナを起動するには

Start-Container -Name "Cont01"

をPowerShellに入力する。

Windowsコンテナを作成して起動する

 さらに、作成したWindowsコンテナにアクセスするには

Enter-PSSession -ContainerId $cont01.ContainerID -RunAsAdministrator

とPSセッションを使ってアクセスする。

PSセッションで作成したWindowsコンテナにアクセス
作成したWindowsコンテナにPingを打ってみる

 Windowsコンテナの作成と起動は、非常に早く30秒ほどで終わってしまう。これは、Windowsコンテナ自体のサイズが小さいことにも由来する。Server CoreのWindowsコンテナのサイズをチェックすると9GBと表示されるが、コンテナホストとの差分だけしか持っていないため、実際には、1~2GBぐらいと考えられる。

 さて、コンテナの管理を行うためには、状態を確認する「Get-container」コマンド、コンテナを停止するには「Stop-container -Name ”コンテナ名”」、コンテナを削除するには「Remove-Container -Name ”コンテナ名”」を利用する。

 実際にコンテナを停止して、削除するには、瞬時に終わってしまう。ハイパーバイザーなどの環境では、これほど簡単にOS環境を作成したり、削除したりすることはできない。

Get-containerコマンドでコンテナの状態を確認
Stop-Containerコマンドで、コンテナを停止する
Remove-Containerコマンドで、コンテナを削除する
再度、WindowsコンテナにPingを打つ。すでに、コンテナを削除しているため、Pingがタイムアウトする

 Windowsコンテナにアクセスするのに、PSセッションを使用したが、見た目が分かりにくいため、リモートデスクトップ(RDP)を使ってみた。

 RDPを使用するためには、先に、PSセッションでターゲットになるWindowsコンテナにアクセスして

net user administrator パスワード

でadministratorのパスワードを入力。

 さらに、

net user administrator /active:yes

で、RDPのアクセスを許可する。

 これで、WindowsコンテナのIPアドレスを使って、RDPでアクセスできる。ただし、作成したWindowsコンテナはServer Coreのため、RDPにはコマンド画面が表示されているだけだ。

Windowsコンテナのadministratorのパスワードを設定し、RDPアクセスを許可する
RDPでWindowsコンテナにアクセス
RDPでWindowsコンテナにアクセスすると、Server Coreベースのためコマンド画面が表示されている。ここでは、sconfigを実行してみる

*****

 実際、Windows Server 2016 TP3のWindowsコンテナを試してみて、コンテナの良さは感じたが、現状では、なんとかコンテナがWindows Serverでサポートされた、というだけだ。管理用のツールなど、まだまだそろっていないモノが多い。実際、Windows ServerベースのDocker Hubなどのカタログサービスなども用意されていない。

 Dockerとの関係においても、PowerShellで作成したWindowsコンテナは、Dockerサービスでコントロールできない問題点もある。このあたりは、リリース時には相互に運用できるようになってほしい。

 また、開発ツールのVisual Studioとの連携も、まだまだといえる。Visual Studio上で必要なWindowsコンテナを構成して、アプリケーションを開発し、パッケージ化し、パブリッシュできるようになれば、DevOpsのサイクルがコンテナにおいてもできあがるので、ぜひ実現してほしい。

 実際にWindows Server 2016がリリースされるのは、2016年の後半になるため、現状ではまだまだこんなところなのだろうか、という印象だが、コンテナ以外にもいろいろと楽しみな機能がそろっているので、製品版に向けて進化していくのを楽しみにしている。

 2015年の年末ごろになる予定の次のTechnical Previewでも、レビューをお届けしたい。

山本 雅史