DockerConの最新エディションでMicrosoftは、過去1年間に.NETコアに実施された多数の改善点を公開した。すべて.NETとDockerを共用するエクスペリエンスの強化を目的とするものだ。
改善点はいずれも、.NET Core 3.0を対象としている。最も基本的な変更は、.NET Coreランタイム(CoreCLR)がデフォルトで使用するメモリの削減だ。CoreCLRは、すべての.NET Coreプログラムの実行を管理する。.NETプログラムがデフォルトで使用するメモリは、起動時に最初に割り当てられるメモリ量である。CoreCLRのデフォルトのメモリ使用量を減らすことで、.NET Coreのデフォルト設定を変更せずに、コンテナのメモリ使用効率の向上が可能になる。
最近実施された変更により、.NET Core 3.0は、Dockerのリソース制限(メモリとCPU)もサポートするようになった。リソースを制限することで、コンテナが使用できるメモリあるいはCPUのコントロールが可能になる。これらの制限は、メモリとCPUの両方(メモリ128MB、あるいは2CPU、というように)の使用量の観点から定義される。メモリ制限が設定されると、.NET Core 3.0はそれに対応して動作を変更する。例えばガベージコレクタのヒープサイズは、20MBまたはメモリ制限値の75%に設定される。CPUの制限では、Dockerに設定される値は整数値に切り上げられて、CoreCLRが使用するCPUコアの有効最大数になる。
この改善は、Dockerコンテナにおける.NETのユーザビリティのレベル向上にも影響を与える。コミュニティの要望に応えて、Microsoftは、公開中の.NET Core SDK Dockerコンテナイメージに、新たにPowerShellコアを、自己完結型のアプリケーションとして追加した。さらに、.NET CoreのコンテナイメージがMicrosoft Container Registry(MCR)から入手可能になった 。これらによって、Microsoft Azureを、Microsoft提供のコンテナイメージの公式ソースとして使用することや、ユーザの地理的な場所に応じてコンテナイメージをデプロイするための、グローバルなコンテンツ配信ネットワーク(CDN)として使用することが可能になった。
.NET Coreは、さまざまなプラットフォームのディストリビューションやバージョンでサポートされているが、Dockerでサポートされているディストリビューションのリストはもっと小規模だ。現時点では、Windows Nano Serverの全バージョンの他は、特定バージョンのAlpine、Debian、Ubuntuの各ディストリビューションだけがサポートされている。.NET Coreチームは現在、Linux上のARM64のサポートを追加するプロセスを進めている。
.NETチームのプログラムマネージャであるRichard Lander氏は、同じブログ記事で、改善点について、"当社は.NET Coreを、真のコンテナランタイムにするための投資を行っています。過去のリリースでは、.NET Coreをコンテナフレンドリにすることを考えていました。現在はコンテナに対応して、低メモリ環境で効率的に機能するように、ランタイムを強化しているところです"、と述べている。
.NETコミュニティは、フレームワークのパフォーマンス改善を好意的に受け止めている。ブログ記事に加えて、MicrosoftとDockerは、DockerCon 2019で、コンテナを使用した.NET開発に関する複数のセッションを実施している。セッションのひとつでは、.NETによる開発を長く続けている企業にとって特に重要なテーマである、既存の.NETアプリケーションのコンテナ化を取り上げていた。このセッションはDockerが主催したもので、開発者コミュニティの支援と、業界によるコンテナ利用の促進に関する現在の同社の取り組みが紹介された。
Microsoftの今回の取り組みは、そのようなDockerの意図とも、さまざまな開発コミュニティによる同様の取り組みとも、整合性を持ったものだと言える。Microsoftの他のプロダクトも、同じトレンドに従っている。同社は今月初め、VS Code用に新たなリモート開発拡張機能をリリースした。これを使用すれば、リモートコンテナをVS Codeのローカルインスタンスと組み合わせて、シームレスに開発することが可能になる。