コンテンツにスキップ

【比較】コンテナと仮想マシン(VM)の違い

アプリケーションの実行環境を分離・仮想化する技術として、「コンテナ」と「仮想マシン(VM)」は現代のITインフラに欠かせない存在です。どちらもホスト上で独立した環境を提供しますが、仮想化するレイヤーと、それによるリソース効率や起動速度に大きな違いがあります。

概要

項目 コンテナ (Container) 仮想マシン (Virtual Machine)
仮想化の対象 OS(カーネルを共有) ハードウェア
分離レベル プロセスレベルの分離 完全なOSレベルの分離
構成要素 アプリケーション+ライブラリ/依存関係 ゲストOS+アプリケーション+ライブラリ/依存関係
サイズ 軽量(数MB〜数百MB) 重量(数GB〜数十GB)
起動速度 高速(秒単位) 低速(分単位)
オーバーヘッド 小さい 大きい
集約度 高い(1台のサーバーにより多くを配置可能) 低い
例えるなら アパートの各部屋(建物自体は共有) 独立した一軒家
代表的な技術 Docker, Podman VMware, Hyper-V, VirtualBox, KVM

一言で言うと、コンテナは「OSは共有し、アプリ環境だけを分離する軽量な技術」 であり、仮想マシンは「ハードウェアを仮想化し、OSごと完全に分離する重量級の技術」 です。

詳細比較

1. 仮想マシン (Virtual Machine)

仮想マシンは、物理的なコンピュータ(ホストマシン)の上に、「ハイパーバイザー」と呼ばれるソフトウェア層を介して、仮想的なハードウェア(CPU, メモリ, ディスク等)を作り出します。その仮想ハードウェア上に、ゲストOSをインストールし、さらにその上でアプリケーションを動作させます。

主な特徴

  • 完全な分離: 各VMは独自のOS(ゲストOS)を持つため、ホストOSや他のVMとは強く隔離されています。これにより、高いセキュリティレベルを確保できます。
  • 異なるOSの実行: ホストOSがLinuxであっても、Windowsや別のディストリビューションのLinuxなど、異なる種類のOSをゲストとして同時に実行できます。
  • 重量級: OSを丸ごと含むため、イメージサイズが大きく、起動にも時間がかかります。また、リソース消費も大きくなります。
  • レガシーシステムとの親和性: OSごと環境を再現できるため、特定の古いOSでしか動作しないアプリケーションを動かすのに適しています。

VMは、異なるOS環境が必要な場合や、セキュリティ要件が非常に厳しい場合に強力な選択肢となります。

2. コンテナ (Container)

コンテナは、ホストマシンのOSカーネルを共有し、その上でアプリケーションとその実行に必要なライブラリや依存関係だけをパッケージ化して分離します。Linux では namespace(PID・network・mount・UTS・IPC・user など)でリソースの見え方を分離し、cgroups で CPU・メモリ等のリソース使用量を制限することで、各コンテナが独立したファイルシステム、プロセス空間、ネットワークインターフェースを持つように見せています。OS(カーネル)自体はコンテナに含まれず、ホストと共有します。

主な特徴

  • 軽量・高速: OS(カーネル)を含まないため、イメージサイズは非常に小さく、数秒での高速な起動が可能です。
  • リソース効率: ホストOSのカーネルを共有するため、VMに比べてCPUやメモリのオーバーヘッドが格段に少なく、1台の物理サーバーにより多くのコンテナを集約できます。
  • 高いポータビリティ: 「一度ビルドすれば、どこでも動く(Build once, run anywhere)」を実現します。開発環境(ローカルPC)で作成したコンテナイメージを、そのままテスト環境や本番環境(オンプレミス、クラウド)で動かすことができます。
  • マイクロサービスとの親和性: 軽量で独立性が高い特性から、アプリケーションを小さなサービスの集合体として開発する「マイクロサービスアーキテクチャ」と非常に相性が良いです。
  • 制約: ホストOSとカーネルを共有するため、例えばLinuxホスト上でWindowsのコンテナを直接動かすことはできません(Docker Desktop on Windows などは内部的に Linux VM を介して Linux コンテナを動かしています)。

コンテナは、アプリケーションの開発・デプロイの速度と効率性を劇的に向上させる技術として、クラウドネイティブ時代の中心的な役割を担っています。

補足:両者は排他ではなく、クラウドでは「VM の上でコンテナを動かす」構成がむしろ一般的です(VM がハードウェア隔離を、コンテナがアプリ単位のパッケージングと密度を担う)。

よくある誤解

  • 誤解1:「コンテナは軽量な仮想マシン(軽量VM)である」 — 不正確です。VM はハイパーバイザーで仮想ハードウェアを作り、その上にゲストOS(独自カーネル)を載せます。一方コンテナはホストのカーネルを共有し、namespace と cgroups でプロセスを隔離するだけで、コンテナ自身はOS(カーネル)を持ちません。「仮想化するレイヤーが違う」ことが本質で、コンテナは「小さなVM」ではありません。
  • 誤解2:「コンテナの分離はVMと同等のセキュリティ境界になる」 — 一般には VM のほうが分離境界は強固です。コンテナはカーネルを共有するため、カーネルの脆弱性はホストや他コンテナへ波及し得ます。VM 並みの隔離が要るワークロードには、各コンテナを軽量VMで包む Kata Containers のような選択肢があります(Kata は OCI ランタイム互換で、コンテナ単位に専用カーネル付きの軽量VMを起動します)。
  • 誤解3:「コンテナならどんなOSのアプリでもどこでも動く」 — 動くのは「同じカーネル種別」の範囲です。Linux コンテナは Linux カーネル上で動くのが前提で、Windows ホストで Linux コンテナを動かす場合は内部で Linux VM が介在します。逆もまた然りで、カーネルをまたいだ任意のOSのアプリが無条件に動くわけではありません。
  • 誤解4:「コンテナはVMより新しいので常にVMの上位互換」 — 用途次第です。異なるOSの同時実行、強い分離境界、OSレベルのフルコントロールが必要なケースでは VM が適します。両者は置き換えではなく使い分け・組み合わせの関係です。

実務での選び分け

  • 仮想マシンを選ぶケース:

    • 異なる種類のOSを1台のサーバーで動かしたい。
    • 強い分離境界(テナント間・信頼境界)が必須要件である。
    • OSレベルでのフルコントロールが必要なレガシーアプリケーションを動かす。
  • コンテナを選ぶケース:

    • 複数のアプリケーションを、リソースを効率的に使いながら同じOS上で動かしたい。
    • 開発から本番まで、一貫した環境で迅速にアプリケーションをデプロイしたい。
    • マイクロサービスアーキテクチャを採用している。
    • スケーラビリティとポータビリティを重視する。
  • 判断軸:①カーネル/OSをまたぐ必要があるか ②要求される分離境界の強さ(マルチテナント・信頼境界)③起動速度・集約密度の重視度 ④運用体制とポータビリティ要件。

近年では、セキュリティと分離性を高めたコンテナ技術(例: Kata Containers)や、VM上でコンテナを管理する(例: OpenShift Virtualization)など、両者の長所を組み合わせるアプローチも進んでいます。

ひとことまとめ

コンテナ=ホストのカーネルを共有し namespace/cgroups でプロセスを隔離する軽量・高速な技術、VM=ハイパーバイザーで仮想ハードウェアを作りゲストOSごと隔離する重量・強分離の技術。優劣ではなく「仮想化するレイヤーの違い」で選び、必要なら組み合わせます。

出典・参考

  • Docker「What is a Container?」(コンテナはアプリ層の抽象で、複数コンテナがホストの OS カーネルを共有し、ユーザー空間の隔離プロセスとして動く。VM はハードウェアの抽象で各VMがOSのフルコピーを含む。コンテナは数十MB、VMは数十GB規模): https://www.docker.com/resources/what-container/
  • Linux man-pages「namespaces(7)」(namespace はグローバルなシステム資源を抽象化し、namespace 内のプロセスから見て独立したインスタンスに見せる。PID/network/mount/UTS/IPC/user/cgroup/time の各種別。コンテナ実装の用途の一つ): https://man7.org/linux/man-pages/man7/namespaces.7.html
  • Linux man-pages「cgroups(7)」(cgroups はプロセス群の CPU・メモリ等のリソース使用量を計測・制限・隔離する仕組み): https://man7.org/linux/man-pages/man7/cgroups.7.html
  • Kata Containers 公式(コンテナのように扱え動作しつつ、VM のワークロード隔離・セキュリティ上の利点を備えた軽量VMの標準実装。OCI ランタイム互換でコンテナごとに専用カーネル付きの軽量VMを起動): https://katacontainers.io/