仮想マシンとコンテナの違い:仮想化する層・カーネル・起動の速さ・隔離の強さ・使い分けを比較
どちらも1台のコンピュータの上で、複数のアプリケーションを互いに隔離して動かす仕組みですが、仮想化する層が違います。仮想マシンは、ハイパーバイザがCPU・メモリ・ディスク・ネットワークなどのハードウェアを仮想的に作り、その上で仮想マシンごとに、カーネルを含むOSを丸ごと動かします。コンテナは、ホストのOSのカーネルを共有したまま、名前空間やcgroupsなどのカーネルの機能で、プロセスから見えるものと使える資源を分けます。コンテナはOSを起動しないので軽く、起動も速い一方、隔離の強さと動かせるOSの種類では仮想マシンが勝ります。クラウドでは、仮想マシンの上でコンテナを動かすように、両方を組み合わせて使うのが一般的です。
| 項目 | 仮想マシン | コンテナ |
|---|---|---|
| 仮想化する層 | ハードウェア。ハイパーバイザが、CPU・メモリ・ディスク・ネットワークの装置を仮想的に作って分け与える | OS。ホストのカーネルの上で、プロセスから見えるもの(プロセスID、ネットワーク、ファイルシステムなど)と使える資源を分ける |
| OSのカーネル | 仮想マシンごとに、自分のカーネルを含むOS(ゲストOS)を動かす | ホストのカーネルを、すべてのコンテナで共有する。コンテナイメージにカーネルは含まれない |
| 動かせるOS | ホストと別の種類のOSも動かせる(Linuxのホストの上でWindowsを動かすなど) | ホストのカーネルで動くものに限られる。Linuxのコンテナには、Linuxのカーネルが必要 |
| イメージの大きさ | OS全体を含むので、一般にGB単位になる | アプリケーションと必要なライブラリだけなので、一般に仮想マシンよりずっと小さい |
| 起動の速さ | OSの起動から始まるので、数十秒から数分かかることが多い | プロセスを起動するだけなので速く、一般に数秒以内で動き出す |
| 隔離の強さ | 強い。ハードウェアの水準で分けるので、ゲストOSのカーネルの問題がほかの仮想マシンに及びにくい | 仮想マシンより弱い。カーネルを共有するので、カーネルの脆弱性を突かれると、ホストやほかのコンテナに影響が及ぶおそれがある |
| 資源の効率 | ゲストOSごとにメモリやCPUを使うので、1台で動かせる数は少なめ | OSの重複がないので、同じ資源でより多くを動かせる |
| 主な用途 | 種類の違うOSの同居、サーバの集約、IaaSの仮想マシン、強い隔離が必要な環境 | マイクロサービス、CI/CDでの試験と配布、Kubernetesでの大規模な運用、開発と本番の環境をそろえること |
数値は代表的な目安で、世代や製品によって異なります。