最終更新:

仮想マシン(VM)とコンテナの違いは?図解でやさしく比較


VMとコンテナ:何を分ける?
仮想マシンOSごと分けるアプリAゲストOS各々のカーネルアプリBゲストOS各々のカーネルハイパーバイザーハードウェアコンテナ同じカーネルを共有アプリA必要な部品アプリB必要な部品コンテナランタイムホストOS・カーネルハードウェア
典型的な構成を簡略化しています。VM上でコンテナを動かすこともあります。分離の強さやOSの互換性は、方式と設定を確認しましょう。
ひよこ ひよこ
手元のPCでアプリを試したいんだけど、VMとコンテナはどう違うの?
ペンギン先生 ペンギン先生
仮想化のレベルが違うんだ。VMは「コンピューター丸ごと」を仮想化するけど、コンテナは「アプリの実行環境だけ」を仮想化するよ。
ひよこ ひよこ
もうちょっとわかりやすく…!
ペンギン先生 ペンギン先生
VMをマンションの一室に例えると、各部屋にキッチン・バス・トイレが全部ある感じ。コンテナはシェアハウスで、キッチンやバスは共有だけど、自分の部屋は独立しているイメージだよ。
ひよこ ひよこ
あー!だからコンテナのほうが軽いんだ。
ペンギン先生 ペンギン先生
典型的なコンテナはホストのカーネルを共有するので、各VMでゲストOSを起動する構成より負担を減らせるよ。ただし起動時間やイメージの大きさはアプリ・構成・ダウンロードの有無で変わり、「VMは数分、コンテナは数秒」とは決められないんだ。
ひよこ ひよこ
じゃあコンテナのほうが優れてるの?
ペンギン先生 ペンギン先生
一概には言えないよ。VMではゲストごとにカーネルが分かれ、典型的なコンテナでは同じカーネルを共有するという違いがあるよ。ただしVMなら安全という保証ではないし、コンテナも権限や機能を制限して運用する必要があるんだ。
ひよこ ひよこ
使い分けがあるんだね。どういう基準で選ぶの?
ペンギン先生 ペンギン先生
アプリの配布単位をそろえたいならコンテナ、別のOSカーネルを必要とするならVMが候補になるよ。同じカーネルを共有するコンテナにはOSの互換性条件がある。分離要件、権限、更新方法、運用コストも合わせて選ぼう。
ひよこ ひよこ
両方同時に使うこともあるの?
ペンギン先生 ペンギン先生
あるよ!クラウド環境ではVM上にコンテナを動かすのが一般的なんだ。例えばEKSでは、EC2のワーカーノード上でコンテナを動かす構成を選べるよ。EKSの管理機能をすべて自分のVMに入れるという意味ではないんだ。
ひよこ ひよこ
入れ子になってるんだ!面白い。
ペンギン先生 ペンギン先生
Firecrackerのように、仮想デバイスを絞って起動やメモリの負担を減らすマイクロVMもあるよ。LinuxのKVMを使うVMで、AWS Lambdaにも使われている。これも「VMは必ず重くて遅い」と言い切れない例だね。

「試す環境」を用意するなら

たとえば、Webアプリとデータベースを自分のPCで動かす場面を考えてみましょう。アプリごとの必要な部品をまとめて配りたいなら、コンテナが候補です。一方、今のPCとは別のOSカーネルを含む環境を用意したいなら、VMが候補になります。VMの中でコンテナを動かす構成もあります。

まずは「何を分けたいか」を言葉にすると選びやすくなります。アプリの依存関係なのか、OSなのか、強い分離が必要なのか、という順で確認しましょう。

次に実際の構成を読むなら、Docker入門へ。複数のコンテナをまとめて起動する話はDocker ComposeとKubernetesの比較で確認できます。

参考資料