Windows Server 2016 Technical Preview 3におけるDockerの利用

2015年11月4日(水)
古賀 政純

欧米の先進のWebホスティング事業者や大手広告事業を手掛けるサービスプロバイダーなどでは、数百台や数千台規模のLinuxサーバーが導入され、その上で、KVMによる仮想化環境やDocker環境が構築されています。しかし、業務アプリケーションの要件、エンドユーザーの使い勝手、運用部門のスキルセットなどの諸事情により、ビジネスアプリケーションがLinuxではなく、Windows Serverで稼働している企業や組織体も少なくありあせん。Windows Serverを利用している多くの企業では、Windows Server 2008、あるいは、Windows Server 2012に搭載されているHyper-Vによる仮想化技術を導入し、その上で仮想マシンを作成し、複数のビジネスアプリケーションを稼働させ、サーバー集約を図るといった運用が見られます。近年、DevOpsの観点から、Dockerが非常に注目を浴びていますが、マイクロソフト社は、Windows Server 2016において、Hyper-Vの機能強化だけでなく、Dockerへの対応も打ち出しており、大きな注目を浴びています。Linuxで稼働するDockerと同様に、大きな期待が寄せられているWindows Server 2016におけるコンテナ技術は、一体どのようなものなのでしょうか。本稿では、Windows Server 2016におけるコンテナ技術の採用やアーキテクチャ、さらに、Windows Server 2016におけるDocker環境の構築、Dockerfileの作成方法、そして、オープンソースの軽量なWebサーバーソフトウェアとして注目を浴びているnginx(エンジンエックス)をコンテナとして稼働させる具体的な構築手順を紹介します。

Windows Server 2016で導入されるコンテナの機能

Windows Server 2016では、Windows Server Containersが提供され、Dockerの仕組みを利用することができるようになっています。従来のハイパーバイザー型の仮想化の機能もさらに強化されますが、新しくコンテナ技術を採用し、Linux版のDocker環境と同様に、軽量なOSとアプリケーション環境を実現します。Windows Server 2016におけるDocker環境は、Linux版と同様に、Dockerエンジンが稼働し、Dockerイメージの取得、保存、そして、DockerfileによるDockerイメージのビルドが可能です。Windows Server 2016のDocker環境で利用可能なコンテナのOSとして、Windows Server Coreが提供されています。Windows Server CoreのDockerイメージや、WebサーバーのIISがインストールされているDockerイメージなどは、dockerコマンドを使って入手することが可能です。また、Dockerコンテナの起動、停止、イメージの入手などの操作は、Windows Server 2016のPowerShell上から行います。

Windows Server 2016におけるDocker
図1: Windows Server 2016におけるDocker

Windows Server 2016の入手

以下では、Windows Server 2016 Technical Preview 3を使って、オープンソースのWebサーバーソフトウェアであるnginx入りのDockerコンテナの構築手順を具体的に説明します。まず、Windows Server 2016 Technical Preview 3をマイクロソフト社のWebサイトから入手します。入手先URLは、以下のとおりです。

http://www.microsoft.com/en-us/evalcenter/evaluate-windows-server-technical-preview

TechNet Evaluation Centerでの評価版の入手
図2: TechNet Evaluation Centerでの評価版の入手

上図の「Download」をクリックし、「Sign In」をクリックします。すると、マイクロソフト社が提供するlive.comのログイン画面が出現しますので、live.comのアカウントでログインします。live.comのアカウントがない場合は、事前に作成しておきます。アカウント作成は無料で行えます。先程の「Download」の画面に新たに表示された「Registration to Continue」をクリックします。

レジストレーション画面
図3: レジストレーション画面

名前、メールアドレス、国名などを入力する画面が表示されます。全て入力したら、画面下部の「Continue」をクリックします。

ダウンロード前の個人情報の入力
図4: ダウンロード前の個人情報の入力

Windows Server 2016 Technical Preview 3のISOイメージである「10514.0.150808-1529.TH2_RELEASE_SERVER_OEMRET_X64FRE_EN-US.ISO」のダウンロードリンクが表示されますので、「Download」をクリックして、ISOイメージを入手します。このISOイメージは、物理サーバーやハイパーバイザー型の仮想化環境などで利用することができます。

ISOイメージの入手
図5: ISOイメージの入手

Windows Server 2016 Technical Preview 3のインストール

物理サーバーでもLinuxのKVM仮想化環境でも構いませんので、Windows Server 2016 Technical Preview 3をインストールするための環境を用意します。筆者の環境は、物理サーバーで稼働するCentOS 7.1に、KVM仮想化環境を用意し、Windows Server 2016 Technical Preview 3をゲストOSとして用意しました。また、仮想マシンの仮想ネットワークは、NATに設定しています。

Windows Server 2016で稼働するDockerのネットワーク構成例
図6: Windows Server 2016で稼働するDockerのネットワーク構成例

[注意]

CentOS 7.1のvirt-managerのバージョン1.1.0は、Windows Server 2016を正式にサポートしていません。virt-managerにおけるOSの選択において、「Windows 8.1」を選択すると、非サポートではあるものの、Windows Server 2016 Technical Preview 3をゲストOSとして稼働させることができます。ただし、正常な動作が保証できませんので、あくまで、簡易的な動作確認や操作の習得などに留めておいてください。本番環境においては、正式にリリースされたWindows Server 2016を使用し、サポートされる仮想化環境で稼働させる必要があります。

CentOS 7.1のvirt-managerにおける仮想マシンのOSの種類とバージョンの選択
図7: CentOS 7.1のvirt-managerにおける仮想マシンのOSの種類とバージョンの選択

[注意]

Windows Server 2016 Technical Preview 3において、稼動するコンテナは、172.16.0.0/12のネットワークを利用します。もし、ホストOS側で172.16.0.0/16などのプライベートアドレスのネットワークが設定され、かつ、Windows Server 2016 Technical Preview 3が稼働する仮想マシンにおいて、ブリッジインタフェースを使って、ホストOSと同一ネットワークの172.16.0.0/16を利用する場合は、Docker構築のためのインストールスクリプトがうまく稼働しません。仮想化環境などの仮想マシンにWindows Server 2016 Technical Preview 3をインストールし、その仮想マシン上でDockerを試す場合は、事前に、仮想マシンの仮想ネットワークをNATに設定して下さい。NATに設定することにより、例えば、物理サーバーのホストOSが172.16.0.0/16のネットワークに所属していたとしても、その上で稼働する仮想マシンのWindows Server 2016 Technical Preview 3は、NAT構成により、192.168.0.0/24が割り当てられ、さらに仮想マシンで稼働するコンテナに、172.16.0.0/12のネットワークのIPアドレスを割り当てることができます。ホストOS上のvirt-managerを使えば、KVM仮想マシンの仮想ネットワークをbridgeからNATに簡単に設定変更することができます。

CentOS 7.1のvirt-managerで仮想マシンの仮想ネットワークをNATに設定
図8: CentOS 7.1のvirt-managerで仮想マシンの仮想ネットワークをNATに設定

インストーラの起動

入手したISOイメージをDVDドライブに装着し、サーバーの電源を投入します。DVDブートが開始し、Windows Server 2016 Technical Preview 3のインストーラが起動します。言語の選択画面が表示されます。

言語の選択
図9: 言語の選択

「Install Now」をクリックします。

「Install Now」をクリック
図10: 「Install Now」をクリック

「Windows Server 2016 Technical Preview 3 (Server with Desktop Experience)」を選択します。

「Windows Server 2016 Technical Preview 3 (Server with Desktop Experience)」を選択
図11: 「Windows Server 2016 Technical Preview 3 (Server with Desktop Experience)」を選択

ソフトウェアの使用許諾に同意します。

ソフトウェアの使用許諾に同意
図12: ソフトウェアの使用許諾に同意

カスタムインストールを選択します。

カスタムインストールの選択
図13: カスタムインストールの選択

ローカルディスクにWindows Server 2016 Technical Preview 3をインストールするため、「New」をクリックします。

OS用のディスクの選択とパーティション作成_40GB
図14: OS用のディスクの選択とパーティション作成_40GB

ローカルディスク全てをOS用に割り当て、「Apply」をクリックし、OKをクリックします。

ローカルディスク全てを使用
図15: ローカルディスク全てを使用
システムファイル用の追加パーティションを作成する旨のメッセージ
図16: システムファイル用の追加パーティションを作成する旨のメッセージ

ローカルディスク上にOSの領域が作成されたら、「OK」をクリックします。すると、OSのインストールが開始されます。

OS用のディスクパーティションが正常に作成された様子
図17: OS用のディスクパーティションが正常に作成された様子
OSがインストールされている様子
図18: OSがインストールされている様子

管理者アカウントの「Administrator」のパスワードを設定し、「Finish」をクリックします。

Administratorのパスワード設定
図19: Administratorのパスワード設定

CtrlキーとAltキーとDelキーを押し、インストールされたWindows Server 2016 Technical Preview 3のログイン画面を開きます。ログイン画面が表示されたら、Administratorアカウントでログインします。

ログイン画面を開く
図20: ログイン画面を開く
Administratorアカウントでログイン
図21: Administratorアカウントでログイン

Windows Server 2016 Technical Preview 3にDocker環境をインストール

Windows Server 2016 Technical Preview 3では、Docker環境をインストールするためのスクリプトが用意されています。デスクトップ画面左下の窓のボタンをクリックし、入力欄に「powershell」を入力し、PowerShellを起動します。Windows Server 2016 Technical Preview 3に割り当てられているIPアドレスをipconfigコマンドで確認しておきます。筆者の環境は、CentOS 7.1のホストOSのKVM環境で、仮想マシンの仮想ネットワークをNAT構成しており、Windows Server 2016 Technical Preview 3をゲストOSとして稼働させているため、IPアドレスは、標準で、192.168.122.X/24が割り当てられています。

PowerShellの起動
図22: PowerShellの起動
IPアドレスの確認
図23: IPアドレスの確認

wgetを使ってDocker環境構築用のスクリプトを入手するコマンドを入力します。以下では、Windows Server 2016 Technical Preview 3のPowerShellのプロンプトを「PS C:\>」で表します。

PS C:\> cd c:\
PS C:\> wget -uri http://aka.ms/setupcontainers -OutFile C:\ContainerSetup.ps1
スクリプトの入手
図24: スクリプトの入手

入手したスクリプトを実行します。

PS C:\> .\ContainerSetup.ps1
スクリプトの実行
図25: スクリプトの実行

スクリプトの実行がしばらく続くと、Windows OSが自動的に再起動されます。OS再起動後、再度、Administratorアカウントでログインします。デスクトップ上にPowerShellのウィンドウが自動的に表示され、コンテナ用のOSイメージがダウンロードされます。OSイメージのダウンロードは、しばらく時間がかかります。

OSイメージの入手
図26: OSイメージの入手

[注意]

OSが再起動後にネットワークに問題がある旨の警告メッセージが表示される場合は、スクリプトが正常に実行されませんので、Windowsのネットワーク環境を見直す必要があります。特に、仮想化環境を提供するホストOSがクラスBの172.16.0.0/16のネットワークに所属し、Windows Server 2016 Technical Preview 3をゲストOSとして仮想化環境で稼働させる場合などは、仮想化ソフトウェア側で設定している仮想マシンの仮想ネットワークをNAT構成にする等の対処が必要になります。

Docker環境が構築

OSイメージのダウンロードが完了すると、Dockerがインストールされます。スクリプトの処理が全て終了すると、「Script Complete!」と表示されます。以上で、Windows Server 2016 Technical Preview 3で、Docker環境が構築されました。

スクリプトの実行が完了した様子
図27: スクリプトの実行が完了した様子

Windows Server 2016 Technical Preview 3のDocker環境を体験

Dockerがインストールできましたので、PowerShell上から、dockerコマンドを利用することができます。念のため、Dockerサービスが稼働しているかを確認しておきます。サービスが稼働しているかどうかを確認するには、「Get-Service docker」を入力します。

PS C:\> Get-Service docker
Dockerのサービスが稼働しているかを確認
図28: Dockerのサービスが稼働しているかを確認

dockerのバージョンを確認します。

PS C:\> docker version

また、ローカルに保存されているイメージを確認してみます。

PS C:\> docker images

下図のように、Windows Server Coreのイメージが存在していることがわかります。

Dockerのバージョンとローカルのイメージを確認
図29: Dockerのバージョンとローカルのイメージを確認

利用可能なイメージを検索してみます。

PS C:\> docker search microsoft

すると、IIS、MongoDB、rubyなどのオープンソースソフトウェアが入ったWindowsコンテナイメージが存在することがわかります。

利用可能なDockerイメージを検索
図30: 利用可能なDockerイメージを検索

Webサーバーのnginxが稼働するコンテナを作成する

Windows Server 2016 Technical Preview 3のDocker環境で、Dockerコンテナを作成します。今回は、例として、オープンソースの軽量Webサーバーのnginxが稼働するDockerコンテナを作成します。nginx入りのDockerコンテナイメージは、Dockerfileを使って作成します。そして、作成したDockerイメージから、Nginxが稼働するコンテナを稼働させます。まず、PowerShellを起動し、nginxを稼働させるDockerコンテナを作成するための作業フォルダを作成します。

PS C:\> cd C:\
PS C:\> mkdir C:\build\nginx\source

wgetコマンドを使って、nginxのzipファイルをインターネット経由で入手します。Windows Server 2016 Technical Preview 3には、あらかじめIPアドレスが割り当てられ、インターネットに接続できる必要があります。

PS C:\> wget -uri 'http://nginx.org/download/nginx-1.9.3.zip' -OutFile "c:\nginx-1.9.3.zip"
作業ディレクトリの作成とnginxの入手
図31: 作業ディレクトリの作成とnginxの入手

入手したnginxをExpand-Archiveコマンドで展開します。

PS C:\> Expand-Archive -Path C:\nginx-1.9.3.zip -DestinationPath C:\build\nginx\source -Force
nginxをExpand-Archiveコマンドで展開している様子
図32: nginxをExpand-Archiveコマンドで展開している様子

new-itemコマンドで、空のDockerfileを作成し、メモ帳(notepad.exe)を使って、Dockerfileを編集します。

PS C:\> new-item -Type File C:\build\nginx\Dockerfile
PS C:\> notepad.exe C:\build\nginx\Dockerfile
空のDockerfileを作成し、メモ帳で編集
図33: 空のDockerfileを作成し、メモ帳で編集

Dockerfileは、下図のように記述します。

nginxをインストールするDockerfileの例
図34: nginxをインストールするDockerfileの例

Dockerfileを記述したら、内容を保存し、メモ帳を閉じます。typeコマンドで、Dockerfileの中身を確認します。

PS C:\> type C:\build\nginx\Dockerfile
FROM windowsservercore
LABEL Description="nginx For Windows" Vendor="nginx" Version="1.9.3"
ADD source /nginx
typeコマンドでDockerfileの中身を確認
図35: typeコマンドでDockerfileの中身を確認

作成したdockerfileを使って、docker buildによりDockerイメージを作成します。今回、イメージ名は、nginx0001とします。

PS C:\> docker build -t nginx0001 C:\build\nginx
Dockerfileを使ってイメージをビルドする様子
図36: Dockerfileを使ってイメージをビルドする様子

Nginx入りのDockerイメージが生成されているかどうかをdocker imagesで確認します。

PS C:\> docker images
nginx入りのイメージが生成されているかを確認
図37: nginx入りのイメージが生成されているかを確認

80番ポートでアクセスできるように、ファイヤウォールのルールを追加します。

PS C:\> New-NetFirewallRule -Name "TCP80" -DisplayName "TCP80" -Protocol tcp -LocalPort 80 -Action Allow -Enabled True
ファイヤウォールのルールを追加
図38: ファイヤウォールのルールを追加

docker runにより、nginx入りのコンテナを起動します。今回、コンテナ名は、web0001とします。

PS C:\> docker run -i -t --name web0001 -p 80:80 nginx0001:latest cmd.exe
nginx入りのイメージからコンテナを起動
図39: nginx入りのイメージからコンテナを起動

PowerShellのウィンドウが、コマンドプロンプトの画面になります。このコマンドプロンプトは、コンテナのコマンドプロンプトです。コンテナのコマンドプロンプトで、nginxがインストールされているフォルダ「C:\nginx\nginx-1.9.3」に移動します。

コンテナのコマンドプロンプトでnginxがインストールされたディレクトリに移動
図40: コンテナのコマンドプロンプトでnginxがインストールされたディレクトリに移動

「start nginx」と入力し、nginxサービスを起動します。

nginxサービスの起動
図41: nginxサービスの起動

Windows Server 2016 Technical Preview 3からnginxが稼働するコンテナにアクセスするため、コンテナのIPアドレスをipconfigコマンドで表示します。今回は、コンテナにIPアドレスとして172.16.0.2/12が割り当てられています。

コンテナのIPアドレスを表示
図42: コンテナのIPアドレスを表示

Windows Server 2016 Technical Preview 3のデスクトップ画面からInternet Explorerを以下の手順で起動します。まず、デスクトップ画面の左下の窓のボタンをクリックし、「All Apps」をクリックします。次に、「Windows Accessories」をクリックし、「Internet Explorer」をクリックします。Internet Explorerが起動したら、nginxが稼働しているコンテナのIPアドレス(今回の場合は、172.16.0.2)を入力します。「Welcome to nginx!」が表示されているかを確認してください。

nginxが稼働するコンテナのIPアドレスを指定しWebブラウザからアクセスした様子
図43: nginxが稼働するコンテナのIPアドレスを指定しWebブラウザからアクセスした様子

以上で、nginxが稼働するコンテナがクライアントに対してWebサービスを提供することができました。次に、echoコマンドを使って、Webコンテンツtest.htmlを作成します。この作業は、コンテナが提供するコマンドプロンプトで行います。

C:\> cd c:\nginx\nginx-1.9.3\html
C:\> echo "Hello nginx container on Windows Server 2016 TP3" > test.html
C:\> dir /w
Webコンテンツtest.htmlをechoコマンドで作成
図44: Webコンテンツtest.htmlをechoコマンドで作成

作成したtest.htmlが表示されるかをWebブラウザで確認します。確認するURLは、http://コンテナのIPアドレス/test.htmlとなります。

コンテナが提供するWebコンテンツtest.htmlをWebブラウザで確認
図45: コンテナが提供するWebコンテンツtest.htmlをWebブラウザで確認

以上で、Windows Server 2016 Technical Preview 3で構築したDocker環境のコンテナでnginxのWebサーバーを稼働させ、Webコンテンツをクライアントに提供することができました。Windows Server 2016におけるDockerの操作方法は、Linux版とほとんど変わりませんし、Dockerfileの取り扱いもLinux版と同様に行うことができます。現時点で、Windows版のDockerは、Linux版に比べると機能面などにおいて発展途上ですが、今後は、安定性の向上や機能拡張も施され、Windows Serverにおいても、仮想化と同様にDockerコンテナが広く利用されるに違いありません。また、近年、nginxのように、Linux環境だけでなく、Windows環境で動作するオープンソースソフトウェアも急速に増えてきています。今回ご紹介したnginxのように、Windowsにおける導入が非常に簡単なオープンソースソフトウェアも数多く存在しますので、是非、Windows Server 2016 Technical Preview 3のDocker環境でオープンソースソフトウェアを駆使したコンテナの作成に挑戦してみてください。

日本ヒューレット・パッカード株式会社 プリセールス統括本部 ソリューションセンター OSS・Linux担当 シニアITスペシャリスト

兵庫県伊丹市出身。1996年頃からオープンソースに携わる。2000年よりUNIXサーバーのSE及びスーパーコンピューターの並列計算プログラミング講師を担当。科学技術計算サーバーのSI経験も持つ。2005年、大手製造業向けLinuxサーバー提案で日本HP社長賞受賞。2006年、米国HPからLinux技術の伝道師に与えられる「OpenSource and Linux Ambassador Hall of Fame」を2年連続受賞。日本HPプリセールスMVPを4度受賞。現在は、Linux、FreeBSD、Hadoop等のOSSを駆使したスケールアウト型サーバー基盤のプリセールスSE、技術検証、技術文書執筆を担当。日本HPのオープンソース・Linuxテクノロジーエバンジェリストとして講演活動も行っている。Red Hat Certified Engineer、Red Hat Certified Virtualization Administrator、Novell Certified Linux Professional、EXIN Cloud Computing Foundation Certificate、HP Accredited Systems Engineer Cloud Architect、Red Hat Certified System Administrator in Red Hat OpenStack、Cloudera Certified Administrator for Apache Hadoop認定技術者。HP公式ブログ執筆者。趣味はレーシングカートとビリヤード

連載バックナンバー

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

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

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

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