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

欧米の先進の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の入手
以下では、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

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

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

Windows Server 2016 Technical Preview 3のISOイメージである「10514.0.150808-1529.TH2_RELEASE_SERVER_OEMRET_X64FRE_EN-US.ISO」のダウンロードリンクが表示されますので、「Download」をクリックして、ISOイメージを入手します。この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に設定しています。

[注意]
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を使用し、サポートされる仮想化環境で稼働させる必要があります。

[注意]
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に簡単に設定変更することができます。

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

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

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

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

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

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

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


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


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

CtrlキーとAltキーとDelキーを押し、インストールされたWindows Server 2016 Technical Preview 3のログイン画面を開きます。ログイン画面が表示されたら、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が割り当てられています。


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

入手したスクリプトを実行します。
PS C:\> .\ContainerSetup.ps1

スクリプトの実行がしばらく続くと、Windows OSが自動的に再起動されます。OS再起動後、再度、Administratorアカウントでログインします。デスクトップ上にPowerShellのウィンドウが自動的に表示され、コンテナ用のOSイメージがダウンロードされます。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環境が構築されました。

Windows Server 2016 Technical Preview 3のDocker環境を体験
Dockerがインストールできましたので、PowerShell上から、dockerコマンドを利用することができます。念のため、Dockerサービスが稼働しているかを確認しておきます。サービスが稼働しているかどうかを確認するには、「Get-Service docker」を入力します。
PS C:\> Get-Service docker

dockerのバージョンを確認します。
PS C:\> docker version
また、ローカルに保存されているイメージを確認してみます。
PS C:\> docker images
下図のように、Windows Server Coreのイメージが存在していることがわかります。

利用可能なイメージを検索してみます。
PS C:\> docker search microsoft
すると、IIS、MongoDB、rubyなどのオープンソースソフトウェアが入ったWindowsコンテナイメージが存在することがわかります。

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をExpand-Archiveコマンドで展開します。
PS C:\> Expand-Archive -Path C:\nginx-1.9.3.zip -DestinationPath C:\build\nginx\source -Force

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は、下図のように記述します。

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

作成したdockerfileを使って、docker buildによりDockerイメージを作成します。今回、イメージ名は、nginx0001とします。
PS C:\> docker build -t nginx0001 C:\build\nginx

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

80番ポートでアクセスできるように、ファイヤウォールのルールを追加します。
PS C:\> New-NetFirewallRule -Name "TCP80" -DisplayName "TCP80" -Protocol tcp -LocalPort 80 -Action Allow -Enabled True

docker runにより、nginx入りのコンテナを起動します。今回、コンテナ名は、web0001とします。
PS C:\> docker run -i -t --name web0001 -p 80:80 nginx0001:latest cmd.exe

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

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

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

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が稼働するコンテナがクライアントに対して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

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

以上で、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環境でオープンソースソフトウェアを駆使したコンテナの作成に挑戦してみてください。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- Windows Server コンテナ始動!
- Dockerfileを使いこなす(2)
- より速く、より小さく、より軽く、 新基盤 Nano Server(後編)
- より速く、より小さく、より軽く、 新基盤 Nano Server (前編)
- Dockerfileを使いこなす(1)
- Windows Subsystem for Linux 2 でDocker を使用する(その1)
- Windows Server 2016 Technical Preview 3 で見えたコンテナ技術
- Hyper-Vのライブマイグレーションとその他の拡張機能
- KubernetesのマニフェストをMagnumで実行する
- vNext Hyper-Vの注意すべき変更点 仮想マシンの運用