【図解】コレ1枚でわかる仮想化とコンテナ
「サーバー仮想化」による仮想マシンの使用目的は、「隔離されたアプリケーション実行環境」すなわち、すなわちアプリケーションがクラッシュしても他に影響を与えない、アプリケーション毎に独自のシステム管理とユーザー・グループを持つことができるようにすることです。
同様の目的を実現する手段として「コンテナ」があります。コンテナは、「隔離されたアプリケーション実行環境」と言う点では仮想マシンと同じですが、仮想マシンとは異なり、ひとつのOS上で複数のコンテナが稼働します。
仮想マシンとは、本物と同じサーバーとして機能するので、それぞれにOSを稼働させ、CPUやメモリ、ストレージなども本物と同じだけ消費します。一方、コンテナは、OSが1つなのでシステム資源のオーバーヘッド(重複して消費される資源や能力)が少なくてすみ、同じ性能のハードウェアであれば、仮想マシンより多くの数のコンテナを実行できます。
また、コンテナは、それを起動させるために仮想マシンのようにOSを起動させる手間がかからないため、極めて高速で起動できます。さらに個別にOSを用意する必要がないのでストレージ使用量も、それを動かすためのシステム資源も少なくて済みます。
但し、コンテナはどれも同じOSです。仮想マシンならそれより一段下のレベル、つまりハードウェアのサーバーと同じ振る舞いをするので、仮想マシン毎に別々のOSを稼働させることができる点が異なります。ただ、本番でアプリケーションを稼働させる場合、仮想マシンが異なっても、管理負担軽減のために同じOSに統一することも多いのでこれが制約になることは、限られます。
ひとつのコンテナは、OSから見るとひとつのプロセスです。プロセスとは、プログラムが動いている単位です。そのため、他のサーバーにコンテナを移動させて動かすにも、OS上で動くひとつのプログラムを移動させるのと同様に、ハードウェアの機能や設定に影響を受けません。仮想マシンなら、仮想マシンごとの機能や構成にかかわる設定情報も引き継がなくてはなりませんが、コンテナではその必要がなく、異なるサーバー間で実行環境を容易に移動できます。