SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Windows Server Containers を触ってみた

leave a comment

先日公開された Windows Server 2016 Technical Preview 3 で、Windows Server Containers が使用できるようになりました。

すでに以下のサイトで情報が公開されていますが自分でも触ってみましたので少しまとめを。
Windows Server で Windows コンテナが動くんです!ちょっとだけおさわりしてみたよ。
Windows Server 2016 & System Center 2016 Technical Preview 3 ほか
[windows] Windows Server 2016 TP3のDockerを試してみる
Windows Server 2016の三度目のテクニカルプレビュー、コンテナのサポートを内蔵
コンテナー: Docker、Windows、および動向

MSDN については、Windows Containers で公開されている一連のドキュメントを見るとよさそうです。

今回、使用できるようになったのは、Windows Server コンテナーであり、もう一つ提供が予定されている Hyper-V コンテナーについてはまだ使用することができないようです。

Docker の知識がないままで書いていますので、コンテナーの概念を間違っていたらごめんなさい。


■Windows Server コンテナーを実行できる環境


現状、Windows Server コンテナーを実行するための環境としては、

  • Azure のギャラリーで提供されている「Windows Server Container Preview」のイメージを使用
    image
  • Hyper-V のゲスト OS としてコンテナーの実行環境を構築
  • クリーンインストールした Windows Server 2016 TP3 の環境にコンテナーの実行環境を構築

のパターンになるかと思います。

Windows Server コンテナーですが、役割と機能から追加できる「Containrers」という機能が大元となっていますので、これがインストールできる TP3 の環境があれば構築は可能かと。
image

 

 

Azure 上に構築する場合は、Get started with Windows Server Containers in Windows Azure の手順で、ギャラリーからイメージを展開することで作成することができます。

 

Windows Server コンテナーの実行環境はゲスト OS としても作成することができます。
# Azure 上で動作するので当然と言えば当然ですが。

この場合は、Get started with Windows Server Containers in a new Hyper-V virtual machine の手順を実施することで、実行環境を構築できます。
この手順では、http://aka.ms/containerhostvhd から、コンテナーの実行環境が設定されている VHD (約 6.20 GB) をダウンロードし、ゲスト OS を作成して、そのゲスト OS 上でコンテナーを実行する形になります。
ゲスト OS の作成については、手順に書かれていますが、

wget -uri http://aka.ms/newcontainerhost -OutFile New-ContainerHost.ps1

でダウンロードしたスクリプトを使用することで、VHD の DL から作成までを実施することができます。

この VHD には、コンテナーイメージが事前に含まれているので、コンテナーの作成もすぐに試すことができます。

ゲスト OS の実行環境ですが、Windows Server 2012 R2 の Hyper-V 上でも動作させることができますので、Hyper-V ホストが Windows Server 2016 TP3 である必要はありません。

 

最後のパターンが、物理またはゲスト OS として自分でインストールした Windows Server 2016 TP3 上にコンテナーの実行環境を構築する方法となります。

手順については、Get started with Windows Server Containers in an existing virtual machine から確認することができます。

このパターンでは、コンテナーイメージとなる WIM ファイル (約 2.91 GB) を http://aka.ms/ContainerOSImage からダウンロードし、

 

wget -uri http://aka.ms/setupcontainers -OutFile C:\ContainerSetup.ps1

でダウンロードしたスクリプトを実行することで、自分でインストールを行った TP3 上にコンテナーの実行環境を作ることができます。

# Server Core 上にインストールする場合は Get started with Windows Server Containers on a Windows Server TP3 Core installation を参考にするとよいかと。

 

今回、私が使用している環境は、Windows Server 2012 R2 Hyper-V 上のゲスト OS として、自分で TP3 を GUI 付きでインストールした環境に対してコンテナーの実行環境を構築しています。

 

■Windows Server コンテナーの構成


コマンドレットの名称に合わせて書いていますが、触ってみた感じでは、Windows Server コンテナーは以下のような構成になっているかと思います。

image

 

– コンテナーホスト –

コンテナーホストは、コンテナーの実行環境となりますので、Windows Server 2012 R2 TP3 が実際に稼働している環境となります。

 

– コンテナーイメージ –

この環境の上にコンテナー (OS) イメージを展開することになります。

コンテナーイメージは、WIM ファイルから作成することができ、コンテナーを実行する際のベースの環境となるかと。

コンテナー向けのコマンドには以下のようなものがあります。

image

コンテナーホストにコンテナーイメージを追加する場合「Install-ContainerOSImage」を使用することになるかと思いますが、この関数では WIM ファイルのパスを指定することになります。

image

WIM を指定して実行すると、対象の WIM が「C:\ProgramData\Microsoft\Windows\Images」に展開され、コンテナーイメージとして登録が行われるようです。

このディレクトリーは以下のように「FIles」と「Hives」で構成されています。

image

Files には、WIM が展開された内容が、

image

Hives には、レジストリハイブが格納されているようです。

image

実際には、コンテナーイメージとコンテナーホストで共通の部分もあるのでしょうが、細かいところまでは見れていないのでいろいろと勉強しないと…。

現状、コンテナーイメージですが、ダウンロードした WIM をベースにすることが基本となっており、一からコンテナーイメージを作成するということはできないようです。
Custom container base images

カスタムのコンテナーイメージを作成する場合は、DL した WIM をベースにコンテナーを作成し、必要なカスタマイズを実施したコンテナーを再度イメージ化することで、カスタムイメージを作成していくようです。

カスタムイメージが作成できるかを試した感じでは、

  • Server Core でインストールしている
  • コンテナーイメージに「Container Execution Agent サービス」がインストールされている
    # このサービスがコンテナーが起動している等の制御をしているようで、単純に ServerCore をインストールした環境をイメージとして登録し、そこからコンテナーを作成しただけでは、コンテナー開始時にタイムアウトとなってしまいました。

「Container Execution Agent サービス」のインストーラーが提供されていないので、現状、起動に成功するイメージを一から作成することができていません。

 

– コンテナー –

コンテナーイメージは複数のコンテナーが使用する可能性があります。

そのため、コンテナーを作成すると「C:\ProgramData\Microsoft\Windows\Hyper-V\Containers」に、コンテナーの GUID によるフォルダーと、VHDX が作成され、コンテナー固有の情報や、コンテナーイメージとの差分のファイルについては、VHDX とフォルダー (フォルダーはレジストリ用のようですが) を使用して管理が行われるようです。

image

この VHDX はコンテナーを開始したタイミングでコンテナーホストにマウントされているようです。

「Containers」配下の情報と、ベースとなる、「Images」の情報を使用してコンテナーの実行環境が作成されている感じでしょうか。

コンテナーを起動すると、コンテナー単位にホスト OS で「wininit.exe」が起動されるようです。
image

コンテナー内で起動したプロセスについては、コンテナー内の「CExecSvc.exe」(Container Execution Agent サービス) を介して実行されているようです。

コンテナーホストからコンテナーで起動したプロセスが把握できるような、ホストと分離されていない仕組みが Windows Sever コンテナーとなるようですね。

 

■Windows Server コンテナーと Hyper-V のテクノロジー


Windows Server コンテナーですが、一部 Hyper-V のテクノロジーが使用されているような構成となってるように見えます。

コンテナーの機能を追加すると以下のようなサービスも合わせてインストールがされるようです。

image

 

これらは、ホスト OS で動かす Hyper-V と同じというわけではなく、サブセット扱いなのかなと思います。

# Windows Server コンテナーの実行環境は、Hyper-V の役割はインストールされていない状態で上記のようなサービス構成となります。
今回の環境はゲスト OS 上に作成しているのですが、この環境下でもコンテナーをインストールすると各種 Hyper-V 関係のサービスが追加されるようです。

コンテナーの機能を実行するために使用しているようですので、ゲスト OS の上のゲスト OS を作成する (Nested VM) のためには使用できません。

# Nested VM が入ったらもう一度見た方がよさそうですが。

また、Quick Start では、ゲスト OS 上で仮想スイッチを確認しています。

Hyper-V の場合、仮想スイッチはホスト OS 上で作成するものでしたが Windows Server コンテナーの環境では、ゲスト OS 上に仮想スイッチを作成し、その仮想スイッチを NAT として使用することで、コンテナーホストを経由してコンテナーにアクセスするというようなネットワーク構成が取れるようです。

image

  • コンテナーホストで仮想スイッチを作成
  • コンテナーに仮想スイッチを割り当て

というのが、Windows Server コンテナーの基本的な構成になるようですね。

 

■Windows Server コンテナーと Docker


Windows Server コンテナーですが、「ContainerSetup.ps1」を使用して、コンテナーホストの環境を整備した際に、「Docker Daemon」(Docker.exe) をサービスとして登録しています。

# サービスの登録には、NSSM を使用しています。

この辺が Windows Server コンテナーと Docker の連携部分なのでしょうか。

Quick Start に Quick Start: Windows Server Containers and Docker / Quick Start: Windows Server Containers and PowerShell とあるように、Windows Server コンテナーは PowerShell と Docker コマンドのどちらからも操作ができるようになっています。

Docker コマンドで操作をする場合には上記のサービスが動作している必要があるようですね。

こちらについてはコンテナーの機能を追加するだけではインストールがせれないので、上述の PS1 の内容のようにインストールをしていく必要があります。

コンテナーの操作方法の違いとして、Docker コマンドからは 「dockerfile」を使用することができるようですが、PowerShell から操作する場合、「Invoke-Command」「Enter-PSSession」を使用しての操作となるようですね。

上記のコマンドレットには「ContainerID」というオプションが追加されており、このオプションを使用することで、起動しているコンテナーに対して、コマンドを実行することができます。

ざっとドキュメントを眺めた感じでは、PowerShell から dockerfile を使用してコンテナーに機能を追加するというようなサンプルが見当たりませんでした。

 

■Windows Server コンテナーのサンプル


コンテナーイメージの作成方法については、サンプルが見当たらなかったのですが、コンテナーのサンプルについては、Container Sample Code で公開されています。

IIS / マインクラフトをインストールするサンプルがありましたので、中を見てみるとよいかと。

NAT のルール追加や、リモートデスクトップを使用した、コンテナーへの接続については、 Work in Progress を確認するとよさそうです。

コンテナーイメージについては、

Download and install a container base image matching the OS version and patch level of the container host.

という制約はあるようですので、同じ OS で WIM を作るだけでよいのかも知れませんが。

Written by masayuki.ozawa

8月 21st, 2015 at 10:29 pm

Posted in Windows Server

Tagged with

Leave a Reply

*