OS レベルの仮想化は、カーネルがコンテナ( LXC、Solaris コンテナ、AIX WPAR、HP-UX SRP コンテナ、Docker、Podman、Guix )、ゾーン( Solaris コンテナ)、仮想プライベート サーバー( OpenVZ )、パーティション、仮想環境( VE )、仮想カーネル( DragonFly BSD )、jail ( FreeBSD jailおよびchroot )など、複数の分離されたユーザースペースインスタンスの存在を可能にするオペレーティングシステム( OS) 仮想化パラダイムです。 [ 1 ]このようなインスタンスは、その中で実行されているプログラムの観点からは、実際のコンピュータのように見える場合があります。通常のオペレーティングシステム上で実行されているコンピュータ プログラムは、そのコンピュータのすべてのリソース (接続されているデバイス、ファイルとフォルダ、ネットワーク共有、CPU パワー、定量化可能なハードウェア機能) を参照できます。コンテナ内で実行されているプログラムは、コンテナの内容とコンテナに割り当てられたデバイスのみを参照できます。
Unix 系オペレーティングシステムでは、この機能は、現在実行中のプロセスとその子プロセスの見かけ上のルートフォルダを変更する標準のchrootメカニズムの高度な実装と見なすことができます。分離メカニズムに加えて、カーネルは、あるコンテナのアクティビティが他のコンテナに与える影響を制限するために、リソース管理機能を提供することがよくあります。Linux コンテナはすべて、 Linux カーネルが提供する仮想化、分離、およびリソース管理メカニズム、特にLinux 名前空間とcgroupsに基づいています。[ 2 ]
コンテナという言葉は、一般的にはOSレベルの仮想化を指しますが、 MicrosoftのHyper-Vコンテナのように、ホストOSと様々なレベルで連携して動作する、より完全な仮想マシンを指す場合もあります。1960年以降の仮想化の概要については、「仮想化技術のタイムライン」を参照してください。
一般的なパーソナルコンピュータのオペレーティングシステムでは、コンピュータプログラムは(アクセスできない場合でも)システムのすべてのリソースを認識できます。それらには以下が含まれます。
オペレーティングシステムは、どのプログラムがリソースを要求したか、また実行環境におけるユーザーアカウントに基づいて、これらのリソースへのアクセスを許可または拒否する場合があります。また、オペレーティングシステムはこれらのリソースを隠蔽することもあり、その場合、コンピュータプログラムがリソースを列挙しても、列挙結果には表示されません。しかしながら、プログラミングの観点から見ると、コンピュータプログラムはこれらのリソースとやり取りを行い、オペレーティングシステムはそのやり取りを管理したことになります。
オペレーティングシステムの仮想化、すなわちコンテナ化を用いることで、リソースの一部のみを割り当てたコンテナ内でプログラムを実行することが可能になります。コンピュータ全体を利用できると想定していたプログラムは、コンテナ内で実行されると、割り当てられたリソースしか認識できず、それが利用可能なすべてのリソースであると認識します。各オペレーティングシステム上に複数のコンテナを作成でき、それぞれのコンテナにコンピュータのリソースの一部が割り当てられます。各コンテナには任意の数のコンピュータプログラムを含めることができます。これらのプログラムは同時に実行することも、個別に実行することもでき、互いに相互作用することも可能です。
コンテナ化はアプリケーション仮想化と類似点がある。後者では、1つのコンピュータプログラムのみが隔離されたコンテナ内に配置され、隔離はファイルシステムのみに適用される。
オペレーティングシステムレベルの仮想化は、仮想ホスティング環境で一般的に使用されており、相互に信頼関係のない多数のユーザー間で限られたハードウェアリソースを安全に割り当てるのに役立ちます。システム管理者は、別々のホスト上のサービスを1台のサーバー上のコンテナに移動することで、サーバーハードウェアを統合するためにもこれを利用することがあります。
オペレーティングシステムレベルの仮想化は、特定のLinuxディストリビューション用に作成されたソフトウェアを別のディストリビューションで実行するためにも使用できます。例としては、Distroboxがあります。[ 3 ]
その他の典型的なシナリオとしては、セキュリティの向上、ハードウェアの独立性、およびリソース管理機能の追加のために、複数のプログラムを別々のコンテナに分離することが挙げられます。[ 4 ]ただし、chroot メカニズムの使用によって提供されるセキュリティの向上は完璧ではありません。[ 5 ]ライブ マイグレーションが可能なオペレーティングシステム レベルの仮想化実装は、クラスタ内のノード間でコンテナの動的な負荷分散にも使用できます。
オペレーティングシステムレベルの仮想化は、通常、完全な仮想化よりもオーバーヘッドが少なくなります。これは、OSレベルの仮想パーティション内のプログラムがオペレーティングシステムの通常のシステムコールインターフェースを使用するため、完全な仮想化( VMware ESXi、QEMU、Hyper-Vなど)や準仮想化( XenやユーザーモードLinuxなど)のようにエミュレーションや中間仮想マシンでの実行を必要としないためです。また、この形式の仮想化は、効率的なパフォーマンスのためにハードウェアのサポートを必要としません。
オペレーティングシステムレベルの仮想化は、ホストとは異なるゲストオペレーティングシステムや異なるゲストカーネルをホストできないため、他の仮想化アプローチほど柔軟ではありません。たとえば、Linuxでは異なるディストリビューションは問題ありませんが、Windows などの他のオペレーティングシステムはホストできません。可変入力システムを使用するオペレーティングシステムは、仮想化アーキテクチャ内で制限を受けます。クラウドサーバーリレー分析などの適応方法は、これらのアプリケーション内で OS レベルの仮想環境を維持します。[ 6 ]
Solaris は、Solaris 10 ホスト上で古いSolaris 8または 9 バージョンをエミュレートする環境をコンテナ内で実行できるブランド ゾーン機能により、上記の制限を部分的に克服しています。Linux ブランド ゾーン (「lx」ブランド ゾーンと呼ばれます) は、x86ベースの Solaris システムでも利用可能で、完全な Linuxユーザー スペースと Linux アプリケーションの実行のサポートを提供します。さらに、Solaris は、 「lx」ゾーン内にRed Hat Enterprise Linux 3.x またはCentOS 3.x Linux ディストリビューションをインストールするために必要なユーティリティを提供します。[ 7 ] [ 8 ]しかし、2010 年に Linux ブランド ゾーンは Solaris から削除されました。2014 年に、 32 ビットLinux カーネルをサポートするオープンソースのSolaris フォークであるIllumos で再導入されました。[ 9 ]
一部の実装では、ファイルレベルのコピーオンライト(CoW)メカニズムが提供されています。(最も一般的なのは、標準ファイルシステムをパーティション間で共有し、ファイルを変更するパーティションが自動的に独自のコピーを作成する方式です。)これは、システム全体仮想化で一般的なブロックレベルのコピーオンライト方式よりも、バックアップが容易で、スペース効率が良く、キャッシュもシンプルです。ただし、システム全体仮想化では、ネイティブ以外のファイルシステムを扱ったり、システム全体の状態のスナップショットを作成・ロールバックしたりすることも可能です。
Linux OpenVZ、Linux-VServer、FreeBSD Jails、AIX Workload Partitions (WPARs)、HP-UX Containers (SRP)、Solaris Containers など、他にも多くの OS レベルの仮想化システムがあります。
LXC はユーザー名前空間をサポートするようになりました。 [...] LXC はもはや root 権限で実行されていないため、攻撃者がコンテナから脱出できたとしても、ホスト上で通常のユーザーの権限しか得られません。
は2000年にFreeBSD 4.0で初めて導入されました。
はディスクイメージをコピーオンライトとして扱います。