2015/11/25

Nano Server TP4 を Container Host にする (完全版)

Windows Server 2016 Technical Preview 4 (TP4) の Nano Server は Containers をサポートしています。

ちょっとややこしいですが、Windows Server 2016 TP4 の Hyper-V の上で Nano Server 仮想マシンを動かして、Nano Server 仮想マシンが Container Host として、Hyper-V Container や Windows Server コンテナーを動かせるようにしてみました。

現状、Hyper-V Container のみのサポートで、Windows Server Container は実行できないみたいです。Windows Server Container はカーネルを Container Host を共有するので、Nano Server という別のカーネル上の Container Host で WindowsServerCore イメージのコンテナーは動かないという理屈だと思います。

Nano Server を Container Host としてセットアップするには、いろいろと注意点があるのでメモ。

2015/12/08 追記: Azure IaaS 上の Nano Server をすんなりコンテナーホストにできたので(Azure IaaS 上の Nano Server を Container Host としてセットアップする)、それを参考にいろいろ修正しました。また、Nano Server をコンテナーホストにするドキュメントも公開されてました。

This document will detail deployment options for Windows Server 2016 and Nano Server to both physical and virtual systems.
[URL] https://msdn.microsoft.com/en-us/virtualization/windowscontainers/deployment/deployment



Windows Server 2016 TP4 の Nested Hyper-V を有効にした Nano Server 仮想マシンを Container Host としてセットアップする手順です。

この手順により、こんなエラーを回避できます(と思います)。








Step 1: Hyper-V と Containers のサポートを含む Nano Server の VHD イメージを作成する。

作業用フォルダーに Windows Server 2016 TP4 のインストールメディアの \NanoServer フォルダーから NanoServerImageGenerator.psm1 と Convert-WindowsImage.ps1 をコピーしたら、作業フォルダーで...

PS> Import-Module .\NanoServerImageGenerator.psm1
PS> New-NanoServerImage -MediaPath F:(英語版のTP4のISOマウント先) -BasePath .\Base -TargetPath .\<ファイル名>.vhd -ComputerName <コンピューター名> -GuestDrivers -Compute -Containers -ReverseForwarders -Language en-us -MaxSise 20GB

※ 第 2 世代仮想マシンにするなら、ファイル名を .vhdx にしてね。
※ -GuestDrivers は Hyper-V 仮想マシン用ドライバー、-Compute は Hyper-V の役割、-Containers は Containers の機能、-ReverseForwarders は Docker サポートのために必要。
※ 既定では、4GB の容量可変 VHD/VHDX ができちゃうので、-MaxSize でサイズ指定。

Step 2: Windows Server 2016 TP4 の Hyper-V に第 1 世代仮想マシンまたは第 2 世代仮想マシンを作成し、Nano Server の VHD イメージを接続してセットアップする。

Step 3: 仮想マシンで Nested Hyper-V を有効にする。

PS> wget https://raw.githubusercontent.com/Microsoft/Virtualization-Documentation/master/hyperv-tools/Nested/Enable-NestedVm.ps1 -OutFile .\Enable-NestedVm.ps1 PS> .\Enable-NestedVm.ps1 -VmName "<仮想マシン名>"

Step 4: 仮想マシン(mynano01)の設定を開いて[統合サービス]の[ゲスト サービス]を有効にする。これは、次の Step で Copy-VMFile を使うため。

Step 5: Nano Server では wget (Invoke-WebRequest) が使えないので、Hyper-V ホスト側で Install-ContainerHost.ps1 をダウンロードして、Copy-VMFile を使ってゲスト サービス経由で Nano Server にコピーする。

PS> wget -uri https://aka.ms/tp4/Install-ContainerHost -OutFile .\Install-ContainerHost.ps1
PS> Copy-VMFile -Name <仮想マシン名> -SourcePath .\Install-ContainerHost.ps1 -DestinationPath C:\ -FileSource Host

Step 6: コマンドプロンプトを開き、CHCP 65001 (おまじない) に切り替えてから、PowerShell.exe を開始。または、PowerShell で CHCP 432 (おまじない) に切り替える。

C:\> chcp 65001
C:\> powershell.exe
または
PS> chcp 432


Step 6: Hyper-V の PowerShell Direct で Nano Server の PS セッションに接続し、 PowerShell Remoting で Nano Server の PS セッションに接続し、RSAT 関連の機能を有効化したら、Install-ContainerHost.ps1 を実行する。PowerShell Remoting で接続するなら -PSDirect パラメーターは不要かも。たぶん、Docker サポートのインストールは失敗するので、Docker サポートが不要なら -SkipDocker パラメーターを追加してね。


PS> Enter-PSSession -ComputerName <Container Host にする Nano Server の仮想マシン名> 

PS> Set-Item wsman:\localhost\Client\TrustedHosts
"<Nano Server の IP またはコンピューター名>"
PS> Enter-PSSession -ComputerName <Nano Server の IP またはコンピューター名> 

※PowerShell Direct (Enter-PSSession -VMName <仮想マシン名>) で作業すると、いろいろエラーが出ます。必ず、PowerShell Remoting で。

[NanoServer]: PS> Enable-WindowsOptionalFeature -Online -FeatureName ServerManager-Core-RSAT,ServerManager-Core-RSAT-Role-Tools,ServerManager-
Core-RSAT-Feature-Tools 




[NanoServer]: PS> C:\Install-ContainerHost.ps1 -HyperV -PSDirect



これで、再起動不要で Nano Server をコンテナーホストとしてセットアップできました。

Nano Server をコンテナーホストとしてセットアップした場合、NanoServer イメージだけがインストールされます。WindowsServerCore はサポートされません。Nano Server のコンテナーホストでは、NanoServer イメージから Hyper-V コンテナーおよび Windows Server コンテナーを作成、実行できます。






Step 7: Hyper-V Container を作成してみる。

PowerShell Direct または Remoting で Nano Server に接続して...

PS> Enter-PSSession -VMName <Container Host  にした Nano Server の仮想マシン名>
または
PS> Enter-PSSession -ComputerName <Nano Server のIP またはコンピューター名>

[NanoServer]: PS> New-Container -Name <コンテナー名> -ContainerImageName NanoServer -SwitchName "Virtual Switch" -RuntimeType HyperV
[NanoServer]: PS> Start-Container -Name <コンテナー名>

※-RuntimeType HyperV を省略するか、-RuntimeType Default を指定すると、Windows Server コンテナーになります。
PS Direct で操作している場合、Enter-PSSession -ContainerName MyContainer01 -RunAsAdministrator は Specified method is not supported. と言われて使えませんでした。Invoke-Command は大丈夫。

※ Nano Server に PS Remoting で接続している場合は、Enter-PSSession -ContainerName は OK。


※ Docker で操作するなら...

docker run –t –i -–name <コンテナー名> --isolation=hyperv nanoserver cmd 

ただし、PS Direct/Remoting セッションの中からだと cannot enable tty mode on non tty input となってダメだと思う(PS Direct で Enter-PSSession -ContainerName がダメなのと同じ理屈?)。EMS の SAC 経由でやってみました。


証明書とか面倒ですが、docker をリモート接続できるようにして操作するのが一番快適かも。

Windows Server 2016 TP3 > Windows 版 Docker でリモート接続 (TLS) を有効化する

Step 8: おそうじ。

[NanoServer]: PS> Stop-Container -Name <コンテナー名>
[NanoServer]: PS> Remove-Container -Name <コンテナー名>

※ Docker で操作するなら...

docker rm <コンテナー名>

おまけ(その 1)

New-NanoServerImage で作成した VHD のサイズは既定で 4GB。イメージ作成時に -MaxSize の指定を忘れちゃった場合は足りなくなるかもしれないので、Hyper-V マネージャーのディスクの編集で VHD のサイズを拡張しておきましょう。

仮想マシン側のボリュームの拡張は、Nano Server だと Diskpart とか使えなくて面倒だと思いますが、サーバー マネージャーでリモート管理できるようにしてあれば簡単です。





おまけ(その 2)

Nano Server のイメージ作成時に -ReverseForwarders (Microsoft-OneCore-ReverseForwarders-Package.cab) を追加しておかないと、Install-ContainerHost.ps1 の最終段階で Docker Daemon の開始に失敗します。

忘れちゃったという場合は、Windows Server 2016 TP4 英語版の ISO イメージを仮想マシンに接続して、手動でインストールして再起動すれば、Docker daemon 動き出します。

[NanoServer]: PS> DISM /Online /Add-Package /PackagePath:D:\NanoServer\Packages\Microsoft-OneCore-ReverseForwarders-Package.cab
[NanoServer]: PS> DISM /Online /Add-Package /PackagePath:D:\NanoServer\Packages\en-us\Microsoft-OneCore-ReverseForwarders-Package.cab
[NanoServer]: PS> Restart-Computer

再起動後に、Docker Daemon サービス開始後のセットアップの続きを...

[NanoServer]: PS> docker tag nanoserver:10.0.10586.0 nanoserver:latest

ちなみに、Nano Server の場合、Docker Daemon はサービスではなく、タスク (Get-ScheduledTask -TaskName Docker) として登録されます。-ReverseForwarders (Microsoft-OneCore-ReverseForwarders-Package.cab) が利用できないと、タスクを実行しても タスクのアクション cmd.exe /c C:\ProgramData\Docker\runDockerDaemon.cmd ... が動きませんでした。




Nano Server TP4 まとめ ->]


2015/12/07 追記)
Nano Server がコンテナーホストだと、NanoServer イメージを Windows Server コンテナーとして動かすこともできます。Windows Server がコンテナーホストの場合はできないこと。

サポートされる組み合わせについては...
Windows Container Requirements > Supported OS Images
[URL] https://msdn.microsoft.com/en-us/virtualization/windowscontainers/deployment/system_requirements

0 件のコメント: