クラウドネイティブで、継続的に付加価値を提供できるモダンアプリケーションの開発とリリース、それを実現する代表的な技術が「コンテナ(Container)」です。Linuxで生まれ発展してきたコンテナ技術は、Windows 10バージョン1607およびWindows Server 2016以降、Windowsでもサポートされ、Windowsコンテナによるモダンアプリケーション開発やレガシアプリケーションのモダン化を可能にしました。

しかしながら、コンテナ技術の周辺は変化のスピードが速く、どこから手を付けていいのか分からないほど複雑化しています。まずは基本的なところからはじめましょう。

コンテナの基本、仮想化技術との違い

コンテナは、コンテナホストのOS上でアプリケーションを実行するための、軽量のパッケージです。独自の(仮想的な)ハードウェアを持ち、ゲストOSやアプリケーションをインストールして実装するのとは異なり、コンテナはホストOSのカーネルを共有し、レイヤー化されたコンテナの基本部分であるベースOSイメージが、ホストOSによって提供されないシステムサービスやAPIをアプリケーションに対して提供します。

コンテナはホストとの差分で提供される分離されたファイルシステムとレジストリを参照することができ、変更はコンテナにのみ反映され、通常(永続ストレージを使用しない限り)、その変更はコンテナ停止時に破棄されます。

  • 従来の仮想化技術とモダンなコンテナ技術の退避

    従来の仮想化技術とモダンなコンテナ技術の退避

ホストOSのカーネルを共有するという仕様上、Linuxコンテナを実行できるのはLinuxのコンテナホストだけであり、Windowsコンテナを実行できるのは、WindowsまたはWindows Serverのコンテナホストだけです。

Windows Server 2019では新機能Linux Containers on Windows(LCOW)が実験的にサポートされ、WindowsコンテナとLinuxコンテナの両方を実行できましたが、LCOWは数年前(2020年3月)に開発終了となり、サポートされなくなりました。

Windowsコンテナ、基本のベースOSイメージ

WindowsコンテナのベースOSイメージとしては、主に以下の4つが用意されています。

Windows Server Core ・・・ Webサーバ(IIS)、ASP.NET、従来の.NET Frameworkアプリケーションをサポート。
Nano Server ・・・ 最軽量のWindows Serverイメージ。主に.NET(旧称、.NET Core)アプリケーション用。
Windows Server ・・・ 完全なWindows APIセットを提供。GUIを提供できるわけではない。
Windows ・・・ 完全なWindows APIセットを提供。GUIを提供できるわけではない。

これらのベースOSイメージからコンテナやカスタムイメージを構築することもできますし、これらのベースOSイメージ上に構築された、以下のようなミドルレイヤーを含むコンテナイメージからコンテナやカスタムイメージを構築することもできます。

Windows IIS ・・・ Windows Server CoreベースのIIS環境。
ASP.NET ・・・ Windows Server CoreベースのIISおよびASP.NETランタイム環境。
.NET Framework ・・・ Windows Server Coreベースの.NET Frameworkランタイム環境。
.NET・・・ Windows Server Core、Nano Server、および(Linuxのコンテナホストで実行できる)Linuxベースの.NETおよびASP.NET Coreランタイム環境。

「プロセス」と「Hyper-V」、Windowsコンテナの2つの分離モード

Windowsコンテナには、以下の2つの実行モードがあります。

●プロセス分離(Process isolation) ・・・ コンテナはコンテナホストのホストOSを共有します。LinuxのコンテナホストでLinuxコンテナを実行するのと同様のモード。
●Hyper-V分離(Hyper-V isolation) ・・・ コンテナはUtility VMと呼ばれる仮想化され、分離されたカーネルのインスタンス上で実行されます。

Windowsコンテナにおけるプロセス分離モードには、バージョン互換性の制限があります。原則として、ホストOSとベースOSイメージのOSバージョン/ビルドが一致している必要があります(リビジョン番号までの一致は要求されません)。

例えば、Windows Server 2022のコンテナホスト上でWindows Server 2016やWindows Server 2019のコンテナをプロセス分離モードで実行することはできません。

Hyper-V分離モードは、Windowsコンテナ独自の実行モードであり、互換性のあるカーネルを分離環境で実行して、コンテナに提供することで、バージョン互換性の制限を取り除きます。ただし、上位互換はなく、ホストOSよりも新しいOSバージョン/ビルドのコンテナを実行することはできません。

  • Linuxコンテナとは異なり、Windowsコンテナはバージョン互換性の制約が大きかった。Hyper-V分離モードはそれを緩和するWindowsコンテナ固有の技術

    Linuxコンテナとは異なり、Windowsコンテナはバージョン互換性の制約が大きかった。Hyper-V分離モードはそれを緩和するWindowsコンテナ固有の技術

プロセス分離モードはWindows Serverのコンテナホストの既定です。Hyper-V分離モードはWindows 10/11上のDocker DesktopにおけるWindowsコンテナ使用時の既定です。次回説明する「Azure Kubernetes Services(AKS)」はプロセス分離モード(WindowsコンテナおよびLinuxコンテナ)にのみ対応しています。

Windowsコンテナの移植性向上に向けた新機能、新OS

Windows 11およびWindows Server 2022からは、プロセス分離モードの下位互換性の制限が緩和され、新しいOSバージョン/ビルドのコンテナホスト上で、Windows Server 2022のコンテナを実行できるようになりました。例えば、Windows 11バージョン22H2(OSビルド22621)は、Windows Server 2022(OSビルド20348)よりも新しいバージョンですが、Windows Server 2022のベースOSイメージをプロセス分離モードで実行できます。

  • Windows 11では、Windows Server 2022のベースOSイメージをプロセス分離モード(Docker Desktopの場合は--isolation=processを指定)で実行できる

    Windows 11では、Windows Server 2022のベースOSイメージをプロセス分離モード(Docker Desktopの場合は--isolation=processを指定)で実行できる

また、マイクロソフトはプロセス分離モードの互換性緩和に対応して、Windows Server 2022以降、年次リリースの「Windows Server Annual Channel for Containers」を提供する予定です。最初のバージョン23H2は年内にリリースされる予定です。

これは、以前提供していたWindows Server Semi-Annual Channelとは異なるものです。プロセス分離モードのWindowsコンテナの移植性は、Windows Server 2022以降、次のLTSCリリースまでの年次リリース、次のLTSCリリース、および次の次のLTSCリリース以前の年次リリースまでサポートされます。

  • Windows Server 2022以降のLTSCリリースと年次リリース、コンテナイメージの互換性(LTSCリリースのバージョン2025、2029は3年毎にリリースされるとしての仮定)

    Windows Server 2022以降のLTSCリリースと年次リリース、コンテナイメージの互換性(LTSCリリースのバージョン2025、2029は3年毎にリリースされるとしての仮定)

これにより、コンテナホスト環境のアップグレードサイクルに影響されることなく、同じコンテナイメージをプロセス分離モードで継続して実行でき、Linuxコンテナの従来からある高い移植性に一歩近づきます。

Windows Server Annual Channel for Containersは、プロセス分離モードにのみ対応したAKSのユーザーにアップグレードプロセスの合理化と、開発の柔軟性、互換性の強化といった利点をもたらします。詳しくは、以下のアナウンス(英語)を参照してください。

Windows Server Annual Channel for Containers
Portability with Windows Server Annual Channel for Containers