コンテナ型仮想化

Pocket

コンテナ型仮想化

コンテナ型仮想化とは何か

Dockerでよく聞くコンテナ型仮想化を「よくわかんないけど、従来の仮想化よりもオーバーヘッドが少ないんでしょ」程度にしか理解していなかったので、まとめてみた。

コンテナとは、1つのOS環境に分離された空間を作成しその分離された空間ごとに異なるOS環境を実現することができ、コンテナによってマルチOS環境を実現することができるため、複数のOSを必要とする場合でも1つのOS環境に集約できるというメリットがある。

従来の仮想化で広く使われて居る仮想化技術としては、XenやKVMがあるが、これらはホストOS上で仮想的なマシン環境を作り出し、その上でOSを実行させることで複数のOS環境の構築を可能にしている。
従来の仮想化では、複数のOS環境とアプリケーションを1つのものとして扱い、可搬性の高い基盤を提供していたが、コンテナ型仮想化と比較すると、複数のOSを集約した場合の性能劣化や、OSとアプリケーションを介在する仮想化ソフトウェアの障害発生時の問題切り分けの複雑化していた。

コンテナ型仮想化は、OSの上にコンテナと呼ばれる仮想的なユーザー空間を提供する。ユーザー空間とは、ユーザーがアプリケーションを実行するためのリソースが提供される空間で、通常の仮想化では、1つのOSの上に1つのユーザー空間があるのですが、コンテナ型仮想化では1つのOSの上で仮想的なユーザー空間であるコンテナを複数提供できます。

従来の仮想化とコンテナの違い

一般的なハイパーバイザー型の仮想化ソフトウェアは、、仮想的なハードウェアである「仮想マシン」を提供し、その仮想マシンが提供するBIOS、CPU、メモリ、ディスク、NICなどを仮想でゲストOSに見せることで、ゲストOSからは物理的なマシンで稼働しているかのように見えます。このため、ゲストOSとしては、通常のOSの起動、停止となんら変わらない運用が必要となります。例えば、ゲストOSでは、自身の仮想ディスクのマスターブートレコード領域に対してブートローダをインストールしなければ、当然ゲストOSは、正常に起動しません。また、OSの終了時に正常なシャットダウン手続きを行わなければ、仮想ディスクにインストールされたゲストOSは、物理サーバーで稼働するOSの時と同様、OS自体が損傷する可能性もあります。
従来の仮想化の場合は、ホストOSとは異なるOSを仮想マシン上で実行できる、ホストOSとゲストOSを完全に分離できる、といったメリットがあるが、ハードウェアをシュミレートするため、そのためにオーバヘッドが必要になるというデメリットもある。

一方で、コンテナは、XenやKVMといった従来の仮想化とは異なり、仮想マシンを作り出すのではなく、OSが利用するリソースを隔離することで複数の環境を並立させることを可能にしている。

container

コンテナ環境は、Namespaceとcgroupsと呼ばれる資源管理の仕組みを使うことで、単一のOS内で複数のコンテナがプロセスとして稼働するため、分離された空間に必要とされるOS環境(コンテナ)のコンポーネントや資源も少なくて済むといった特徴があります。
そのため、コンテナはKVMやXenなどのハイパーバイザー型の仮想化技術に比べて、CPU、メモリ、ストレージ、ネットワーク等のハードウェア資源の消費やオーバーヘッドが小さいため、集約させることが可能です。一般的に、コンテナ環境では、アプリケーションのプロセスがコンテナごとに分離されますが、ホストOS環境から直接実行されるため、コンテナ上のCPU利用は、ホストOSと同等の性能を発揮できます。また、ネットワークやディスクI/Oについても、わずかながらのオーバーヘッドは存在するものの、非常に小さくすることが可能である。

この方式では、ゲストOSに相当する分離された空間において、ハードウェアをシュミレートする必要がないため、仮想化によるオーバーヘッドはほぼない。そもそも物理マシン上での一般的なOSのブート手順をこの行わないため、ハイパーバイザー型の仮想化基盤のゲストOSに比べ、オーバーヘッドが少なく、コンテナの起動・停止が非常に高速であるという特徴がある。

コンテナの歴史

コンテナを実現する要素として、chrootというものが存在する。chrootはプロセスのルートディレクトリを変更するもので、これによってプロセスがアクセスできるディレクトリを制限したり、システムが通常使用するライブラリとは異なるライブラリを読み込ませることが可能になる。しかし、chrootで制御できるのはファイルやディレクトリに対するアクセスのみで、ネットワークやプロセスなどについてはコントロールできない。
また、FreeBSDにはchrootを発展させた機構としてjailと呼ばれる機能が搭載されている。jailではファイルシステムに対するアクセスだけでなく、プロセスやデバイスといったリソースについても制御が可能になっている。コンテナはこのjailと同様の考え方で実装されたもので、cgroupsと呼ばれるリソース管理機構を用いて実装されている。
cgroupsは、OSが管理するさまざまなリソースを一元的に制御するためのもので、リソースをグループ化し、グループごとに優先度や利用できるリソースを制限したり、グループを隔離して他のグループからは不可視にする、といった機能を提供する。
cgroupsで管理できるのはファイルシステムやプロセスに加え、CPUリソースやメモリ、各種デバイス、ネットワークパケット、ネットワークインターフェイスなど多岐に渡る。cgroupsの利用例としては特定のプロセスが利用できるメモリ量やCPU時間などを制限する、といったものがあるが、コンテナではプロセスに対しchrootのように特定のディレクトリをルートディレクトリと認識させ、かつcgroupsの名前空間機能を使って各種リソースを隔離することで、仮想的な環境の構築を実現している。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>