Windows Server コンテナ始動!

2015年9月24日(木)
樋口 勝一

前回ご紹介したWindows Server 2016 Technical Preview 3から搭載されたコンテナサービスを、今回は実際に動かしてみたいと思います。マイクロソフトのWindows Server Containersサイトに掲載されている「Get started with Windows Containers」の手順に沿って構築していきましょう。

※本記事はWindows Server 2016 Technical Preview 3を元に作成されています。今後のリリース内容により仕様等が変更される場合があります。

1.コンテナホストの構築

Windows Server上でコンテナを利用するためには、まずはコンテナホストを構築する必要があります。ちょうどHyper-V上で仮想マシンを稼働させるように、コンテナホスト上にコンテナを作成します。

Microsoft Azureでコンテナホストを作る

最初にご紹介するのは、コンテナを作成する一番簡単な方法です。Microsoft Azureではすでに仮想マシンのテンプレートとしてコンテナホスト用の仮想マシンを利用できるようになっています。このテンプレートは、Windows Server 2016 Technical Preview 3のコアをインストールしたものにコンテナの役割を追加したものです。ダウンロードやOSのインストールをする必要がなく、Microsoft AzureのポータルサイトからすぐにWindows Server コンテナを利用することができるようになっています。

早速コンテナを利用するためのコンテナホスト用の仮想マシンを作成してみましょう。まずはMicrosoft Azureのポータルサイトにログインします。

Microsoft Azureのアカウントをまだお持ちでない場合は、無料評価版のアカウントを作成できますので以下のURLからお試しください。

1か月間の無料評価版の申し込みサイト
https://azure.microsoft.com/ja-jp/pricing/free-trial/

リソースの一覧から「仮想マシン」を選択し、「仮想マシンを作成する」をクリックします。

「ギャラリーから」を選択します。

「イメージの選択」から「Windows Server Container Preview」を選択して、ウィザードを進めます。

仮想マシンを作成するのと同様に、名前、スペック、ユーザー名、パスワードを入力します。コンテナ用仮想マシンなので、スペックは最小の構成にしました。

外部からの接続情報は、既定の設定内容をそのまま使用します。「クラウドサービスDNS名」がすでに使われている場合は、任意の名前に変更します。

拡張機能はインストールせず、既定の「VMエージェントのインストール」のみを選択します。以上の内容で、仮想マシンとしてコンテナホストを作成します。

これまでの操作で、Microsoft Azure上にコンテナホスト用の仮想マシンが作成されました。このコンテナホスト用の仮想マシン上に、実際にコンテナを作成して操作していきます。Microsoft Azure上の仮想マシンは、稼働状態で課金対象となりますので、利用しない場合はシャットダウンしておくことをお勧めします。

作成された仮想マシンにログインしてみましょう。画面下のメニューから「接続」をクリックします。リモート接続用のrdpファイルをダウンロードします。「ファイルを開く」を選択します。

アカウントとパスワードは、仮想マシン作成時に設定したものを入力して接続します。

ログインすると、Server Coreと同様のコマンドプロンプトとだけのシンプルな画面となっています。現時点では、コンテナの操作はここからPowerShellやDockerのコマンドで行うことになります。

Hyper-V上にコンテナホストをダウンロードして構築する

次にご紹介するのは、あらかじめコンテナホスト環境を構築済みのvhdファイル(約6GB)をダウンロードして、仮想マシンとしてコンテナホストを構築する方法です。ダウンロードから設定まで、ほぼ自動でPowerShellのスクリプトで完了することができます。

Windows Server 2012R2 のHyper-V上にvhdファイルをダウンロードして、コンテナホストを作成します。PowerShellを管理者権限で実行します。

「New-ContainerHost.ps1」ファイルをダウンロードします。

wget -uri https://aka.ms/newcontainerhost -OutFile New-ContainerHost.ps1

仮想マシン名とパスワードを指定して「New-ContainerHost.ps1」を実行します。

.\New-ContainerHost.ps1 –VmName “ContainerHost01” -Password “P@ssword”

以下のURLに利用規約が記載されています。一読したうえで、Y(Yes)を入力してスクリプトを実行します。

利用規約
https://aka.ms/WindowsServerTP3ContainerVHDEula

容量が大きいのでしばらくこの状態で待ちます。

C:\Users\Public\Documents\Hyper-V\Virtual hard disks フォルダにzipファイルがダウンロードされ、自動的に展開後、仮想マシンが作成されます。

作成された仮想マシンをダブルクリックして接続します。仮想マシン内ではコンテナサービスのセットアップが完了して、ログイン画面となっています。スクリプト内で指定したパスワードを入力し、ログインします。

ログインすると、Server Coreと同様のコマンドプロンプトだけの画面となります。PowerShellやDockerのコマンドで、コンテナの操作を行うことになります。

Hyper-V上の仮想マシンでコンテナホストを作る

最後にご紹介するのは、Windows Server 2016 Technical Preview 3(TP3)をダウンロードして、実際にインストールします。コンテナホストは物理マシンでも、Hyper-V上の仮想マシンの中にも構築することが可能です。今回はWindows Server 2012R2 のHyper-V上に、TP3をインストールした仮想マシンを作成して、コンテナの実行環境を構築していきます。

Windows Server 2016 TP3のダウンロードサイト
https://technet.microsoft.com/ja-jp/evalcenter/dn781243.aspx

以下の操作はすべてコンテナホストとなる仮想マシン上で行います。

TP3のISOファイルをダウンロードし、仮想マシンにインストールしていきます。インストールするTP3は2種類選択することができ、「Server with Desktop Experience」と記載されている方がGUIで操作可能となっています。もう一方はServerCore同様にコマンドベースの操作となります。コンテホストの構築はPowerShellで行うため、GUIの有無は関係ありませんが、今回はファイル操作などその他の操作がしやすいGUIでの操作可能なTP3を選択します。

TP3のインストールが完了したら、仮想マシンにログオンしてネットワークの設定を行います。インターネットに接続して設定スクリプトやモジュールをダウンロードする必要があります。インターネットに接続できる状態になったら、スタートメニューからPowerShellを管理者権限で実行します。

「ContainerSetup.ps1」ファイルをダウンロードします。

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

ダウンロードしたスクリプトを実行します。

.\ContainerSetup.ps1

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

ダウンロードが完了すると、コンテナのベースイメージが「WindowsServerCore」という名前でインストールされます。このコンテナイメージを元に、カスタマイズを行い、新しいコンテナイメージとして作成していきます。

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

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

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

以上、コンテナホストの構築方法として3つの方法をご紹介しました。どの方法でもコンテナホストとしての機能に差異はありませんので、ご利用環境により使い分けていただければと思います。

2.PowerShellによるコンテナの管理

コンテナの作成

コンテナホストの準備ができたところで、実際にコンテナを作成してみましょう。コンテナは、コンテナイメージを元(テンプレート)として作成されます。Windows Server 2016が正式にリリースされるときには、おそらくコンテナイメージはIISやSQL Serverなど、様々なアプリケーションがインストールされたものなどが提供されるはずです。

コンテナの操作は、PowerShellもしくはDockerコマンドを利用することができます。

コンテナを作成する場合には、コンテナホストにログインしてコマンドを実行していきますが、ここまでで3つの方法のコンテナホストの構築方法をご紹介しました。今回操作するのは、GUIが利用できるTP3をインストールした仮想マシン上で構築したコンテナホストになります。

今回は、PowerShellを使ってコンテナを作成する方法をご紹介します。初めに、コンテナ関連のPowerShellのコマンドを確認しておきます。

Get-Command -Module Containers

コマンド数は、それほど多くありません。

コンテナを作成する場合には、今のところPowerShellからはテンプレートとなるコンテナイメージが1つだけ提供されています。これをベースにコンテナを作成することとなります。コンテナイメージを確認してみましょう。

Get-ContainerImage

コンテナサービスのインストール時にも確認できましたが、「WindowsServerCore」という名前のコンテナイメージが確認できます。このコンテナイメージが、これから作成するコンテナのテンプレートとなります。コンテナイメージは、C:\ProgramData\Microsoft\Windows\Images に格納されています。

自分でコンテナイメージを作成することも可能です。また、コンテナイメージはコンテナイメージファイルとして提供され配布することが可能で、追加することも可能です。

早速コンテナを作成してみます。新しいコンテナを作成するには“New-Container”コマンドを使いますが、引数として、コンテナ名、コンテナイメージ名と、ネットワーク接続を行うためのスイッチ名が必要となります。事前にコンテナで利用できるスイッチを確認しておきます。

Get-VMSwitch

「Virtual Switch」という名前の仮想スイッチが利用できます。

コンテナを作成します。

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

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

コンテナの操作

作成したコンテナは停止状態なので、起動してみましょう。

Start-Container -Name "MyContainer"

“Get-Container”コマンドで確認すると「State」が“Running”に変わっています。

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

(1) Enter-PSSession

初めに”Enter-PSSession”の例です。

$container = Get-Container -Name "MyContainer"

Enter-PSSession -ContainerId $container.ContainerId -RunAsAdministrator

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

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

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

コンテナのPowerShellセッションの接続を終了するには、”exit”コマンドを実行します。

(2)Invoke-Command

”Invoke-Command”の例です

$container = Get-Container -Name "MyContainer"

Invoke-Command -ContainerId $container.ContainerId -ScriptBlock {ipconfig}

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

以上で、簡単ですがコンテナ内の状態を確認できました。最後にコンテナを停止して、削除するには、

Stop-Container -Name "MyContainer"

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

Get-Container

” Get-Container”コマンドでコンテナが削除されていることを確認します。

コンテナイメージの作成

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

現在のコンテナイメージを確認してみましょう。

Get-ContainerImage

「WindowsServerCore」というコンテナイメージが1つあります。

” New-ContainerImage”コマンドで、新しくコンテナイメージを作成します。オプションとして、次のものを指定します。

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

-Publisherコンテナイメージの作成者の名前
-Nameコンテナイメージ名
-Version任意のバージョン
New-ContainerImage -ContainerName “MyContainer” -Publisher “WIN1” -Name “MyContainerImage01” -Version 1.0

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

作成したコンテナイメージを元に、コンテナを作成して一通り操作してみましょう。

New-Container -Name “MyContainer01" –ContainerImageName”MyContainerImage01” -SwitchName "Virtual Switch"

Start-Container -Name "MyContainer01"

Get-Container

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

作成したコンテナイメージをエクスポートして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

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

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

システムロケールの変更

現時点では、コンテナイメージの元となる「WindowsServerCore」は英語版のみの提供となっています。TP3をインストールしてコンテナホストを構築する場合、おそらくシステムロケールを日本語に設定して、インストールしていると思います。この場合、コンテナイメージとコンテナホストのシステムロケールが異なるため、うまくIISがコンテナにインストールできないといった不具合があります。そのため、IISコンテナを作成する前に、コンテナホストのシステムロケールを英語に変更しておきます。コンテナホスト用の仮想マシン上で次のPowerShellコマンドを実行してください。コマンド実行後、再起動が求められますので、仮想マシンを再起動します。

Set-WinSystemLocale en-us

コンテナのイメージの作成

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

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

コンテナを起動します。

Start-Container $container

コンテナにPowerShellセッションを接続します(現時点では”Invoke-Comannd”コマンドではIISのインストールがうまくいかないようです)。

Enter-PSSession -ContainerId $container.ContainerId –RunAsAdministrator

コンテナにIISをインストールします。現時点では評価版なので、このとき一度エラーが発生します。再度” Add-WindowsFeature Web-Server”コマンドを実行します。

Add-WindowsFeature Web-Server

Add-WindowsFeature Web-Server

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

exit

Stop-Container $container

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

New-ContainerImage -ContainerName $container.Name -Publisher "WIN1" -Name "IISContainerImage" -Version 1.0

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

IISコンテナの公開

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

コンテナのネットワーク情報を確認します。コンテナのIPアドレスは“172.16.0.2”となっています。

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

Start-Container $container

Invoke-Command -ContainerId $container.ContainerId -ScriptBlock {ipconfig}

コンテナのNATの設定を確認します。NATの名前を確認します。”ContainerNAT”です。

Get-NetNat

"Add-NetNatStaticMapping”コマンドでNATにポートフォワードの設定を追加します。指定するオプションは、次のとおりです。

-NatNameNAT名
-ProtocolHTTPの公開なのでTCP
-ExternalIPAddress0.0.0.0
-InternalIPAddressIISコンテナのIPアドレス
-InternalPortコンテナのWebサイトのポート番号
-ExternalPort公開するポート番号
Add-NetNatStaticMapping -NatName "ContainerNAT" -Protocol TCP -ExternalIPAddress 0.0.0.0 -InternalIPAddress 172.16.0.2 -InternalPort 80 -ExternalPort 80

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

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

4.まとめ

注意事項

今回は、すべてPowerShellでコンテナの操作を行っていますが、同様にDockerのコマンドでもコンテナの操作は可能です。

ですが、TP3の現時点では重要な制約があります。同じWindows Server コンテナでもPowerShellとDockerでは互換性がないようです。元となるコンテナイメージも異なるため、PowerShellで作ったコンテナはPowerShellから、Dockerコマンドで作ったコンテナはDockerコマンドでのみ操作が可能です。Windows Server上で2種類のコンテナサービス、コンテナが同居するような感じとなります。正式にリリースされる折りには、PowerShell、Dockerコマンドで差異のない操作ができるものと予想がされますが、現時点では留意する必要があります。

PowerShellで作ったコンテナをDockerのコマンド”docker ps -a”でコンテナ一覧を確認してみたところ、Dockerのコンテナ一覧にはコンテナがなく、操作ができません。

また、コンテナの元となるOSコンテナイメージが、PowerShellとDockerでは異なり、双方向では利用できません。

管理操作は異なりますが、PowerShellとDockerでは、元となるOSは同じWindowsとなります。どちらのコンテナでも、IISコンテナなどWindowsベースのコンテナを作成して利用することが可能です。Windows Serverコンテナを利用する場合は、どちらのコマンドで作成し、管理するかを明確にしたうえで、Windowsならではのコンテナの利点を生かして利用することがポイントとなります。

おわりに

以上、Windows Server 2016 Technical Preview 3から搭載されたコンテナサービスを、今回は実際に動かしてみました。まだまだプレビュー版ですので、構築時のパフォーマンスや、細かい不具合がありますが、コンテナ技術をまずはいち早く体感できたと思います。新しい技術は、何もかもが手探りですが、新しい発見が次々に出てきます。本当に楽しいですね。

GMOインターネット株式会社 Windowsソリューション チーフエグゼクティブ

GMOインターネットでWindowsのサービス開発運用に関わって16年、数年単位で進化し続けるMicrosoftのWindowsは新しもの好きにはたまらない製品です。自動販売機に見たことのないジュースがあれば、迷わすボタンを押します。そんなチャレンジが僕の人生を明るく、楽しくしてくれています。

お名前.com デスクトップクラウド
http://www.onamae-desktop.com/

お名前.com VPS Hyper-V
http://www.onamae-server.com/vps/hyperv/

連載バックナンバー

技術解説

より速く、より小さく、より軽く、 新基盤 Nano Server (前編)

2015/10/9
次期Windows Serverとなる予定の「Windows Server 2016」には注目されるべき新しいテクノロジーがいくつか実装される予定となっています。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています