はじめに
コンテナとは? VM との違い
コンテナはホストのカーネルを共有したまま Linux Namespaces と cgroups でプロセスを隔離する仕組み。VM との違いと、何が得られるかを最初に押さえます。
コンテナは「軽い VM」ではなく「隔離されたプロセス」
コンテナを初めて触る人は「軽量な仮想マシン」と説明されがちですが、実体は異なります。
コンテナはホスト OS のカーネルを共有したまま動く、1 つ(または複数)のプロセスです。
- VM: ハイパーバイザ上にゲスト OS のカーネルまで含めて積み上げる
- コンテナ: ホストのカーネルをそのまま使い、プロセスから見える「世界」だけを切り替える
この違いが、起動時間・イメージサイズ・集約密度・隔離強度のすべてに影響します。
VM とコンテナの比較表
実務で「どちらを選ぶか」を考えるときの観点を一覧にまとめます。
| 観点 | VM | コンテナ |
|---|---|---|
| カーネル | ゲスト専用 | ホストと共有 |
| 起動時間 | 数十秒〜数分 | ミリ秒〜数秒 |
| イメージサイズ | 数 GB | 数十 MB 〜 数百 MB |
| 1 ホストあたりの同時実行数 | 数〜数十 | 数百〜数千 |
| 隔離境界 | ハードウェア仮想化(強い) | カーネル名前空間(弱め) |
| 異種 OS の同居 | 可能(Linux + Windows 等) | ホストと同じカーネル系のみ |
隔離強度が必要な領域(マルチテナントで他社と同一ホストに乗る等)は VM や軽量 VM(Firecracker、Kata Containers)を、開発環境や自社のマイクロサービスはコンテナを、という住み分けが一般的です。
よくある誤解
はじめに整理しておくと、後の学習で混乱しにくくなります。
- 「コンテナ = Docker」ではない。Docker は最初に普及したランタイムで、今は containerd / runc / Podman / CRI-O など複数の実装がある
- コンテナはホストカーネルを共有するので、ホストが Linux でなければ Linux コンテナはそのままでは動かない。macOS / Windows では裏で軽量 Linux VM を起動している
- コンテナ間の隔離は VM ほど強くないので、信頼できないコードを同じカーネルで走らせる用途には向かない(マルチテナント SaaS の分離境界には VM か gVisor / Kata を併用するのが一般的)
- 「コンテナ = 不変」ではない。書き込み可能な層があるので中で変更は可能だが、再現性のため変更は Dockerfile に書くのが原則
関連トピック
linux namespaces- Linux Namespaces はプロセスごとに「見える世界」を分離する仕組み。PID・Mount・Network・UTS・IPC・User・cgroup の 7 種があり、コンテナのプロセス隔離の中核を担う。 cgroups- cgroups(Control Groups)はプロセス群の CPU・メモリ・IO などのリソース使用量を制限・計測する Linux カーネルの仕組み。namespace と対になってコンテナの基盤を成す。 container vs VM- コンテナと VM はどちらもワークロードを隔離する技術だが、カーネル共有の有無で性能・密度・隔離強度が大きく変わる。用途ごとに使い分ける。 