つばろぐ

主に C#, .NET, Azure の備忘録です。たまに日記。

Windows Server Container に入門してみた

この記事は Microsoft Azure Advent Calendar 2015 23日目の記事です。
はじめてアドベントカレンダーなるものを書きます。


12月上旬、社内でAzureもくもく会を行いました。
これまであまり触れたことないサービスについて調べてみようと思い、Windows Server Containerをネタにしました。
今回の記事はWindows Server Containerに入門してみたという内容です。
もくもく会の報告も兼ねる!)

Windows Server Containerとは

Windows Serverのコア機能のみを搭載したOSをコンテナ化したものです。
Windows Server 2016 Technical Preview 3から利用することが可能です。

コンテナといえばDockerをイメージされる方が多いと思います。
Windows Server Containerも、Windows用のDockerエンジン上で管理・動作します。

Windows Server 2016には、2つのコンテナがあります。が、今回はHyper-V Containerは省略します。

Windows Server Containerを勉強するには

何はともあれ、まずはMSDNチュートリアルを試すことが良いと思います。
Windows Server Containerのチュートリアルは英語ですが、キャプチャを交えて紹介されていますので、英語が苦手な方でも取り組むことができると思います。

Windows Containers Documentation

環境の準備

前述の通り、Windows Server Containerを利用するには、Windows Server 2016 Technical Preview 3以降が必要となります。
Windows Server 2016 Technical Previewを用意するには、ISOをダウンロードして仮想マシンを作成してもいいでしょうが、今回はさくっとAzure仮想マシンを利用します。

AzureにはMarketplaceと言われる、様々なアプリケーションがインストール済の仮想マシンイメージを公開している画面があります。
その中からWindows Server 2016 Technical Preview 4を選択し、仮想マシンを作成しましょう。

f:id:tech-tsubaki:20151222211441j:plain

仮想マシンが立ち上がったらリモートデスクトップで接続します。
Azureポータルの仮想マシン管理のメニューから「接続」をクリックすると、その仮想マシンリモートデスクトップ接続するためのファイルをダウンロードすることができます。

コマンドでコンテナを扱う

Windows Server Containerをコマンドで扱うには2つの方法があります。

PowerShellです。

Windows Server Containerを扱うためのPowerShellコマンドレットが予めインストールされているので、それを使用します。
Windows Containers Quick Start - PowerShell

コマンドレットについては下記リンクを参照して下さい。
Containers Cmdlets

コンテナイメージを取得する
PS C:\Users\matsumura> Get-ContainerImage

Name              Publisher    Version      IsOSImage
----              ---------    -------      ---------
WindowsServerCore CN=Microsoft 10.0.10586.0 True
コンテナイメージからコンテナを作成する
PS C:\Users\matsumura> New-Container -Name TP4Demo -ContainerImageName WindowsServerCore -SwitchName "Virtual Switch"

Name    State Uptime   ParentImageName
----    ----- ------   ---------------
TP4Demo Off   00:00:00 WindowsServerCore
コンテナを開始する/停止する
PS C:\Users\matsumura> Start-Container -Name TP4Demo
PS C:\Users\matsumura> Stop-Container -Name TP4Demo
新しいコンテナイメージを作成する
PS C:\Users\matsumura> New-ContainerImage -ContainerName TP4Demo -Name WindowsServerCoreIIS -Publisher Demo -Version 1.0

Name                 Publisher Version IsOSImage
----                 --------- ------- ---------
WindowsServerCoreIIS CN=Demo   1.0.0.0 False

PS C:\Users\matsumura> Get-ContainerImage

Name                 Publisher    Version      IsOSImage
----                 ---------    -------      ---------
WindowsServerCoreIIS CN=Demo      1.0.0.0      False
WindowsServerCore    CN=Microsoft 10.0.10586.0 True
コンテナやコンテナイメージを削除する
PS C:\Users\matsumura> Remove-Container -Name TP4Demo
PS C:\Users\matsumura> Remove-ContainerImage -Name WindowsServerCoreIIS

Docker

Windows Server 2016 Technical PreviewにはDockerがインストールされています。
なのでdockerコマンドでもWindows Server Containerを扱うことができます。
Windows Containers Quick Start - Docker

Dockerを利用したことがある人は、こちらのほうがイメージがつきやすいのではないでしょうか?

なお、Windows Server 2016 Technical PreviewにインストールされているDockerは、GitHubに公開されているDockerのバージョンと異なることに注意して下さい。

PS C:\Users\matsumura> docker version
Client:
 Version:      1.10.0-dev
 API version:  1.22
 Go version:   go1.5.1
 Git commit:   59a341e
 Built:        Fri Nov 13 17:23:07 UTC 2015
 OS/Arch:      windows/amd64

Server:
 Version:      1.10.0-dev
 API version:  1.22
 Go version:   go1.5.1
 Git commit:   59a341e
 Built:        Fri Nov 13 17:23:07 UTC 2015
 OS/Arch:      windows/amd64

github.com

WindowsにDockerがインストールされてるから、これでUbuntuとかたてれるな!Boot2Dockerみたいなもんやろ!」と思いましたが、Windows用のDockerエンジンのためLinuxOSを実行させることはできないようです。

PS C:\Users\matsumura> docker pull ubuntu:latest
Pulling repository docker.io/library/ubuntu
Error: image library/ubuntu:latest not found

もちろんDockerfileからコンテナを作成することもできます。

FROM windowsservercore:latest
MAINTAINER Yuta Matsumura "matsumura@example.com"
RUN dism /online /enable-feature /all /featurename:iis-webserver /NoRestart
RUN echo "Hello World - Dockerfile" > c:\inetpub\wwwroot\index.html
PS C:\Users\matsumura\iis> docker build -t iis .
Sending build context to Docker daemon  2.56 kB
Step 1 : FROM windowsservercore:latest
 ---> 6801d964fda5
Step 2 : MAINTAINER Yuta Matsumura "matsumura@example.com"
 ---> Running in 279bc98c968b
 ---> 2d9e54d328cf
Removing intermediate container 279bc98c968b
Step 3 : RUN dism /online /enable-feature /all /featurename:iis-webserver /NoRestart
 ---> Running in aa7b0e18b1ec

Deployment Image Servicing and Management tool
Version: 10.0.10586.0

Image Version: 10.0.10586.0

まとめと今後の課題

MSDNチュートリアルに沿うと、Windows Server Containerについて少し理解することができるようになりました。
ただコンテナを作って終わりでは面白くないので、継続的インテグレーション(CI)に利用できるような使い道を探ってみたいと思います。

Visual Studio Team Services(VSTS)のPowerShellデプロイ機能を利用して、Windows Server Containerをバンバン作ってみようと試しましたが、VSTSとAzure仮想マシンの接続がうまくいかず断念したため、年末年始で再チャレンジしてみたいです。