仮想マシンとコンテナの違い:仮想化する層・カーネル・起動の速さ・隔離の強さ・使い分けを比較

どちらも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での大規模な運用、開発と本番の環境をそろえること

数値は代表的な目安で、世代や製品によって異なります。

どんなときに使うか

仮想マシン
ホストと違う種類のOSを動かしたいとき、カーネルの版や設定を自由に選びたいとき、ほかの利用者と同じ物理的なサーバを使うなど、強い隔離が必要なときに向きます。
コンテナ
同じアプリケーションを多数すばやく起動・停止したいとき、開発から本番まで同じイメージで動かしたいとき、多くの小さなサービスを1台に詰めて動かしたいときに向きます。

よくある質問

コンテナがあれば、仮想マシンは要りませんか?

用途によります。Linuxのアプリケーションを動かすだけなら、多くの場合はコンテナで足ります。一方、別の種類のOSを動かすとき、カーネルを変えたいとき、強い隔離が必要なときは仮想マシンが必要です。クラウドでは、事業者が用意した仮想マシンの上でコンテナを動かすことが多く、両者は置き換えるというより、組み合わせて使うものです。

WindowsやmacOSのパソコンで、Linuxのコンテナが動くのはなぜですか?

Linuxのコンテナは、Linuxのカーネルを必要とします。そのため、WindowsやmacOSでLinuxのコンテナを動かすツールは、裏で軽量なLinuxの仮想マシンを起動し、その中でコンテナを動かしています。コンテナがホストのカーネルを共有するという性質は変わらず、この場合のホストは仮想マシンの中のLinuxです。

コンテナの隔離を強くする方法はありますか?

コンテナの中のプロセスを管理者(root)ではない権限で動かす、不要な権限を外す、使えるシステムコールを制限する、などで、攻撃されたときの影響を小さくできます。さらに強い隔離が必要なときは、コンテナごとに軽量な仮想マシンを用意して、その中でコンテナを動かす方式もあります。

ハイパーバイザのタイプ1とタイプ2は、どう違いますか?

タイプ1(ベアメタル型)は、ハードウェアの上で直接動き、その上で仮想マシンを動かします。余分な層がないので性能と隔離に優れ、サーバやクラウドで使われます。タイプ2(ホスト型)は、通常のOSの上でアプリケーションとして動き、手軽に使えるので、パソコンでの開発や試験によく使われます。

理解度チェック

ハイパーバイザの型の説明として正しいものはどれか。

  1. Aハードウェアの上で直接動く型と、通常のOSの上でアプリケーションとして動く型がある
  2. B必ず通常のOSの上でアプリケーションとして動き、ハードウェアの上で直接は動かない
  3. C型による違いはなく、どれもハードウェアを使わずにソフトウェアだけで動く
答えと解説を見る

正解:A. ハードウェアの上で直接動く型と、通常のOSの上でアプリケーションとして動く型がある

ハイパーバイザには、ハードウェアの上で直接動いてOSを管理する型(タイプ1、ベアメタル型)と、WindowsやLinuxなど通常のOSの上でアプリケーションとして動く型(タイプ2、ホスト型)があります。タイプ1は余分な層がなく性能と隔離に優れるためサーバーやクラウドで、タイプ2は手軽に使えるためパソコンでの開発や試験でよく使われます。どちらもCPUの仮想化支援機能などのハードウェアを利用します。

コンテナと仮想マシンの違いとして正しいものはどれか。

  1. Aコンテナはそれぞれが独自のOSのカーネルをもち、仮想マシンはカーネルを共有する
  2. Bコンテナはハイパーバイザの上で動き、仮想マシンはOSの機能だけで動く
  3. Cコンテナはカーネルを共有し、仮想マシンは独自のOSを動かす
答えと解説を見る

正解:C. コンテナはカーネルを共有し、仮想マシンは独自のOSを動かす

コンテナは、1つのOSのカーネルを共有しながら、ファイルの見え方、プロセス、ネットワーク、使える資源などをグループごとに分けて隔離する方式です。OSを丸ごと起動しないので軽く、起動も速くなります。仮想マシンはハイパーバイザの上で、それぞれが独自のカーネルを含むOSを動かすため、重い代わりに隔離が強く、別の種類のOSも動かせます。カーネルを共有するのはコンテナの側で、説明が逆になっている選択肢に注意が必要です。

Linuxのコンテナを実現するカーネルの機能のうち、名前空間(namespaces)とcgroups(コントロールグループ)の役割の組み合わせとして、正しいものはどれか。

  1. A名前空間:プロセスから見えるもの(プロセスID、ネットワーク、マウントなど)を分ける、cgroups:CPUやメモリなどの資源の使用量を制限・計測する
  2. B名前空間:CPUやメモリなどの資源の使用量を制限・計測する、cgroups:プロセスから見えるもの(プロセスID、ネットワーク、マウントなど)を分ける
  3. C名前空間:コンテナごとに別のカーネルを起動して互いを隔離する、cgroups:コンテナごとに仮想的なCPUを作り、ハードウェアを模倣する
答えと解説を見る

正解:A. 名前空間:プロセスから見えるもの(プロセスID、ネットワーク、マウントなど)を分ける、cgroups:CPUやメモリなどの資源の使用量を制限・計測する

コンテナは、ホストのカーネルの上で動く普通のプロセスに、2つの仕組みで隔離をかけたものです。名前空間は、プロセスID、ネットワーク、マウント(ファイルシステムの見え方)、ホスト名などをグループごとに分け、コンテナの中のプロセスには自分たちの分だけが見えるようにします。cgroupsは、プロセスのグループが使えるCPUの時間やメモリの量を制限し、使用量を計測します。どちらもカーネルの機能なので、コンテナは別のカーネルを起動せず、ハードウェアを模倣することもありません。

  1. LinuxのホストでDockerを使い、ホストとは別のディストリビューションをもとにしたイメージからコンテナを起動して、その中で uname -r(カーネルのリリースを表示するコマンド)と cat /etc/os-release(ディストリビューションの情報を表示するコマンド)を実行した。結果の説明として、正しいものはどれか。
  2. コンテナイメージとコンテナの関係の説明として、正しいものはどれか。
  3. イミュータブルインフラストラクチャの考え方に沿った、本番のサーバのソフトウェアの更新の方法として、適切なものはどれか。

クラウドとコンテナの基礎の練習問題へ

関連する用語の解説

コンテナ
アプリケーションと、その実行に必要なライブラリや設定をまとめ、ホストのOSのカーネルを共有しながら、ほかのプロセスから隔離して動かす実行の単位。Linuxでは、プロセスID・ネットワーク・マウントなどの見え方を分ける名前空間と、CPUやメモリの使用量を制限するcgroupsで実現される。OSを丸ごと起動する仮想マシンより軽く、起動も速いが、カーネルを共有するので、ホストと異なる種類のOSのカーネルは動かせない。コンテナはコンテナイメージから作られ、DockerやKubernetesなどで作成・管理される。
コンテナイメージ
コンテナを作るもとになる読み取り専用のひな形。アプリケーションの実行ファイル、ライブラリ、設定などのファイルを層(レイヤ)に分けて重ね、起動するコマンドなどの設定を付けたもので、OSのカーネルは含まない。Dockerfileなどから作られ、レジストリに保管して配布する。リポジトリ名とタグ(例: web:1.4)で指定するほか、中身から計算したダイジェスト(sha256:…)で一意に指定できる。同じ層は複数のイメージで共有される。
ハイパーバイザ
1台のコンピュータの上で複数の仮想マシンを動かすためのソフトウェア。各仮想マシンのOSにCPU・メモリ・装置を分け与え、互いに隔離する。仮想マシンモニタともいう。
Docker
コンテナイメージの作成(ビルド)、レジストリとのイメージのやり取り、コンテナの起動と管理を行うための代表的なソフトウェアの一式。Dockerfileに書いた命令からイメージを作り、docker run でコンテナを起動する。-p によるポートの公開、ボリュームやバインドマウントによるデータの保存、ネットワークの設定などを行える。イメージとコンテナの形式は OCI(Open Container Initiative)の仕様として標準化されており、Docker以外のツールでも同じイメージを扱える。
Kubernetes
多数のマシン(ノード)からなるクラスタの上で、コンテナを配置し、数を保ち、更新し、接続先を提供するためのオーケストレーションの基盤。利用者はDeploymentやServiceなどのリソースで「あるべき状態」を宣言し、コントローラが実際の状態を観察して宣言に近づける(リコンサイル)。最小の単位はPodで、Podが失われると自動で作り直され、ローリングアップデートや、負荷に応じた自動スケーリングも行える。略してK8sとも書く。
イミュータブルインフラストラクチャ
一度作ったサーバ(仮想マシンやコンテナ)には変更を加えず、更新が必要なときは、変更を入れたイメージから新しいものを作って入れ替え、古いものは捨てるという運用の考え方。すべてのサーバが同じイメージから作られるので、手作業の違いが積み重なってサーバごとに構成がずれることを防げ、前のイメージに戻せば簡単に元の状態に戻せる。ログやデータのように残すものは、サーバの外のストレージやデータベースに置く。

関連する比較