Introduction

開発中のOSSでWindows Server Coreへの対応についてのissueがあったので、調査がてら導入してみる。
Windows Server 2016を使います。
評価版で検証を行います。

How to

下記の方が教えてくれました。

Windowsの最新化

全てのセキュリティパッチを含む更新を行います。

コンテナの有効化

役割と機能の追加からコンテナを有効化します。

インストール

管理者権限でPowerShellを起動。
場合によっては下記のように Nuget の更新が必要になりますが、その場合はYesと答え、もう一度コマンドを実行します。

1
2
3
4
5
6
7
8
> Install-Module -Name DockerMsftProvider -Repository PSGallery –Force

NuGet provider is required to continue
PowerShellGet requires NuGet provider version '2.8.5.201' or newer to interact with NuGet-based repositories. The NuGet provider must be available in 'C:\Program Files\PackageManagement\ProviderAssemblies' or
'C:\Users\Administrator\AppData\Local\PackageManagement\ProviderAssemblies'. You can also install the NuGet provider by running 'Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force'. Do you want PowerShellGet to
install and import the NuGet provider now?
[Y] Yes [N] No [S] Suspend [?] Help (default is "Y"): Y
> Install-Module -Name DockerMsftProvider -Repository PSGallery –Force

パッケージソースからのインストールを信頼するかどうかの確認。
Yesと答えます。
少し時間がかかりますが、待っているとインストールが完了します。
完了後、再起動します。
再起動後、dockerをインストールします。

1
2
3
4
5
6
7
8
9
PS C:\Users\Administrator> Install-Package -Name docker -ProviderName DockerMsftProvider

The package(s) come(s) from a package source that is not marked as trusted.
Are you sure you want to install software from 'DockerDefault'?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "N"): Y

Name Version Source Summary
---- ------- ------ -------
Docker 18.09.3 DockerDefault Contains Docker EE for use with Windows Server.

確認

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
> docker version
Client:
Version: 18.09.3
API version: 1.39
Go version: go1.10.8
Git commit: 142dfcedca
Built: 02/28/2019 06:33:17
OS/Arch: windows/amd64
Experimental: false

Server:
Engine:
Version: 18.09.3
API version: 1.39 (minimum version 1.24)
Go version: go1.10.8
Git commit: 142dfcedca
Built: 02/28/2019 06:31:15
OS/Arch: windows/amd64
Experimental: false

実行

コードの用意

動かしたいサンプルは

  • Windows Server Core 2016
  • dotnet core のコンソール

となります。
コードは下記になります。

1
2
3
4
5
6
7
8
9
10
11
12
using System;

namespace Sample
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(System.Environment.OSVersion.Platform);
}
}
}

コンテナ内でソースを用意するのは面倒なので、あらかじめ用意しておいて、ビルド時にコピーするようにします。

サンプル実行

下記のDockerfileを作成します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
FROM mcr.microsoft.com/windows/servercore:10.0.14393.2665

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

# Install .NET Core SDK
ENV DOTNET_SDK_VERSION 2.2.104

RUN Invoke-WebRequest -OutFile dotnet.zip https://dotnetcli.blob.core.windows.net/dotnet/Sdk/$Env:DOTNET_SDK_VERSION/dotnet-sdk-$Env:DOTNET_SDK_VERSION-win-x64.zip; \
$dotnet_sha512 = '2e73f64a7fdf0f9e03a58a1824375dab91cae658c1863d5130047064643a5c035db25251c443e9e0eded73ffe7b33ae6e1be4e16083da6122dfc1a7d6e2f1564'; \
if ((Get-FileHash dotnet.zip -Algorithm sha512).Hash -ne $dotnet_sha512) { \
Write-Host 'CHECKSUM VERIFICATION FAILED!'; \
exit 1; \
}; \
\
Expand-Archive dotnet.zip -DestinationPath $Env:ProgramFiles\dotnet; \
Remove-Item -Force dotnet.zip

SHELL ["cmd", "/S", "/C"]

RUN ["C:/Program Files/dotnet/dotnet.exe", "new", "console", "-n", "Sample"]
COPY ["Program.cs", "c:/Sample"]
WORKDIR Sample

そして実行。
dotnetの初回起動時の復元処理に時間がかかります。
終わらなかったら、一度Ctrl+CでbuildをキャンセルするとOKです。

1
2
3
4
$ docker build -t test .
$ docker run -t test cmd
> "C:\Program Files\dotnet\dotnet.exe" run -c Release
Win32NT

詳細なバージョン情報も表示してみます。

1
2
3
4
powershell [System.Environment]::OSVersion
Platform ServicePack Version VersionString
-------- ----------- ------- -------------
Win32NT 10.0.14393.0 Microsoft Windows NT 10.0.14393.0