しばやん雑記

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

Windows Server 2019 時代の Windows Containers を使ったアプリケーション移行

Kubernetes が 1.14 から Windows Server 2019 をサポートするようになり、周辺ツールやサービスも整ってきた現状、今年こそ Windows Containers がぼちぼち使われるようになるのではないかと思っています。と言っても新規開発は ASP.NET Core を推奨しているので、基本は既存のアプリケーションの移行目的です。

まだ AKS で Windows Node を作ることは出来ないですが、例によって AKS-Engine を使うと作れるようです。最近は k8s への興味が薄れつつあるので AKS が対応するまでは試さないです。

今回 k8s でサポートされたのは Windows Server 2019 だけっぽいので、2016 は捨てていく方向で良いと思います。2016 では Docker Image サイズ削減の恩恵も受けられないですし、リビジョンが違うとサポートを受けられないのは致命傷です。

毎年言ってる気がしますが、今度こそ一通り必要な環境やサービスが整ったと思うのでまとめます。

Docker Image

去年から徐々に MCR に移行が進んできましたが、今月になって .NET Framework / .NET Core の Docker Image が MCR に移行されたので、これで移行はほぼ完了となります。

Docker Hub を指している方は今後更新されなくなるはずなので、早めに差し替えておきましょう。移行先の情報は Docker Hub か以下の記事を確認してください。

具体的な例を挙げると .NET Framework を使っている場合は、以下の 2 つだけ覚えておけば良いです。

  • mcr.microsoft.com/dotnet/framework/sdk:4.7.2-windowsservercore-ltsc2019
  • mcr.microsoft.com/dotnet/framework/aspnet:4.7.2-windowsservercore-ltsc2019

Windows Containers を使う場合には、今後は ltsc2019 を指定しておけば良いです。.NET Core の場合も同じような命名なので覚えやすいはずです。

開発環境

Visual Studio 2017 では ASP.NET アプリケーションを Docker 化する場合には、何故か Docker Compose が必須になっていました。専用のプロジェクトも追加されて使い勝手が悪かったです。

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

来月リリースされる Visual Studio 2019 では、ASP.NET Core と同じように Dockerfile だけが追加されるシンプルな形式に変わります。

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

Visual Studio を使ったデバッグはこれまで通り行えるので、別に Docker になったからといって使い勝手が変わることは特にありません。しいて言えば初回の Docker Image の pull に時間がかかるぐらいです。

現実問題として Windows Containers を使いたいケースは実行環境のカスタマイズ系だと思うので、ベースとなるイメージを CI などで作っておくことで、ある程度のタイミングは制御可能でしょう。

CI / CD

必ず必要になってくるのが CI / CD です。単純に Dockerfile から Image を作って ACR にプッシュするだけなら ACR Tasks を使って簡単に用意できます。

ACR Tasks は既に Windows Server 2019 にアップデートされているので安心です。

もう少し複雑なリリースを行いたい場合は Azure Pipelines を使います。こっちも少し前に Windows Server 2019 と Visual Studio 2019 に対応した Hosted Agent が追加されています。

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

残念なことに Windows Server 2019 の Docker Image がキャッシュされていないのでビルド毎に無駄な時間が発生しますが、今後の Agent アップデートで直ると思います。

地味に嫌な問題としては公開されている .NET Framework SDK の Docker Image をそのまま使うと、ASP.NET アプリケーションのプリコンパイルに失敗するというのがありましたが、回避策があるのと Visual Studio 2019 の SDK によって解決しそうです。

Visual Studio 2017 の MSBuild が .NET 4.6.2 SDK をデフォルトで見るようになっているので、4.7.2 SDK しか入っていない Docker Image で失敗するという話でした。

実行環境

先述したように Kubernetes が Windows Server 2019 をサポートしたことで、近いうちには AKS でも簡単に Windows Server 2019 の Node が作成可能になるのではと思っています。*1

Web App for Containers (Windows) も順調にアップデートを重ね、まあまあ使えるようになってきた印象です。少し前に Windows Server 2019 へのアップデートも行われています。

GitHub ではちょっとマニアックなサンプル Dockerfile も公開されています。

この辺りの作業は VM 向けの Image を作るのとあまり変わらないので、Dockerfile を書いて環境をカスタマイズしていく形です。Server Core なので少し注意が必要ですが。

まとめ

実際のところ 98% は通常の App Service に移行が行えると思っているので、ソフトウェアのインストールが必要だったり、サンドボックスで制限されている機能を使っている 2% を VM や k8s を使って動かすのではなく、マネージド環境で動かしたいときに使うものだという認識です。

Docker Image が大きくて扱いにくいという問題は抱えつつも、環境自体は Linux と同じような構成を取れるようになったので、主にエンプラ向けで活躍できるのではないかと思います。

*1:ARM Template を使えばこれまでもデプロイは出来ていたけど