コンテナと仮想マシンの違い
1台のサーバーを“分けて使う”2つの方式。仮想マシンはOSごと仮想化して強く隔離し、コンテナはOSカーネルを共有して軽く速く動かす。
- 1.VM は OS ごと仮想化:ハイパーバイザの上に各VMが独自カーネルを持ち、隔離は強いが重い。
- 2.コンテナは カーネル共有:プロセスを隔離するだけなので軽量・高速起動だが、分離レベルはVMより弱い。
- 3.使い分け:アプリの大量配置・CI/CDはコンテナ、強い隔離や別OSが要る所はVM。両者は併用が普通。
なぜ「分けたい」のか
1台のサーバーに複数のアプリをそのまま同居させると、ライブラリのバージョンが衝突したり、片方の暴走が全体を巻き込んだりします。そこで「独立した箱」に分けて、依存関係・設定・障害を箱の中に閉じ込めたい——これが仮想化やコンテナ化の出発点です。
分け方には大きく2系統あります。OS の下(ハードウェア層)で分けるのが VM、OS の上(プロセス層)で分けるのがコンテナです。
仮想マシン:OSごと仮想化する
VM は ハイパーバイザ(仮想化ソフト)が物理マシンを分割し、それぞれの上に ゲストOS を丸ごと 動かします。各VMは独自のカーネル・独自のメモリ空間を持つ、いわば「箱の中の1台のPC」です。
- ハイパーバイザが CPU・メモリ・ディスクを仮想的に切り出す
- 各VMに 独立したゲストOS(カーネル込み) が載る
- ホストとは別の OS を動かせる(Linux ホスト上で Windows VM など)
- 隔離が強い:カーネルごと分かれているので、相互干渉が起きにくい
→ 代わりに、OS を何個も起動するぶん メモリ・ディスクを多く消費し、起動も分単位になりがちです。
物理ハードに直接載る Type 1(ベアメタル型:ESXi, Hyper-V, KVM) と、既存OSの上のアプリとして動く Type 2(ホスト型:VirtualBox, VMware Workstation) があります。クラウドのVM(EC2 等)は性能重視で Type 1 が主流です。
コンテナ:カーネルを共有する
コンテナは ホストOSのカーネルをそのまま借りて、アプリとその依存物だけを隔離された空間で動かします。新しい OS を起動するのではなく、1つのプロセス群を「壁で囲う」 イメージです。
その壁を作っているのは、主に Linux カーネルの2つの機能です。
- namespace:プロセスID・ネットワーク・ファイルシステムなどの 見え方を分離(コンテナからは自分専用の世界に見える)
- cgroups:CPU・メモリなどの 使用量を制限(1つのコンテナが資源を食い尽くさないように)
ゲストOSを持たないぶん 数十MB〜と軽く、起動は秒〜ミリ秒。同じホストに何十個も詰め込めます。仕組みやコマンドは /devops/tools/docker/ が代表例です。
見た目が似ているので混同されがちですが、コンテナは VMの軽量版ではありません。VMはカーネルごと別、コンテナはカーネル共有——分離の仕組みが根本的に違います。「軽い箱」という比喩は便利ですが、隔離の強さまで同じだと思い込むと事故のもとです。
イメージ:箱の“設計図”
コンテナの実体は実行中のプロセスですが、その元になる イメージ が再現性のカギです。イメージは「アプリ+依存ライブラリ+最小限のファイル群」を固めた 読み取り専用のテンプレートで、これを起動するとコンテナになります。
- Dockerfile(設計図)→ ビルド → イメージ(テンプレート)→ 実行 → コンテナ(実体)
- イメージは レイヤ構造:差分だけを重ねるのでキャッシュが効き、配布も差分転送で速い
- 同じイメージなら どこでも同じように動く(「自分の環境では動く」問題を減らす)
# イメージをビルドして実行するだけ
docker build -t myapp:1.0 .
docker run -p 8080:80 myapp:1.0
VMにもイメージ(VMテンプレート/AMI 等)はありますが、OS丸ごとなのでサイズはGB級。コンテナイメージのアプリ単位の小ささ・差分の速さが、CI/CD や大量デプロイと相性が良い理由です。
比較表
| 観点 | 仮想マシン (VM) | コンテナ |
|---|---|---|
| 分離する層 | ハードウェア層(ハイパーバイザ) | プロセス層(カーネル共有) |
| OS / カーネル | VMごとに独自のゲストOS | ホストのカーネルを共有 |
| 起動速度 | 分単位(OS起動が必要) | 秒〜ミリ秒 |
| サイズ | GB級(OS込み) | 数十MB〜(アプリ+依存) |
| 隔離の強さ | 強い(カーネルごと分離) | VMより弱い(共有カーネル) |
| 別OSを動かす | 可能(Linux上でWindows等) | 原則ホストと同系カーネルのみ |
| 向く用途 | 強い隔離・レガシー・別OS | アプリの大量配置・CI/CD・マイクロサービス |
つまずきポイント
実務では二者択一ではありません。クラウドのVMの中でコンテナを大量に動かす のが定番構成です。VMで強い隔離とインフラ境界を確保しつつ、その上でコンテナの軽さと可搬性を享受します。Kubernetes クラスタの各ノードがまさにこの形です。
つまずきやすい点を整理します。
- 隔離の過信:コンテナはカーネルを共有するため、カーネルの脆弱性を突かれるとホストや他コンテナに波及し得ます。マルチテナントで強い隔離が要るなら、VMや軽量VM技術(Firecracker, Kata Containers 等)を検討します。
- 「コンテナ=Linux」ではない:Windows コンテナも存在しますが、Linux コンテナは Linux カーネル上、Windows コンテナは Windows カーネル上 が原則。Windows/Mac の Docker は内部で Linux VM を動かして橋渡ししています(だから手元では“VMの上のコンテナ”になっている)。
- 状態の持ち方:コンテナは使い捨て(イミュータブル)前提が基本。データはコンテナ内に貯めず、ボリュームや外部DBへ。この考え方は /devops/immutable-infra/ と地続きです。
カーネルに深く依存するもの(特殊なドライバ、別系統のOS、強い規制で完全隔離が必須なワークロード)は、無理にコンテナ化せず VMのままが正解なこともあります。軽さだけで選ばず、必要な 隔離レベル から逆算しましょう。
どっちを選ぶ?
- アプリを素早く・大量に・同じ環境で動かしたい(マイクロサービス、CI/CD、スケール)→ コンテナ
- 強い隔離・別OS・カーネル依存が必要(マルチテナント基盤、レガシー、規制対応)→ VM
- 両方の良いとこ取り(堅いインフラ境界の上に軽い箱)→ VMの上でコンテナ(実務の主流)
DevOps/インフラ Article
コンテナと仮想マシンの違いを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
コンテナ
比較で見る軸
難易度: intermediate / カテゴリ: DevOps/インフラ / タグ数: 4
導入後に効く点
コンテナは カーネル共有:プロセスを隔離するだけなので軽量・高速起動だが、分離レベルはVMより弱い。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- intermediate
- カテゴリ
- DevOps/インフラ
- タグ数
- 4
判断チェックリスト
- 自社の用途が「コンテナ / 仮想マシン」に近いか確認する。
- 強みである「VM は OS ごと仮想化:ハイパーバイザの上に各VMが独自カーネルを持ち、隔離は強いが重い。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。