Hyper-VコンテナとしてIISコンテナを作ってみる

新しい仮想化技術の選択肢「Windowsコンテナ」

Windows Server 2016で実装される予定の「Windowsコンテナ」はこれまでHyper-V上の仮想マシンを利用してきたユーザーにとって、新しい仮想化技術の選択肢を提供するものとなっています。

今回は、「Hyper-Vコンテナ」を利用することでコンテナのメリットを生かしつつ、より安定した、より安全なアプリケーションの実行に特化した隔離環境を作成する方法をご紹介します。

※今回の内容はWindows Server 2016 Technical Preview 4の英語版を元に操作を行っています。

Windowsコンテナとは

コンテナ技術は、Linuxの世界ではDockerをはじめすでに利用可能な環境が提供されています。コンテナはプラットフォームとなるコンテナホストとOSのカーネル部分を共通化し、コンテナ内でアプリケーションの実行環境のみをパッケージ化して実行するテクノロジーです。コンテナ技術はこれまでの仮想マシンに次ぐ、新しい仮想化技術の進化と言われています。

コンテナ内のアプリケーションは他のアプリケーションに影響されることなく、また、影響することなく独立した領域で実行します。コンテナを利用する場合のメリットがこちらです。

・コンテナごとにOSカーネルが読み込まれるわけではないので、仮想マシンに比べて必要とするメモリ、CPU、HDDリソースが少ない
・コンテナ自体は小さい差分ファイルなので、構築、展開などが早い
・起動時の読み込みが小さいので、起動が速い
・OSのインストールなどが不要で、アプリケーションのインストールなど必要な変更部分のみ構築すれば利用可能
・サーバー管理者の手を借りずに、アプリケーション開発者自身が配置する、テストする、公開する、破棄するといった一連のオペレーションができ、作業に要する時間と手間が格段に小さくなる

このように多くの利益をもたらすコンテナ技術をWindows Server上でも利用できるようにしたものが、「Windows コンテナ」となります。WindowsコンテナではWindows上でコンテナ技術を実現するために、マイクロソフトの仮想化技術プラットフォームであるHyper-Vのテクノロジーが利用されています。

Windowsコンテナ
├-Windows Serverコンテナ
| 名前空間とプロセスの分離テクノロジーによって、
| ホスト上で複数のコンテナが実行されます。
└-Hyper-Vコンテナ

ホスト上で複数のコンテナを実行しますが、各コンテナは、ユーティリティ仮想マシン内で実行されます。 これにより、他のコンテナ(Hyper-Vコンテナ、Windows Serverコンテナ)、コンテナホストとの間でカーネルレベルの分離が提供されます。

Hyper-Vコンテナとは

「Windows Server 2016 Technical Preview 4 でIISコンテナを作ってみる」で紹介したWindowsコンテナには、「Windows Serverコンテナ」と、もう1つ「Hyper-Vコンテナ」と呼ばれる2種類のコンテナがあります。

以前紹介したものは、「Windows Serverコンテナ」を利用してIISをインストールし公開するというものでした。「Windows Serverコンテナ」はコンテナ内のアプリケーションからは完全に隔離された環境で実行しているように見えますが、コンテナホストからは、コンテナのプロセスを確認することができます。

またコンテナホストのOSカーネルを共有化して実行しています。Linuxで利用されている、いわゆるコンテナと同様のものです。「Hyper-Vコンテナ」はWindowsコンテナ独自のコンテナの仕様で、コンテナの基本的な考え方である、ホストとのOSカーネル部分の共通化を行いません。「Hyper-Vコンテナ」内ではOSもアプリケーションも、完全にホストや他のコンテナから隔離された環境で実行されます。これは機能を限定してOS自体を非常に小さくしたNanoServerと、Hyper-Vの技術を組み合わせることで実現したものです。「Hyper-Vコンテナ」を利用することでコンテナのメリットを生かしつつ、より安定した、より安全なアプリケーションの実行に特化した隔離環境を提供することが可能となります。

Hyper-Vコンテナの作成

仮想マシンをコンテナホストとして構築し、Hyper-Vコンテナを利用する場合、Nested Hyper-Vの設定を行って仮想マシン内でHyper-Vの機能を有効にしておく必要があります。Nested Hyper-Vの設定方法は、前回の「ついに実現したNested Hyper-V を体感してみる」で紹介した方法となります。

Hyper-Vの機能が有効になったら、コンテナホストを構築していきます。コンテナホストの構築方法は、「Windows Server 2016 Technical Preview 4 でIISコンテナを作ってみる」で紹介した方法となりますが、Hyper-Vコンテナを利用する場合、“C:\Install-ContainerHost.ps1 -HyperV“ HyperVスイッチを指定する必要があります。

PS C:\> wget -uri https://aka.ms/tp4/Install-ContainerHost -OutFile C:\Install-ContainerHost.ps1

C:\Install-ContainerHost.ps1 -HyperV

あとは、同様の手順でコンテナホストを構築していきます。HyperVスイッチを指定してコンテナホストを構築した後、Get-ContainerImageコマンドで確認すると、WindowsServerCoreと、NanoServerのコンテナOSイメージの2つが確認できます。

PS C:\> Get-ContainerImage
Name Publisher Version IsOSImage
---- --------- ------- ---------
NanoServer CN=Microsoft 10.0.10586.0 True
WindowsServerCore CN=Microsoft 10.0.10586.0 True

Hyper-Vコンテナを作成するときは、NanoServerのコンテナOSイメージを利用する必要があります。
早速Hyper-Vコンテナを作成しましょう。

PS C:\> New-Container -Name "MyHPVContainer" -ContainerImageName “NanoServer” -SwitchName "Virtual Switch" -RuntimeType HyperV

-Name:コンテナ名
-ContainerImageName:テンプレートとなるコンテナイメージ、「NanoServer」を指定
-SwitchName:コンテナが接続する仮想スイッチ、”Get-VMSwitch”で確認

New-Containerコマンドに「-RuntimeType HyperV」とスイッチを付けるだけで、Hyper-Vコンテナが作成されます。RuntimeTypeはNew-Containerコマンド実行時以外にも、既存のコンテナに対して停止中にSet-Containerコマンドで設定することができます。ただし、「-RuntimeType HyperV」と設定してコンテナとして起動できるのでは、コンテナOSイメージがNanoServerから作成もしくは派生したコンテナに限定されています。

コンテナOSイメージのWindowsServerCoreから作成されたコンテナは、Hyper-Vコンテナとして設定したとしても、起動時にエラーとなってしまいます。その反対に、コンテナOSイメージのNanoServerから作成されたコンテナは、通常のコンテナとして設定した場合、起動時にエラーとなってしまいます。

Windows Server 2016 Technical Preview 4(TP4)の時点では、下記の組み合わせに限定されているようです。

PS C:\> Set-Container MyHPVContainer -RuntimeType Default
PS C:\> Start-Container MyHPVContainer

Start-Container : 'MyHPVContainer' failed to start.
'MyHPVContainer' failed to initialize: The operating system of the container
does not match the operating system of the host. (0xC0370101).
'MyHPVContainer' failed to start. (Container ID
B0CBFDE9-E3AC-4CD2-B87C-11392B9C63DD)
'MyHPVContainer' failed to initialize: The operating system of the container
does not match the operating system of the host. (0xC0370101). (Container ID
B0CBFDE9-E3AC-4CD2-B87C-11392B9C63DD)
At line:1 char:1
+ Start-Container MyHPVContainer
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  + CategoryInfo : NotSpecified: (:) [Start-Container], Virtualizat
  ionException
  + FullyQualifiedErrorId : OperationFailed,Microsoft.Containers.PowerShell.
 Cmdlets.StartContainer

Hyper-VコンテナをRuntimeType Default として起動した場合エラーとなる。

コンテナOSイメージ   – RuntimeType
WindowsServerCore - Defalt
NanoServer      – HyperV
(TP4時点でのコンテナOSイメージとRuntimeTypeの組合せ)

コンテナのRuntimeTypeはGet-ContainerコマンドでRuntimeType列を指定することで確認ができます。

PS C:\> Get-Container | Select Name, State, RuntimeType

Name State RuntimeType
---- ----- -----------
MyHPVContainer Off HyperV
MyContainer Off Default

プロセス分離の確認

Hyper-Vコンテナは通常のコンテナとは異なり、ホストや他のコンテナから隔離された状態にあると述べました。実際にHyper-Vコンテナの稼働状態を確認してみましょう。

Hyper-Vコンテナが起動すると、仮想マシンワーカープロセス“vmwp.exe”が起動します。これは、Hyper-V上で仮想マシンを作成して起動した場合と同様のプロセスとなります。Hyper-VコンテナはHyper-V上の仮想マシンと同様に、仮想マシンワーカープロセス内で隔離された状態で稼働しています。Hyper-Vコンテナと通常のコンテナを起動して、タスクマネージャーで確認してみると、Hyper-Vコンテナのために1つだけ仮想マシンワーカープロセスが起動しています。

タスクマネージャーで確認するとvmwp.exeがHyper-Vコンテナのために起動している
(UserNameとContainerIDが同じ)

このように、Hyper-Vコンテナは仮想マシンと同様レベルで隔離された状態で稼働するより、安定したセキュアなコンテナ運用を可能にしています。

IISのインストール

Hyper-Vコンテナが作成できたので、次にIISをインストールしてHyper-VコンテナでWebサイトを公開できるようにしましょう。Hyper-VコンテナはNanoServerベースのコンテナなので、既存の状態では何もない状態です。WindowsServerCoreベースのコンテナとは異なり、機能と役割の追加からIISの機能を有効化すればよい、というわけにはいきません。NanoServerに対して、Nano Server IIS パッケージを追加する必要があります。

・共有フォルダの作成
まずは、Nano Server IIS パッケージをNanoServerにインストールする準備として、コンテナホストとHyper-Vコンテナ間で共有フォルダを利用してファイルのやりとりを可能にします。

コンテナホスト上に共有フォルダとして”C:\Share”フォルダを作成します。さらにサブフォルダとして”en-us”フォルダを作成します。次に、Hyper-Vコンテナが停止している状態で、Add-ContainerSharedFolder コマンドを使って共有フォルダを作成します。

コンテナホスト上でPowerShellを使って簡単に設定が可能です。

PS C:\> New-Item -Type Directory C:\Share\en-us

  Directory: C:\Share

Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2/15/2016 8:27 PM en-us

PS C:\> -ContainerSharedFolder -ContainerName MyHPVContainer -SourcePath C:\Share -DestinationPath C:\IISInstall

ContainerName SourcePath DestinationPath AccessMode
------------- ---------- --------------- ----------
MyHPVContainer C:\Share C:\IISInstall ReadWrite

– ContainerName:コンテナ名
– SourcePath:共有フォルダとなるコンテナホスト上のフォルダパス
– DestinationPath:Hyper-Vコンテナ上での共有フォルダパス

・Nano Server IIS パッケージをコピー
共有フォルダにNano Server IIS パッケージファイルをコピーします。Nano Server IIS パッケージファイルは、Windows Server 2016 TP4 インストール メディア(ISOファイル)の NanoServer\Packages ディレクトリにあります。

IISのインストールに必要なファイルは2つ。

  • Microsoft-NanoServer-IIS-Package.cabをNanoServer\PackagesからコンテナホストのC:\Share にコピーします。
  • NanoServer\Packages\en-us\Microsoft-NanoServer-IIS-Package.cab コンテナホストのC:\Share \en-usにコピーします。

・unattend.xmlの作成
コンテナホストのC:\Share内にNanoServer用のインストール設定ファイルを作成します。下記のテキストをコピーしてC:\Share\unattend.xmlとして保存します。

<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
  <servicing>
    <package action="install">
      <assemblyIdentity name="Microsoft-NanoServer-IIS-Package" version="10.0.10586.0" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" />
      <source location="c:\iisinstall\Microsoft-NanoServer-IIS-Package.cab" />
    </package>
    <package action="install">
      <assemblyIdentity name="Microsoft-NanoServer-IIS-Package" version="10.0.10586.0" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="en-US" />
      <source location="c:\iisinstall\en-us\Microsoft-NanoServer-IIS-Package.cab" />
    </package>
  </servicing>
</unattend>

共有フォルダ内は以下のファイル構成となっています。

C:\Share
├-en-us
│  ├-Microsoft-NanoServer-IIS-Package.cab

├-Microsoft-NanoServer-IIS-Package.cab
└-unattend.xml

・IISパッケージのインストール
共有フォルダの設定が完了したら、Hyper-Vコンテナを起動します。Enter-PSSessionコマンドでHyper-Vコンテナ内からPowerShellでIISパッケージのインストールを実行します。

PS C:\> Start-Container MyHPVContainer

PS C:\> Enter-PSSession -ContainerName MyHPVContainer -RunAsAdministrator

[MyHPVContainer]: PS C:\windows\system32\config\systemprofile\Documents> cd C:\

[MyHPVContainer]: PS C:\>

共有フォルダの中身を確認します。

[MyHPVContainer]: PS C:\> ls C:\IISInstall

Directory: C:\IISInstall

Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2/13/2016 12:00 AM en-us
-ar--- 10/30/2015 3:19 AM 1922047 Microsoft-NanoServer-IIS-Packa
ge.cab
-a---- 2/13/2016 12:01 AM 791 unattend.xml

共有フォルダ内に、先ほどコピーしたNano Server IIS パッケージファイルが確認できます。次のコマンドでインストールを実行します。

[MyHPVContainer]: PS C:\> dism /online /apply-unattend:C:\IISInstall\unattend.xml

Deployment Image Servicing and Management tool
Version: 10.0.10586.0

Image Version: 10.0.10586.0


[ 1.0% ]

[===== 10.1% ]

[=============== 26.2% ]

[=============== 26.2% ]

[================== 32.5% ]

[====================== 38.7% ]

インストールが完了したらIISのサービスを起動します。

[MyHPVContainer]: PS C:\> Net start w3svc
The World Wide Web Publishing Service service is starting.
The World Wide Web Publishing Service service was started successfully.

これでIISのインストールが完了しました。

コンテンツの書き換え

せっかくなので、Topページを書き換えてみましょう。

[MyHPVContainer]: PS C:\> Del C:\inetpub\wwwroot\iisstart.htm

[MyHPVContainer]: PS C:\> "Hyper-Vコンテナからこんにちは!" > C:\inetpub\wwwroot\index.html

ブラウザで確認

ブラウザでWebサイトを確認します。コンテナのIPアドレスを確認して、PwerShellセッションを終了します。

[MyHPVContainer]: PS C:\> ipconfig

Windows IP Configuration


Ethernet adapter Ethernet:

Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::989a:eb2f:dc54:31e4%3
IPv4 Address. . . . . . . . . . . : 172.16.0.2
Subnet Mask . . . . . . . . . . . : 255.240.0.0
Default Gateway . . . . . . . . . : 172.16.0.1

[MyHPVContainer]: PS C:\> Exit

PS C:\>

コンテナホスト上のブラウザでHyper-VコンテナのWebサイトを確認します。

NATによりWebサイトの公開方法は、「Windows Server 2016 Technical Preview 4 でIISコンテナを作ってみる」で紹介していますので、参考にしてください。

コンテナイメージの作成

せっかく構築したIISをインストールしたHyper-Vコンテナなので、コンテナイメージとして保存しておきましょう。

コンテナを停止した状態で、New-ContainerImageコマンドを実行します。

PS C:\> Stop-Container MyHPVContainer

PS C:\> New-ContainerImage MyHPVContainer -Publisher "WIN1" -Name "HPVIIS" -Version 1.0


Name Publisher Version IsOSImage
---- --------- ------- ---------
HPVIIS CN=WIN1 1.0.0.0 False

コンテナを利用するメリットの1つとして、一度コンテナイメージとして保存してしまえば、いつでもすぐにIISインストール済みのHyper-Vコンテナを作成し、利用することが可能となります。コンテナイメージの元となったコンテナは削除することは可能ですが、例えば、保存したコンテナイメージから新たにコンテナを作成した場合は、親となるコンテナイメージを削除してしまうと、コンテナが起動できなくなりますので、注意が必要です。


以上、Hyper-Vコンテナの概要と、実際にIISをインストールしたHyper-Vコンテナを作成して、コンテナイメージとして保存するまでを紹介しました。

現時点ではPowerShellのコマンドベースの操作となっていますが、一度コンテナイメージを作ってしまえば、あとは簡単にコンテナとして利用できるので、ぜひチャレンジしてみてください。

著書の紹介欄

Hyper-Vで本格的なサーバー仮想環境を構築。仮想環境を設定・操作できる!

できるPRO Windows Server 2016 Hyper-V

◇Hyper-Vのさまざまな機能がわかる ◇インストールからの操作手順を解説 ◇チェックポイントやレプリカも活用できる Windows Server 2016 Hyper-Vは、仮想化ソフトウェア基盤を提供する機能であり、クラウドの実現に不可欠のものです。 本書では、仮想化の基礎知識から、Hyper-Vでの仮想マシンや仮想スイッチの設定・操作、プライベートクラウドの構築、Azureとの連携などを解説します。

初めてのWindows Azure Pack本が発売

Windows Azure Pack プライベートクラウド構築ガイド

本書は、Windows Azure PackとHyper-Vを利用し、企業内IaaS(仮想マシン提供サービス)を構成するための、IT管理者に向けた手引書です。試用したサーバーは、最小限度の物理サーバーと仮想マシンで構成しています。Windows Azure Packに必要なコンポーネントのダウンロード、実際にプライベートクラウド構築する過程を、手順を追って解説しています。これからプライベートクラウドの構築を検討するうえで、作業負担の軽減に役立つ一冊です。

ブログの著者欄

樋口 勝一

GMOインターネットグループ株式会社

1999年6月GMOインターネットグループ株式会社に入社。Windows Serverをプラットフォームとしたサービス開発から運用・保守まで幅広く担当。講演登壇や出版、ネット記事連載などでマイクロソフト社と強い信頼関係を構築。「マイクロソフトMVPアワード」を15度受賞し、インターネットソリューションのスペシャリストとして活躍。

採用情報

関連記事

KEYWORD

採用情報

SNS FOLLOW

GMOインターネットグループのSNSをフォローして最新情報をチェック