しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

AppVeyor が Windows Server 2016 に対応したので Docker を使うための下調べをする

2 か月ほど前になりますが、AppVeyor が Visual Studio 2017 と Windows Server 2016 が使えるワーカーイメージの提供を開始しました。

AppVeyor に限らず Windows Server 2016 対応はどのサービスも遅い気がしますね。

既に試している人もいますが、Docker 周りの状況も当時と変わってきているので改めて調べます。

最終的な目標は AppVeyor 上で ASP.NET アプリケーションの Docker Image をビルドして、Docker Hub や Azure Container Registry にプッシュして、ECS や ACS で使うことです。

Windows Server Containers の場合はベースイメージが大きいので、実用的かどうか含め調べます。

インストールされている Docker

まずは AppVeyor VM 上の Docker を確認するために docker info を実行してみました。ちなみに有料プランを契約しているので、ちょっと良い VM が用意されている状態です。

Windows Server 2016 の最新バージョンが使われていて、Docker のバージョンも 17.03.1-ee と新しいものがインストールされています。

> docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 2
Server Version: 17.03.1-ee-3
Storage Driver: windowsfilter
 Windows: 
Logging Driver: json-file
Plugins: 
 Volume: local
 Network: l2bridge l2tunnel nat null overlay transparent
Swarm: inactive
Default Isolation: process
Kernel Version: 10.0 14393 (14393.1066.amd64fre.rs1_release_sec.170327-1835)
Operating System: Windows Server 2016 Datacenter
OSType: windows
Architecture: x86_64
CPUs: 2
Total Memory: 1.464 GiB
Name: APPVYR-WIN
ID: MNR6:QBA5:QSF7:TNY2:G63V:WXA6:4TXI:CP5T:5B3B:TFBF:JLUV:LQVB
Docker Root Dir: C:\ProgramData\docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

Windows Server 2016 の 4 月アップデートが適用されているので、Docker Swarm のサポートが改善していたりします。詳細は KB4015217 やブログに載ってました。

Improved the Host Network Service (HNS) to support an overlay network driver for use on Windows Server 2016 to connect containers across hosts using Docker Engine in Swarm Mode.

https://support.microsoft.com/en-us/help/4015217/windows-10-update-kb4015217

Docker Swarm を CI で使うかと言われると使わないですが、最新に追従する姿勢は好感が持てます。

pull 済みのイメージ

docker images を実行して、既に pull されているイメージがあるのか確認してみました。Azure と同様に windowsservercore と nanoserver の最新バージョンが、予め pull されていました。

> docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
microsoft/windowsservercore   latest              590c0c2590e4        2 weeks ago         10.1 GB
microsoft/nanoserver          latest              a943c29f0046        2 weeks ago         1.01 GB

AppVeyor の Platform Update を見ると、ワーカー VM の更新と同タイミングでイメージも更新してくれているようです。これはかなり安心して使うことが出来そうです。

tag は特定バージョンを指定せずに latest で問題なさそうです。これは良さそう。

別のイメージを pull する

pull されていない aspnet などのイメージを使う場合にどのくらい時間がかかるのかと、一度 pull したイメージはキャッシュされて次からすぐに使えるのかを確認してみます。

実際に docker pull microsoft/aspnet を実行したところ、1 分ほどで完了しました。

f:id:shiba-yan:20170502010707p:plain

自宅の物理マシンで実行した場合は 30 秒ほどなので、そこまで極端に遅くはないという印象です。

同じ処理を 5 回繰り返しましたが、毎回 pull が実行されていたのでキャッシュに関してはあまり期待できない気がしました。運よく pull 済みのマシンに当たれば、素早く処理できるかも知れませんが未確認です。

Dockerfile からビルドする

適当に FROM だけ書いた Dockerfile を用意して docker build を実行してみました。

f:id:shiba-yan:20170502112731p:plain

当然ながらすんなりと動作して、イメージが作られました。ここまで確認すれば、後は Container Registry に push するぐらいなので遊べるようになりそうです。

コンテナをデプロイして実行する

最後にド定番の .NET Core のサンプルアプリをデプロイして、サクッと実行してみました。

f:id:shiba-yan:20170502113353p:plain

Nano Server ベースなので pull から実行まで 20 秒かかりませんでした。AppVeyor で楽しい Windows Server Containers 生活が送れそうな気が少ししてきました。