Windows Server 2016 Technical Preview 4 でIISコンテナを作ってみる

PowerShellを使ってコンテナの基盤となるコンテナホストを構築してIISをインストールし、Webサイトを公開するまでの手順を追って紹介

2015年8月にリリースされたWindows Server 2016 Technical Preview 3(TP3)で初めてサポートされた注目すべき新機能、Windows Server コンテナ(Windows Server Container)。Windows Serverが提供するコンテナサービスは、Windows Server 2016 Technical Preview 4(TP4)がリリースされ、アップデートされたことにより、さらに注目されているHyper-Vコンテナが利用できるようになりました。現時点ではWindows Server コンテナはPowerShellを使って管理することができます。
PowerShellを使ってコンテナの基盤となるコンテナホストを構築して、実際に動くコンテナとしてIISをインストールし、Webサイトを公開するまでの手順を追って紹介します。

※IISコンテナを作成する場合、TP4の時点では日本語版にまだ不具合があるようなので、英語版を使用して紹介します。

コンテナホストの作成

今回はHyper-Vコンテナではなく、Windows Serverコンテナを使っていきます。
Windows Server 2012 R2 Hyper-Vの仮想マシンとして、コンテナホストを作成します。まずはTP4(英語版)をダウンロードします。

Windows Server 2016 TP4のダウンロードサイト

作成する仮想マシンは、分かりやすいようにGUI付きをインストールしています。

GUI版Windows Serverを選択

コンテナホストを構築するには、コンテナイメージやセットアップスクリプトをダウンロードする必要があるので、作成した仮想マシンがインターネットに接続できるようにネットワークの設定を行っておきます。
インターネットに接続できる状態になったら、スタートメニューからPowerShellを管理者権限で実行し、以下のコマンドで「ContainerSetup.ps1」をダウンロードして実行します。

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

C:\Install-ContainerHost.ps1


スクリプトの実行後、しばらく待つと再起動となります。
ログイン後、自動的にコンテナサービスの設定が行われ、コンテナのベースとなるイメージファイルが C:\Windows\system32\ContainerBaseImage.wim にダウンロードされます。ダウンロード完了までしばらく時間がかかりますので、このままの状態で待ちます。ダウンロードが完了すると、コンテナOSイメージが「WindowsServerCore」という名前でインストールされます。このコンテナイメージを元に、コンテナを作成したり、新しいコンテナイメージを作成していきます。

コンテナサービスのインストール

続いて、サードパーティツールのNSSM(https://nssm.cc/usage)を利用して、Docker Daemonのインストールが行われています。Docker Daemonサービスを介して、Windows ServerコンテナをDockerのコマンドからも操作することが可能となります。

Docker関連のサービスが追加される

すべてのインストールが完了すると、コンテナホストとなる仮想マシンに新たにネットワークアダプターが追加されています。この追加されたネットワークを使用して、コンテナとの通信を行います。

コンテナ用仮想ネットワークアダプターが追加される

コンテナホストのサービス一覧を見てみると、Hyper-V関連のサービスがいくつか追加されています。コンテナサービスはHyper-Vのテクノロジーを利用して実現しているようです。

Hyper-V関連のサービスが追加される

以上でコンテナホストの構築が完了しました。

コンテナの作成

コンテナホストの構築が完了したので、実際にコンテナを作成していきます。コンテナ関連の操作はPowerShell、Dockerコマンドどちらでも可能ですが、今回はPowerShellを使っていきます。コンテナは、元となるコンテナイメージから作成していきますので、まずはコンテナ関連のPowerShellのコマンドを確認しておきます。

Get-Command -Module Containers
コンテナ関連のコマンド

Windows Server コンテナの大本となるコンテナOSイメージは、「WidowsServerCore」となり、コマンドベースのWindows Serverとなっています。C:\ProgramData\Microsoft\Windows\Images に格納されていますので、コンテナイメージを確認しておきます。

Get-ContainerImage

コンテナを作成します。

New-Container -Name "MyContainer" -ContainerImageName “WindowsServerCore” -SwitchName "Virtual Switch"

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

コマンドが実行されると、作成されたコンテナが表示されます。コンテナの一覧は“Get-Container”コマンドを使っても表示することができます。作成されたコンテナは、C:\ProgramData\Microsoft\Windows\Hyper-V\Containers に保存されます。

コンテナの作成

コンテナの操作

作成したコンテナをPowerShellで操作してみましょう。

まずはコンテナを起動します。
“Get-Container”コマンドで確認すると「State」が“Running”に変わっています。

Start-Container -Name "MyContainer"

起動したコンテナを管理するには、PowerShellをリモートから実行することで可能となります。PowerShellをリモートで実行するには、“Invoke-Command”コマンド、もしくは“Enter-PSSession”コマンドを利用します。

(1) Enter-PSSession
初めに“Enter-PSSession”の例です。

Start-Container -Name "MyContainer"

コンテナにPowerShellのセッションが張られると、
[xxxxxxxx-xxx]: PS C:\Windows\system32>
のようなプロンプトとなります。これはコンテナIDの頭11桁となります。以後のコマンドはコンテナ内で実行されることになります。

コンテナにPowerShellセッション接続

続いて、“ipconfig”コマンドでコンテナのネットワーク設定を確認します。コンテナにIPアドレスが割り当てられているのが確認できます。

コンテナ内部のネットワーク設定

コンテナホストがインターネットに接続できる状態であれば、コンテナ内からもインターネットに接続できる状態になっています。
試しに“ping”コマンドを実行しましょう。インターネットに接続できているようです。DNSは“ipconfig /all”で見てみると、コンテナホストのDNSをそのまま利用しています。
コンテナのPowerShellセッションの接続を終了するには、“exit”コマンドを実行します。

コンテナからPingの確認

(2)Invoke-Command
“Invoke-Command”コマンドを使用しても、同様の結果が取得できます。
“Invoke-Command”の場合は、コンテナ内で実行したいコマンドを-ScriptBlock { }で指定する方法なので、コンテナにPowerShellのセッションを張る必要はありません。

$Container = Get-Container -Name "MyContainer"

Invoke-Command -ContainerId $Container.ContainerId -ScriptBlock {ipconfig}
“Invoke-Command”を実行したところ

以上で、コンテナ自体を操作る2つの方法を紹介しました。最後にコンテナを停止して、削除するには、以下となります。

Stop-Container -Name "MyContainer"

Get-Container -Name "MyContainer" | Remove-Container –Force

コンテナイメージの作成

一通りコンテナの操作ができるようになったところで、次はテンプレートとなるコンテナイメージを作成してみましょう。コンテナイメージは、自身が作成したコンテナから作成することができます。「WindowsServerCore」のコンテナイメージから作成したコンテナを、新しいコンテナイメージとして保存します。さらに、保存した新しいコンテナイメージからコンテナを作成し、別のコンテナイメージを作成…、というように、コンテナイメージはHyper-Vのチェックポイントのように、少しずつ変更を加えながら、次々と作り出すことができます。

コンテナイメージの作成

新しくコンテナイメージを作成します。

New-ContainerImage -ContainerName “MyContainer” -Publisher “WIN1” -Name “MyContainerImage01” -Version 1.0

-ContainerName:先ほど作成したコンテナ名を指定します。このコンテナを元にコンテナイメージを作成します。コンテナは停止しておく必要があります。
-Publisher:コンテナイメージの作成者の名前
-Name:コンテナイメージ名
-Version:任意のバージョン

作成された新しいコンテナイメージ

作成したコンテナイメージをエクスポートしてAPPXファイルとし、他のコンテナホストにインポートすることで、コンテナイメージを配布することも可能です。

エクスポート

$image = Get-ContainerImage -Name “MyContainerImage01”

Export-ContainerImage -Image $image -Path "C:\"

インポート

Import-ContainerImage -Path "C:\CN=WIN1_ MyContainerImage01_1.0.0.0.APPX"

コンテナイメージを削除する場合は、“Remove-ContainerImage”コマンドで削除します。

Get-ContainerImage -Name “MyContainerImage01”| Remove-ContainerImage –Force

IISコンテナイメージの作成と展開

一通りコンテナの操作ができるようになったところで、実際にアプリケーションがインストールされたコンテナイメージを作成して、利用してみましょう。今回は、コンテナにWebサーバーとしてIISをインストールして、コンテナイメージを作成します。コンテナとして簡単にIISのコンテナを展開して利用できることを確認します。

●コンテナのイメージの作成
TP4の現時点では、IISコンテナイメージを作成するには日本語版では不具合があるようなので、英語版のTP4を利用しています。

IISをインストールするコンテナを作成します。

$Container = New-Container -Name "IIS Container" -ContainerImageName “WindowsServerCore” -SwitchName "Virtual Switch"

コンテナを起動します。

Start-Container $Container

コンテナにPowerShellセッションを接続します。

Enter-PSSession -ContainerId $Container.ContainerId –RunAsAdministrator

コンテナにIISをインストールします。

Install-WindowsFeature Web-Server

PowerShellのセッションの接続を閉じて、コンテナを停止します。

Exit

Stop-Container $Container

IISコンテナを元に、コンテナイメージを作成します。

New-ContainerImage -ContainerName $container.Name -Publisher "WIN1" -Name "IISContainerImage" -Version 1.0
IISコンテナイメージの作成

IISをインストールしたコンテナをコンテナイメージとして保存しておくことで、何度でもコピーして使い回すことができるようになりました。また、コンテナイメージをエクスポートして、このコンテナホストにインポートすることで、コンテナイメージを配布することも可能です。

●IISコンテナの公開
続いて、IISコンテナのWebサイトの公開方法です。先ほど作成したIISコンテナを使って、Webサイトを参照できるようにしてみましょう。コンテナは、コンテナホストとNATを使って接続されています。コンテナホストのNATにポートフォワードの設定を行うことで、コンテナのWebサイトを公開できるようになります。

NATを使ったIISコンテナの公開

コンテナのネットワーク情報を確認します。コンテナのIPアドレスは自動的に割り当てられた“172.16.0.2”となっています。

$Container = Get-Container -Name "IIS Container"

Start-Container $Container

Invoke-Command -ContainerId $Container.ContainerId -ScriptBlock {ipconfig}
IISコンテナのネットワーク情報

コンテナのNATの設定を確認します。NATの名前を確認すると、“ContainerNAT”と定義されています。

Get-NetNat
NATの設定情報

NATにポートフォワードの設定を追加します。

Add-NetNatStaticMapping -NatName "ContainerNAT" -Protocol TCP -ExternalIPAddress 0.0.0.0 -InternalIPAddress 172.16.0.2 -InternalPort 80 -ExternalPort 80

-NatName:NAT名
-Protocol :HTTPの公開なのでTCP
-ExternalIPAddress:0.0.0.0
-InternalIPAddress:IISコンテナのIPアドレス
-InternalPort:コンテナのWebサイトのポート番号
-ExternalPort :公開するポート番号

ポートフォワードの設定を追加

Webを公開するので、コンテナホストのファイアウォールのTCP80番ポートを開きます。GUIの「Windowsファイアウォール」でも設定可能です。

if (!(Get-NetFirewallRule | where {$_.Name -eq "TCP80"})) {New-NetFirewallRule -Name "TCP80" -DisplayName "HTTP on TCP/80" -Protocol tcp -LocalPort 80 -Action Allow -Enabled True}
ファイアウォールの設定を追加

以上の設定で、Webサイトが参照できる状態となりました。ブラウザで確認してみましょう。

ブラウザで確認

NATの接続状況は、“Get-NetNatSession”コマンドで確認することができます。

Get-NetNatSession
NATの接続状況

以上で、実際にIISのコンテナを作成し、コンテナイメージとして保存、公開して、Webサイトを参照するところまでが完了しました。コンテナは、この繰り返しで次々に作成~展開まで行うことができます。
IISだけではなく、今後様々なアプリケーションがインストールされたコンテナイメージを作成して、素早く環境を展開できるようになります。コンテナ技術による、さらなる効率アップが期待できそうです。

著書の紹介欄

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をフォローして最新情報をチェック