しばやん雑記

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

Azure Container Instances が Windows Server 2019 に対応

久し振りに Azure Container Instances のキャッシュ済みイメージを取得する API を叩いてみたら、Nano Server 1809 のイメージがキャッシュされてることに気が付きました。

OS Version を見ても分かるように Windows Server 2019 としてリリースされたものです。

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

当然ながら Windows Containers を使うと、ホスト OS より新しいバージョンの実行は出来ないため、ホスト OS が 2019 になったと考えるしかありません。

同じように利用可能なリソースを取得する API を叩いてみると、West US 2 は 4 コア 16GB という大きめのコンテナを作れるようになっていました。ドキュメントには書いてませんでした。

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

既に Docker Hub には Windows Server 2019 向けのイメージを作ってあったので、それのイメージをそのまま ACI に指定して作成してみたところ、問題なくコンテナが立ち上がりました。

関係ないですが、しばらく見ないうちに UI がかなり良くなっていました。

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

2019 の Server Core イメージは公式にはキャッシュされていないはずなので、Web App for Containers と同様に初回は時間がかかってしまいます。今回は立ち上がるまで 13 分ほどです。

Instance Metadata で確認したところ 2019-Datacenter-with-Containers のイメージが使われていました。

そしてインスタンスサイズは Standard_D4_v3 です。これは 4 コア 16GB のマシンなので、Windows の場合は要求したリソースと VM のリソースが一致するように割り当てられるようです。*1

実行中のコンテナにアタッチ

Azure Portal の Connect から実行中のコンテナへアタッチ出来ますが、UI に用意されているのは Linux 向けのシェル設定だけなので、Windows の場合は Custom を選んで cmd か powershell と入力しておきます。

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

これだけで実行中のコンテナ内でコマンドの実行が可能です。ちゃんと Windows Server 2019 が動いていることが、コマンドプロンプトが出力したバージョンから確認できるはずです。

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

昔は sshd を動かしてみたりしましたが、今は Azure Portal からこんなにも簡単にアタッチ出来るので良い時代になりました。Windows でも問題なく動くのは個人的にポイント高いです。

Docker Image を更新する

昔は出来なかったと思うのですが、ドキュメントを読むと実行中コンテナの Docker Image を後から更新できるようです。create コマンドを使うのはアレですが、一部のプロパティは再作成なしで変更できます。

ドキュメントにもあるように、同じ Container Group を利用するとイメージのキャッシュが使われるので効率が良いです。特に Windows の場合はサイズが大きいのでキャッシュは重要です。

早速 CI で新しい Docker Image を作成したのでイメージを差し替えようとしましたが、ドキュメントにあるコマンドを実行するとエラーになってしまったので、Azure CLI から直接 ARM の値を弄ることにしました。

az resource update --ids /subscriptions/**/resourceGroups/**/providers/Microsoft.ContainerInstance/containerGroups/** \
  --set properties.containers[0].properties.image="shibayan/aspnetapp:119"

少しネストが深いので分かりにくいですが、これで Docker Image が指定したものに変わります。

Azure Portal 上でもイメージが変わったことによって、pull 系のログが出力されるので分かりやすいです。

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

既に ASP.NET の Docker Image がキャッシュされているので、今回の起動は 1 分以内で完了しています。

上手く Container Group の作り直しを発生させないようにすると、効率よく ACI でもキャッシュを利用して Windows Server 2019 のイメージを動かすことが出来そうです。

*1:Kubernetes 1.14 へのアップデートのタイミングで動作が変わる可能性ありそう