2017/07/26

Windows Server Insider Preview のコンテナーを Windows 10 Insider Preview で試す

Windows Server Insider Preview が始まり、ビルド 16237 の Windows Server Core (microsoft/windowsservercore-insider) と Nano Server (microsoft/nanoserver-insider) のベース OS イメージが Insider Preview で利用可能になっています。

Announcing Windows Server Insider Preview Build 16237 (July 13, 2017 3:08 pm)
[URL] https://blogs.windows.com/windowsexperience/2017/07/13/announcing-windows-server-insider-preview-build-16237/


Nano Server のイメージは現行の約 1 GB に対して、Insider Preview は 195 MB (ダウンロード サイズは 78.5 MB)に、Windows Server Core のイメージは現行の約 10 GB に対して、4.41 GB (ダウンロード サイズは 2.141 GB) と、劇的にコンパクトになっています。言い換えると、Nano Server はいろいろと削除されています。

Windows Server Insider Preview または Windows 10 Insider Preview のコンテナー ホストが必要みたいなのですが、Windows 10 Insider Preview に Insider Preview 対応の Hyper-V コンテナー環境を作ってみたのでメモ。

Windows 10 バージョン 1607 以降 は Hyper-V コンテナーの作成と実行が可能で、Docker for Windows を使って Linux の Docker 環境と Windows コンテナーの Docker 環境を切り替えて利用することが可能です(→ Windows Container Base OS Image 10.0.14393.1066 and Update Docker EE Engine 17.03.x。でも、Windows Server Insider Preview のコンテナーの評価には、Docker for Windows ではなく、Windows Server Insider Preview と同じ方法でセットアップする必要があるみたい。詳しい手順は以下のドキュメントで。

Using Insider Container Images (7/24/2017)
[URL] https://docs.microsoft.com/en-us/virtualization/windowscontainers/quick-start/using-insider-container-images


出たばかりの今は、すんなりとはいかなくて失敗すると思います。いずれ修正されると思いますが、現時点で何とかしてみます(腕試し)。


PowerShell を管理者として開き、こんなコマンドラインを実行していけば Hyper-V コンテナー用のコンテナーホストのセットアップと、Nano Server Insider Preview のベース OS イメージの取得、Hyper-V コンテナーの作成と実行ができるはず。

※リモートの PowerShell で実行する場合は、PowerShell Remoting を使うこと! PowerShell Direct は NG です。(→ https://github.com/OneGet/MicrosoftDockerProvider のNot supported scenarios を参照)

PS> Set-ExecutionPolicy RemoteSigned
(Windows 10では必須。これしないと前提となる NuGet のインストールが失敗するし、その後の Install-Package もエラーになるよ)
PS> Install-Module -Name DockerMsftProviderInsider -Repository PSGallery -Force
PS> Install-Package -Name docker -ProviderName DockerMsftProviderInsider -RequiredVersion 17.06.0-ce
PS> Restart-Comptuer -Force
PS> docker pull microsoft/nanoserver-insider
PS> docker pull microsoft/windowsservercore-insider
PS> docker run --name mynanocont01 -it microsoft/nanoserver-insider cmd
...
(--isolation=hyperv は Windows 10 の既定なので省略可)

でも、今ならもれなく、"Install-Package : 用語 'Get-WindowsFeature'は、コマンドレット、...として認識されません" というエラーで失敗すると思います。(いずれ修正されると思いますが)。


原因を調べていくと、C:\Program Files\WindowsPowerShell\Modules\Docker\DockerMsftProviderInsider\1.0.0.2\DockerMsftProviderInsider.psm1 に書いてある以下の Windows 10 用のコード(3か所あり)が実行されておらず、Windows Server 用の既定 (DEFAULT)の処理が走るから。例えば、Get-WindowsFeature -Name ... は Windows Server のコマンドレットであり、Windows 10 の場合は Get-WindowsOptionalFeatures -Online -FeatureName ...なので、Windows Server 用のコードが実行されているということがわかります。


switch(Get-wmiobject -class win32_operatingsystem | select-object -ExpandProperty Caption ){               
'Microsoft Windows 10' {
・・・ }
DEFAULT { ・・・ }
}

事前にHyper-V とコンテナーの機能を有効化しておく。appwiz.cpl で有効化するか、PowerShell で。Containers については Install-Package -Name Docker で必要に応じて有効化されることになっているんですが、DockerMsftProviderInsider.psm1 内のコマンドラインは -Online が抜けているので失敗すると思います。事前に有効化しておけば、問題のコードは実行されません。なお、Windows 10 は Hyper-V コンテナーのみのサポートのため、Hyper-V の有効化は必須です( Install-Package -Name Docker は Hyper-V のチェックや有効化はしません!)

PS> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
(要再起動)
PS> Enable-WindowsOptionalFeature -Online -FeatureName Containers

続いて、

PS> Set-ExecutionPolicy RemoteSigned
PS> Install-Module -Name DockerMsftProviderInsider -Repository PSGallery -Force
 
ここで、C:\Program Files\WindowsPowerShell\Modules\Docker\DockerMsftProviderInsider\1.0.0.2\DockerMsftProviderInsider.psm1 をメモ帳などで開き(メモ帳だと改行が認識されないので厄介ですが)、エラーを回避するための修正を行います。私はいま、Windows 10 Enterprise Insider Preview で作業しているので、単純に 'Microsoft Windows 10' 'Microsoft Windows 10 Enterprise Insider Preview' に置換するだけで済ませました。何に置換するべきかは、PowerShell で Get-wmiobject -class win32_operatingsystem | select-object -ExpandProperty Caption の実行結果を見ればよし。

もっとスマートにというか、汎用的に修正したいなら、次のように変更すればよいと思います。Enable/Disable-WindowsOptionalFeature のコマンドラインに -Online を追加しとけばさらにパーフェクト。

変更前:
switch(Get-wmiobject -class win32_operatingsystem | select-object -ExpandProperty Caption ){               
'Microsoft Windows 10' {

変更後:
switch -wildcard (Get-wmiobject -class win32_operatingsystem | select-object -ExpandProperty Caption ){               
'Microsoft Windows 10 *' {

PowerShell のウィンドウをいったん閉じ、新たなウィンドウを管理者として開いて(DockerMsftProviderInsider の変更を反映させるため)、

PS> Install-Package -Name docker -ProviderName DockerMsftProviderInsider -RequiredVersion 17.06.0-ce






あいかわらず(Windows Server 2016: Docker 対応の手順が変わった(2016/10/15)) 、Install-Package のメッセージが逆(×アンインストールしますか?〇インストールしますか?)ですけど...
これでエラーなしで進むはず。

完了後、再起動したら、おしまい。docker pull とか docker run 使えるようになります。

microsoft/nanoserver-insider と microsoft/windowsservercore-insider のコンテナー (Hyper-V コンテナー) の作成、実行も成功。microsoft/nanoserver-insider はかなり起動が早くなったという実感があります。C:\ ドライブのルートを見るとわかるように、いろいろと削除されているよう。microsoft/windowsservercore-insider の Hyper-V コンテナーは、改善されているのかもしれませんが、やっぱり起動が遅い。

追記:
microsoft/nanoserver-insider は PowerShell が使えませんが、.NET Core を含む microsoft/nanoserver-insider-dotnet と PowerShell 6.0 を含む microsoft/nanoserver-insider-powershell も公開されていました。
以上。

追記:
パブリック リリース版の DockerMsftProvider も今年の 3 月に Windows 10 サポートが追加されたみたいですけど、コード (https://github.com/OneGet/MicrosoftDockerProvider/blob/developer/DockerMsftProvider.psm1) を見る限り、同じ問題 (Windows 10 向けのコードを処理しない)がありますね。https://github.com/OneGet/MicrosoftDockerProvider/issues/30


コードを追加しても、そのコードを一度もテストすることなくリリースしちゃうんだね。

さらに追記:
Windows 10 Insider Preview 16251.0 がリリースされましたが、アップグレード後もコンテナー環境やコンテナーが破壊されることはありませんでした。一安心。

0 件のコメント: