コンテナー作成前のコンテナーホストの状態を確認したところで、早速、Windows Serverコンテナーを作成してみましょう。
PowerShellのウィンドウを管理者として開き、次の3つのコマンドラインを実行します(画面3)。これで、「MyCont01」という名前のWindows Serverコンテナーを作成し、コンテナーを開始して、コンテナーのPSセッション(リモートコンピューターへのセッション)に接続しています。
1 $mycont01 = New-Container -name "MyCont01" -ContainerImageName WindowsServerCore -SwitchName "Virtual Switch"
2 Start-Container -Name "MyCont01"
3 Enter-PSSession -ContainerId $mycont01.ContainerID -RunAsAdministrator
コンテナーの作成は10秒程度、起動は30秒程度で完了します。Hyper-Vなどの通常の仮想マシンと比較して、Windows Serverコンテナーは圧倒的に短時間で作成および開始することができます。接続したコンテナーのPSセッションは、Windows Server 2016のServer Coreベースの分離されたアプリケーション実行環境になります。
コンテナーには起動した順番に「172.16.0.0/12」のIPアドレス範囲から1つのIPアドレスが割り当てられ(172.16.0.2から順番で)、コンテナーホスト(172.16.0.1)経由で外部ネットワークにアクセスできます。
なお、コンテナーはコンテナーホスト(の仮想スイッチ)が提供するNATの背後にあるため、ポートフォワーディング(IPマスカレード)を設定しない限り、コンテナーホストの外部からコンテナーにネットワーク経由でアクセスすることができないことに注意が必要です。
PowerShellの良いところは、いろいろな書き方ができることです。次のようにコンテナーを作成、開始して、PSセッションに接続することもできます。
1 New-Container -Name "MyCont02" -ContainerImageName WindowsServerCore -SwitchName "Virtual Switch"
2 Start-Container -Name "MyCont02"
3 Enter-PSSession -ContainerId (Get-Container -Name "MyCont02").ContainerId -RunAsAdministrator
「Enter-PSSession -ContainerId」コマンドレットは、コンテナーのPSセッションにダイレクトに接続する機能です。本連載の第18回で紹介したHyper-Vの新機能「PowerShell Direct」によく似ています。
また、次のように「Invoke-Command」コマンドレットを使用して、PSセッションに対話的に接続することなしに、コンテナーで任意のスクリプトブロック(PowerShellコマンドレット、Windowsの標準コマンド、実行ファイルなど)を実行させることもできます。
Invoke-Command {スクリプトブロック} -ContainerID (Get-Container).ContainerId -RunAsAdministrator
コンテナーホストには、Windows ServerコンテナーのベースOSイメージを使用して、複数のWindows Serverコンテナーを作成できます。また、コンテナーごとにWindows Serverの役割や機能やアプリケーションをインストールして実行することができます。
例えば、コンテナーのPSセッションで次のいずれかのコマンドラインを実行すれば、コンテナーに「IIS(インターネットインフォメーションサービス)」をインストールしてWebサイトをホストさせることができます。
Install-WindowsFeature Web-Server
または
DISM /Online /Enable-Feature /FeatureName:IIS-WebServerRole
以下の画面4は、コンテナーホストに2つのWindows Serverコンテナーを作成した時点で、コンテナーホストの「C:\ProgramData\Microsoft\Windows\Hyper-V\Containers」フォルダーを参照したところです。コンテナーごとに「コンテナーID.vhdx」という名前のVHDXファイルが作成されています。
コンテナーを作成すると「blank.vhdx」を元にコンテナーごとに「コンテナーID.vhdx」が準備され、20GBのストレージが提供されます。コンテナーからはCドライブがベースOSイメージのフォルダーツリーと同じように見えますが、コンテナーからCドライブに対して行われた変更はベースOSイメージではなく、「コンテナーID.vhdx」の方に変更の差分が書き込まれます。
画面4の141,312KBのVHDXファイルはWindows Serverコンテナーを作成して開始した直後のもの、501,760KBのVHDXファイルはWindows ServerコンテナーにIISをインストールしたものです。
また、「C:\ProgramData\Microsoft\Windows\Hyper-V\Containers」フォルダーの「コンテナーID\Hives」サブフォルダーには、コンテナーでレジストリに対して行われた変更の差分が格納されます。
Windows ServerコンテナーのベースOSイメージは約9GBと、通常のWindows Serverのインストールと同程度のサイズですが、コンテナーごとのストレージ使用量は差分のみになるので非常にコンパクトです。
【注】筆者の環境では、コンテナーを開始すると、コンテナーホストの管理者共有(C$、Admin$、IPC$など)が利用できなくなる現象を確認しました。コンテナーホストを再起動すると復活しますが、筆者は「net share C$=C:\」コマンドを実行してC$管理共有を復元しました。
以下の画面5は、IISをインストールしたコンテナーのVHDXファイルをWindows 10にコピーしてマウントし、ドライブ文字を割り当てて参照したところです。
ベースOSイメージに存在するフォルダーツリーへのアクセスは拒否されましたが(おそらく実体が存在しない)、IISのインストールで作成された「inetpub」フォルダーと筆者が「C:\」のルートに作成しておいた「demo.txt」は参照することができました。
レジストリの差分は、「レジストリエディター」(Regedit.exe)に「コンテナーID\Hives」サブフォルダーのレジストリファイル(_delta)を読み込むことで確認できます。例えば、「System_Delta」を読み込むと、コンテナーが「HKEY_LOCAL_MACHINE\SYSTEM」に対して行った変更を見ることができます。
Copyright © ITmedia, Inc. All Rights Reserved.