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 でも操作可能です。
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] をクリックします。
Operating system は どちらを選択してもかまいません。[Windows Server 2016 Technical Preview 3] を選択した場合は、GUI 無しのサーバーコアになります。
以後は、ライセンスに同意して、デフォルトの設定で [Next] をクリックしていけば、インストールが始まります。
インストール完了後、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 アドレス>/
コンテナ内の 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 のプロセスが無くなりました。
Docker サービスも確認しておきます。nssm.exe は Docker サービスの実行ファイルです。このサービスからDocker デーモンが起動されていることがわかります。また -b オプション(ブリッジ)として Virtual Switch が指定されています。Virtual Switch は前述のとおり、セットアップスクリプトで作成された仮想スイッチになります。この設定により、コンテナはネットワークに接続できたわけです。
まとめ
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/