久し振りに Azure Container Instances のキャッシュ済みイメージを取得する API を叩いてみたら、Nano Server 1809 のイメージがキャッシュされてることに気が付きました。
OS Version を見ても分かるように Windows Server 2019 としてリリースされたものです。
当然ながら Windows Containers を使うと、ホスト OS より新しいバージョンの実行は出来ないため、ホスト OS が 2019 になったと考えるしかありません。
同じように利用可能なリソースを取得する API を叩いてみると、West US 2 は 4 コア 16GB という大きめのコンテナを作れるようになっていました。ドキュメントには書いてませんでした。
既に Docker Hub には Windows Server 2019 向けのイメージを作ってあったので、それのイメージをそのまま ACI に指定して作成してみたところ、問題なくコンテナが立ち上がりました。
関係ないですが、しばらく見ないうちに UI がかなり良くなっていました。
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 と入力しておきます。
これだけで実行中のコンテナ内でコマンドの実行が可能です。ちゃんと Windows Server 2019 が動いていることが、コマンドプロンプトが出力したバージョンから確認できるはずです。
昔は 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 系のログが出力されるので分かりやすいです。
既に ASP.NET の Docker Image がキャッシュされているので、今回の起動は 1 分以内で完了しています。
上手く Container Group の作り直しを発生させないようにすると、効率よく ACI でもキャッシュを利用して Windows Server 2019 のイメージを動かすことが出来そうです。
*1:Kubernetes 1.14 へのアップデートのタイミングで動作が変わる可能性ありそう