fbpx

Windows Server Containers を Docker で操作する #docker #windows

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

Windows Server Containers

先日、コンテナ (Windows Server Containers) の実装が追加された Windows Server 2016 Technical Preview 3 (TP3) が公開されました。
Windows Server Containers は軽量な OS の仮想化技術であり、ホスト OS から分離された空間(コンテナ)で、アプリケーションやサービスを動かすことができます。作成されたコンテナは、それぞれ独自の OS、プロセッサ、ファイルシステム、レジストリ、IP アドレスを持ちます。
ただし、要求される API やカーネルが異なるため、Linux のコンテナを Windows で動かすことはできません。
詳細については、以下のページを参照してください。
https://msdn.microsoft.com/virtualization/windowscontainers/about/about_overview

Linux でコンテナを管理するには Docker が有名ですが、Windows Server Containers も Docker Clientとの互換性があり、Linux と同じように docker コマンドが使えるようになっています。また、PowerShell でも操作可能です。
wsc_01_001

TP なのでいろいろと問題や制限がありますが、これらに関しては以下のページに記載されています。
https://msdn.microsoft.com/virtualization/windowscontainers/about/work_in_progress

それでは、Windows Server Containers を Docker を使って操作してみます。

Windows Server 2016 TP3 をインストールする

以下のページから、Windows Server 2016 TP3 の ISO ファイルをダウンロードします。ダウンロードするには、Microsoft アカウントでサインインが必要です。
http://www.microsoft.com/en-us/evalcenter/evaluate-windows-server-technical-preview

今回は、Hyper-V の VM にインストールします。ダウンロードした ISO ファイルを仮想 DVD ドライブにセットして VM を作成します。

[Languages to install] は English しか選択できません。[Time and currency format] に Japanese を選択し、[Next] をクリックします。
wsc_01_002

Operating system は どちらを選択してもかまいません。[Windows Server 2016 Technical Preview 3] を選択した場合は、GUI 無しのサーバーコアになります。
wsc_01_003

以後は、ライセンスに同意して、デフォルトの設定で [Next] をクリックしていけば、インストールが始まります。
wsc_01_004

インストール完了後、Administrator のパスワード変更を求められるので、任意のパスワードを指定します。

これで Windows Server 2016 TP3 のインストールは完了です。続いて、Administrator でログオンし、以下のコマンドでホスト名を sv2016 に変更します。自動で OS が再起動されますので、再起動後に Administrator でログオンします。

PS C:\> Rename-Computer -NewName sv2016 –Restart

コンテナの機能を追加する

コンテナは、Windows Server 2016 の “機能” として、Containers という名前で用意されています。まずは、これを PowerShell で確認してみます。

PS C:\> Get-WindowsFeature -Name Containers | Select-Object *
Name                      : Containers
DisplayName               : Containers
Description               : Provides services and tools to create and manage Windows Server Containers and their resources.
Installed                 : False
InstallState              : Available
FeatureType               : Feature
Path                      : Containers
Depth                     : 1
DependsOn                 : {}
Parent                    :
ServerComponentDescriptor : ServerComponent_Containers
SubFeatures               : {}
SystemService             : {}
Notification              : {}
BestPracticesModelId      :
EventQuery                :
PostConfigurationNeeded   : False
AdditionalInfo            : {MajorVersion, MinorVersion, NumericId, InstallName}

手動で有効化しても構いませんが、今回は Microsoft から提供されているセットアップスクリプトを使用してインストールします。
https://msdn.microsoft.com/virtualization/windowscontainers/quick_start/inplace_setup

このページを参考に、スクリプトをダウンロードします。

PS C:\> wget -uri http://aka.ms/setupcontainers -OutFile C:\ContainerSetup.ps1
PS C:\> dir | Where-Object {$_.Name -eq 'ContainerSetup.ps1'}
Directory: C:\
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2015/08/31     11:28          19436 ContainerSetup.ps1

スクリプトを実行して、コンテナをインストールします。

PS C:\> .\ContainerSetup.ps1
Querying status of Windows feature: Containers...
Enabling feature Containers...
警告: You must restart this server to finish the installation process.
Restart is required; restarting now...

OS 再起動後、Administrator でログオンすると、コンテナ用のネットワークの設定と、コンテナ OS イメージがダウンロードされます。また、Docker もインストールされるので、docker コマンドが使えるようになります。

Querying status of Windows feature: Containers...
Feature Containers is already enabled.
Enabling container networking...
Creating container switch (NAT)...
Creating NAT for 172.16.0.0/12...
Installing Container OS image from http://aka.ms/ContainerOSImage (this may take a few minutes)...
Downloading Container OS image (WIM) from http://aka.ms/ContainerOSImage to C:\Users\Administrator\ContainerBaseImage.wim...
WARNING: Waiting for service 'Hyper-V Virtual Machine Management (vmms)' to stop...
Waiting for VMMS to return image at (08/31/2015 13:44:50)...
Waiting for VMMS to return image at (08/31/2015 13:44:53)...
Container base image install complete.  Querying container images...
The following images are present on this machine:
ContainerImage (Name = 'WindowsServerCore') [Publisher = 'CN=Microsoft', Version = '10.0.10514.0'].Name

Installing Docker...
This script uses a third party tool: NSSM service manager. For more information, see https://nssm.cc/usage
Downloading NSSM...
Extracting NSSM from archive...
Creating Docker program data...
Configuring NSSM for Docker service...
Waiting for Docker daemon...
Successfully connected to Docker Daemon.
Tagging new base image...
Script complete!

これで、インストールが完了しました。

インストール後の確認をする

セットアップスクリプトで追加されたサービスやネットワークなどを確認します。

サービス

docker サービスが、Docker デーモンになります。Docker デーモンは、Docker Remote API を通して Windows コンテナの管理機能を提供します。Docker Client(docker コマンド)を使用したコンテナの操作が可能になります。
このサービスを開始すると、TCP 2375 でクライアントからのリクエストを待機します。

PS C:\> Get-Service docker
Status   Name               DisplayName
------   ----               -----------
Stopped  docker             Docker Daemon

PS C:\> netstat -ano | findstr "2375"
TCP    127.0.0.1:2375         0.0.0.0:0              LISTENING       1160

PS C:\> tasklist | findstr "1160"
docker.exe                    1160 Services                   0     14,980 K

vmcompute サービス(Hyper-V Host Compute Service)は、Windows コンテナのサポート機能を提供します。このサービスが、Windows コンテナを制御しています。
ちなみに、このサービスが停止していても、Docker や PowerShell でコマンドを実行すると、自動で vmcompute サービスが起動します。

PS C:\> Get-Service vmcomputer
Status   Name               DisplayName
------   ----               -----------
Running  vmcompute          Hyper-V Host Compute Service

ネットワーク

vEthernet (172.16.0.1) という仮想スイッチが追加されています。コンテナの IP アドレスは、172.16.0.0/12 のサブネットから割り当てられます。

PS C:\> ipconfig
Windows IP Configuration
Ethernet adapter Ethernet:
Connection-specific DNS Suffix  . :
IPv6 Address. . . . . . . . . . . : 2001:a0ba:cb55:0:19d:7b52:b595:eb42
Link-local IPv6 Address . . . . . : fe80::19d:7b52:b595:eb42%3
IPv4 Address. . . . . . . . . . . : 192.168.24.70
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : fe80::200:87ff:fec3:a035%3
192.168.24.1

Ethernet adapter vEthernet (Virtual Switch):
Connection-specific DNS Suffix  . :
Link-local IPv6 Address . . . . . : fe80::6540:f0a0:99ad:40ac%12
IPv4 Address. . . . . . . . . . . : 172.16.0.1
Subnet Mask . . . . . . . . . . . : 255.240.0.0
Default Gateway . . . . . . . . . :
…
PS C:\> Get-VMSwitch
Name           SwitchType NetAdapterInterfaceDescription
----           ---------- ------------------------------
Virtual Switch NAT

コンテナイメージ

2 つのイメージが表示されます。それぞれの TAG の値は違いますが、ID が同じなので、実体は同じものです。

PS C:\> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
windowsservercore   10.0.10514.0        0d53944cb84d        2 weeks ago         9.697 GB
windowsservercore   latest              0d53944cb84d        2 weeks ago         9.697 GB

コンテナで IIS を動かしてみる

コンテナのインストールが終わったので、ここからは動作確認を行います。コンテナ内部で IIS サービスを動かし、Web ページを公開してみます。

イメージを検索する

まず、docker search コマンドで、レジストリから適当なイメージを検索してみます。TP3 の時点で、docker search の動作は以下のようになっています。
- レジストリは registry-win-tp3.docker.io
- どのキーワードで検索しても以下の同じ結果が返ってくる。

PS C:\> docker search iis
NAME                    DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
microsoft/iis           Internet Information Services (IIS) instal...   1         [OK]       [OK]
microsoft/dnx-clr       .NET Execution Environment (DNX) installed...   1         [OK]       [OK]
microsoft/ruby          Ruby installed in a Windows Server Contain...   1                    [OK]
microsoft/rubyonrails   Ruby on Rails installed in a Windows Serve...   1                    [OK]
microsoft/python        Python installed in a Windows Server Conta...   1                    [OK]
microsoft/go            Go Programming Language installed in a Win...   1                    [OK]
microsoft/mongodb       MongoDB installed in a Windows Server Cont...   1                    [OK]
microsoft/redis         Redis installed in a Windows Server Contai...   1                    [OK]
microsoft/sqlite        SQLite installed in a Windows Server Conta...   1                    [OK]

IIS のイメージをダウンロードする

試しに、docker pull コマンドで microsoft/iis イメージをダウンロードしてみると、問題なくダウンロードできました。

PS C:\> docker pull microsoft/iis
Using default tag: latest
latest: Pulling from microsoft/iis
9aaec35b61af: Pulling fs layer
9aaec35b61af: Verifying Checksum
9aaec35b61af: Download complete
9aaec35b61af: Pull complete
Digest: sha256:d821828ee496a825794b51a8f30369cb32791d7aaa9c7a11cd2a94e9ba3c2e27
Status: Downloaded newer image for microsoft/iis:latest

docker images と docker history コマンドの実行結果です。docker history コマンドでイメージの更新履歴を確認できますが、microsoft/iis は windowsservercore から更新された(servercore に、IIS の機能が追加された)ことがわかります。

PS C:\> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
microsoft/iis       latest              9aaec35b61af        12 days ago         9.881 GB
windowsservercore   10.0.10514.0        0d53944cb84d        2 weeks ago         9.697 GB
windowsservercore   latest              0d53944cb84d        2 weeks ago         9.697 GB

PS C:\> docker history microsoft/iis
IMAGE               CREATED             CREATED BY          SIZE                COMMENT
9aaec35b61af        12 days ago         powershell          184.6 MB
0d53944cb84d        2 weeks ago                             9.697 GB

Windows コンテナイメージは、Docker のイメージと同じ様に複数の層で構成されており、一番下のベースとなる層を Container OS Image と呼び、これの上層を Container Image と呼びます。Container OS Image に変更を加えることはできません。イメージに機能を追加するには、Container Image の層を追加する形で行います。
詳しくは、以下のページの “Container Fundamentals” を参照してください。
https://msdn.microsoft.com/virtualization/windowscontainers/about/about_overview

コンテナを作成する

先ほどダウンロードした microsoft/iis イメージを使用して、コンテナを作成します。-d でデタッチド・モード(バックグラウンドでコンテナが動作する)にし、-p でホスト側の TCP 80 ポートをコンテナ側の TCP 80 ポートにマッピングします。

PS C:\> docker run -d -p 80:80 microsoft/iis:latest
d88a360540926a16c9658f5348b4124023806b96b03bad0ad3cfd11f74a5a90a

起動したコンテナを確認してみます。

PS C:\> docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d88a36054092        microsoft/ii        "powershell"        14 hours ago        Up 2 minutes                            sick_varahamihira

Web ページを開いてみます。コンテナホストとは TCP 80 同士でマッピングしたので、以下の URI で IIS のデフォルトページが表示されます。
http://<コンテナホストの IP アドレス>/
wsc_01_005

コンテナ内の OS を操作する

デタッチド・モードで起動した IIS のコンテナはバックグラウンドで動作しています。これをコマンドプロンプトや PowerShell で操作したい場合は、docker exec コマンドを使って cmd や powershell を追加実行します。
-it オプションをつけることにより、コンテナで起動されたコマンドプロンプトを直接操作(コマンド入力など)ができるようになります。
d8 は、このコンテナ ID の先頭 2 文字です。値が被らなければ、ID の一部を指定するだけでコンテナの指定が可能です。

PS C:\> docker exec -it d8 powershell
Windows PowerShell
Copyright (C) 2015 Microsoft Corporation. All rights reserved.

PS C:\Windows\system32>

コンテナの内部の PowerShell session に接続したので、色々とコンテナ内部を確認してみます。ネットワークは 172.16.0.0/12 から割り当てられています。仮想スイッチの NAT により、インターネットにもアクセスできます。

PS C:\Windows\system32> ipconfig
Windows IP Configuration
Ethernet adapter vEthernet (Virtual Switch-d801facd02d0d05be7e42422a31f56639a832920c3f33f5d003c9513228e7d7c-0):
Connection-specific DNS Suffix  . :
Link-local IPv6 Address . . . . . : fe80::f03e:4ad6:c187:ba0c%28
IPv4 Address. . . . . . . . . . . : 172.16.0.3
Subnet Mask . . . . . . . . . . . : 255.240.0.0
Default Gateway . . . . . . . . . : 172.16.0.1

PS C:\Windows\system32> ping google.co.jp -n 1
Pinging google.co.jp [216.58.221.163] with 32 bytes of data:
Reply from 216.58.221.163: bytes=32 time=38ms TTL=51
Ping statistics for 216.58.221.163:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 38ms, Maximum = 38ms, Average = 38ms

IIS のサービスである w3svc が起動しています。

PS C:\Windows\system32> Get-Service w3svc
Status   Name               DisplayName
------   ----               -----------
Running  w3svc              World Wide Web Publishing Service

PS C:\Windows\system32> Get-Website
Name             ID   State      Physical Path                  Bindings
----             --   -----      -------------                  --------
Default Web Site 1    Started    %SystemDrive%\inetpub\wwwroot  http *:80:

最後に、ホスト名と OS 情報を見てみます。ホスト名をはじめ、OS のビルド番号やバージョンもコンテナホストと同じになっています。Linux の Docker コンテナでは、コンテナのホスト名は Container ID の一部が割り当てられるので、この部分の動作が Windows と異なっています。

PS C:\Windows\system32> hostname
sv2016
PS C:\Windows\system32> Get-WmiObject Win32_OperatingSystem
SystemDirectory : C:\Windows\system32
Organization    :
BuildNumber     : 10514
RegisteredUser  : Windows User
SerialNumber    : 00252-80005-00001-AA653
Version         : 10.0.10514

コンテナの PowerShell session から抜けるには、exit を実行します。

PS C:\Windows\system32> exit
PS C:\>

コンテナホストのプロセスを確認する

コンテナは、コンテナホスト上のどのプロセスで動作しているのでしょうか。Sysinternals から提供されている Process Explorer で確認してみます。コンテナホストをサーバーコアでインストールした場合は、PsList などを使用してください。
https://technet.microsoft.com/ja-jp/sysinternals/bb896653.aspx
https://technet.microsoft.com/ja-jp/sysinternals/bb896682.aspx

docker run コマンドでコンテナを起動すると、wininit.exe の新しいプロセスが開始されました。それに連なって、コンテナの運用に必要なサービスが起動するようです。Process の下の方に見える w3wp.exe は IIS のプロセスです。
docker stop コマンドでコンテナを停止すると、コンテナのために動作していたwininit.exe のプロセスが無くなりました。
wsc_01_006

Docker サービスも確認しておきます。nssm.exe は Docker サービスの実行ファイルです。このサービスからDocker デーモンが起動されていることがわかります。また -b オプション(ブリッジ)として Virtual Switch が指定されています。Virtual Switch は前述のとおり、セットアップスクリプトで作成された仮想スイッチになります。この設定により、コンテナはネットワークに接続できたわけです。
wsc_01_007

まとめ

Docker で Windows コンテナを操作してみました。まだコンテナの起動が遅く、使用できないコマンドやオプションもあるため、実際の運用にはまだまだこれからといった感じですが、Linux のコンテナを作るような感覚で簡単に作成、操作することができました。Docker に慣れ親しんだ方ならば、すぐに Windows コンテナにも慣れると思います。

次回は、PowerShell で Windows コンテナを操作してみたいと思います。ただし、現状では Docker で作成したコンテナを、PowerShell からは参照できないといった制限があり、相互運用は確認できません。

参考文献

Windows Containers
https://msdn.microsoft.com/virtualization/windowscontainers/containers_welcome
Containers: Docker, Windows and Trends
http://azure.microsoft.com/ja-jp/blog/containers-docker-windows-and-trends/

新規CTA