Docker vs 仮想マシン:5分でわかる性能差と選び方

はじめに
先週のミーティングで、上司が突然聞いてきました。「次のプロジェクト、Dockerにするか仮想マシン(VM)にするか、決まった?」
私は3秒ほど固まってしまいました。正直、どちらも使ったことはありますが、「違いを明確に説明しろ」と言われると……。席に戻ってネットで検索してみましたが、出てくるのは「ユーザー空間がどうこう」「cgroupsが……」といった難しい技術用語ばかり。「で、結局どっちがどう速いの?」という知りたい情報が見つかりません。
3日間かけて調べ抜き、ようやく腹落ちしました。今日は、過去の私と同じように迷っているあなたのために、Dockerと仮想マシンの違いを「専門用語なし」で解説します。これを読めば、両者の本質的な違い(すごく分かりやすい例えがあります)、性能差のリアルな数字、そして「どちらを選ぶべきか」の判断基準が分かります。
本質的な違い——コンテナ vs マンション
一番わかりやすい例え話をしましょう。
仮想マシン(VM)は、マンションの「独立した部屋」です。
各部屋にはキッチン、トイレ、水道、電気メーターが個別についています(これがゲストOS)。完全に独立した生活空間です。あなたは201号室、隣の人は202号室。お互いの生活音は聞こえません。それぞれの部屋に「生活に必要な全セット(OS)」が揃っています。
Dockerコンテナは、港の「貨物コンテナ」です。
コンテナの中には荷物(アプリとライブラリ)だけが入っています。クレーン、電力、道路といったインフラ(OSカーネル)は、港(ホストマシン)のものを全員で共有します。コンテナごとに発電機を持ったりはしません。
この違いが、全ての結果に繋がります。
VMの構造的な重さ:
VMには「ゲストOS」と「ハイパーバイザ」という2つの重い荷物があります。ハイパーバイザはCPUやメモリを仮想的に作り出し、その上でゲストOS(WindowsやLinux)をフルセットで動かします。VMを起動するのは、パソコンの電源を入れるのと同じ。OSの読み込み、ドライバのロード、サービスの起動……時間がかかって当然です。
Dockerの軽さ:
DockerはホストマシンのOSカーネルを直接使います。コンテナの起動は、単に「新しいプロセス(アプリ)を立ち上げる」のとほぼ同じです。OSの起動プロセスがないので、一瞬で立ち上がります。
「カーネル共有で大丈夫?」と思うかもしれません。後述しますが、これがDockerの弱点(隔離性がVMより低い)でもあり、最大の強み(爆速・軽量)でもあります。
性能対決——数字は嘘をつかない
理論はいいから、実際の数字を見たいですよね。
起動速度:秒 vs 分
先週テストしました。設定済みの仮想マシン(2コア4メモリ)を起動し、SSHログインできるまでにかかった時間は 約4分 でした。コーヒーを淹れて戻ってきてもまだでした。
同じRedisサービスをDockerで起動したら? 3秒 です。
マウスから手を離す暇もありません。
リソース消費:MB vs GB
もっと衝撃的なのがメモリ消費です。Docker自体のオーバーヘッドは6-8MB程度。
実際にRedisコンテナを走らせてみると、CPU使用率0.08%、メモリ消費2.6MBでした。空気のような軽さです。
一方、仮想マシンは?
中身が空っぽでも、OSを動かすだけで 1-2GB のメモリを食います。MySQL用にVMを立てれば、最低でも4GBは確保するでしょう。
これが何を意味するか。
同じ物理サーバー(32コア128GB)があったとして、VMなら30個も立てればリソース切れです。でもDockerなら、800個以上のコンテナ を余裕で走らせることができます。
生産性が一桁違います。
性能ロス:ほぼネイティブ vs もっさり
ベンチマークによると、Dockerコンテナの性能はネイティブ動作(OS直で動かす場合)とほぼ変わりません。仮想化のオーバーヘッドがないからです。
一方、VMは常にハードウェアをエミュレートしているため、通常 10-20% の性能ロスがあります。
CPUを酷使するコンパイル作業で比較すると:
- 物理マシン:20分
- Docker:21分(ほぼ誤差)
- VM:25分
表でまとめると一目瞭然です。
| 項目 | Dockerコンテナ | 仮想マシン (VMware/VirtualBox) |
|---|---|---|
| 起動時間 | 秒単位(1-5秒) | 分単位(2-5分) |
| メモリ消費 | MB単位(2-50MB) | GB単位(1-4GB〜) |
| 集積密度 | 数百〜数千 | 数十 |
| 性能ロス | 5%未満 | 10-20% |
| イメージサイズ | 数十MB〜数百MB | 数GB〜数十GB |
隔離性とセキュリティ——強ければいいってもんじゃない
ここまでDockerの圧勝に見えますが、VMにも譲れない強みがあります。「隔離性」です。
隔離レベルの違い
VMは「ハードウェアレベル」での隔離です。それぞれのVMが独立したカーネルを持っているので、隣のVMがウイルスに感染しても、システムごとクラッシュしても、基本的には影響を受けません。これは非常に強力な防壁です。
Dockerは「プロセスレベル」の隔離です。LinuxのNamespaceとcgroupsという機能を使って、「お前はここしか見ちゃダメ」「お前はメモリこれしか使うな」と制限しているだけです。カーネルは共有しています。
もしカーネルにバグがあったら? コンテナの中からホストマシンを乗っ取る「コンテナエスケープ(Container Escape)」という攻撃が可能になります(昨年のCVE-2024-21626などが有名)。
VMが必須なシーン
- クラウド事業者:AWSやGoogle Cloudは、裏でVMを使っています。見ず知らずの他人のシステムと同じカーネルを共有なんて、怖くてできませんよね。
- 高セキュリティ要件:金融機関や政府系システムなど、絶対的な隔離が求められる場合。
- 危険なコードの実行:ユーザーが投稿した任意のコードを実行するようなサービス(オンラインコンパイラなど)。
Dockerのセキュリティ対策
とはいえ、社内利用ならDockerで十分安全です。
- rootで動かさない:コンテナ内でお行儀よく一般ユーザーを使う。
- 権限を絞る:不要な特権(Capabilities)を与えない。
- 脆弱性スキャン:Trivyなどで定期的にイメージを検査する。
私たちチームも2年間Dockerを使っていますが、この3点を守ることでセキュリティ事故はゼロです。
どっちを選ぶ?——究極の二択チャート
迷ったら、このチャートに当てはめてみてください。
Dockerを選ぶべき4つのシーン
マイクロサービス
サービスを細かく分割するならDocker一択。サービスごとにVMを立てていたら、リソースがいくらあっても足りません。私の関わったプロジェクトでは、30個のマイクロサービスをVMからDockerに移行して、サーバーコストを1/3に削減しました。CI/CD と DevOps
「私の環境では動くのに!」問題を根絶したいならDocker。開発・テスト・本番、全ての環境を同じイメージで統一できます。Jenkinsでテストを回す時も、コンテナなら数秒でクリーンな環境を用意できます。急激なアクセス増への対応(オートスケール)
「今すぐサーバー10台増やして!」と言われて、VMなら50分かかります。Docker(Kubernetes)なら数秒です。このスピード感はビジネスの武器になります。開発環境の統一
チーム内でMac、Windows、Linuxが混在しているなら、docker-compose up一発で全員同じ環境が手に入ります。
VMを選ぶべき4つのシーン
古いモノリシックなシステム(レガシー)
10年前のJavaシステム、CentOS 6でしか動かない……みたいな遺産。下手にコンテナ化するより、現状のままVMに閉じ込めるのが正解です。OSが混在する環境
WindowsアプリとLinuxアプリを同時に動かしたい。Dockerは基本Linux向け(Windowsコンテナもあるが茨の道)なので、VMで分けるのが無難です。強固な隔離が必要
前述の通り、セキュリティ最優先の場合。OS深部の開発
カーネルモジュールの開発や、特定のハードウェア挙動をシミュレートしたい場合。
結論:混ぜて使うのが賢い
実際の現場では、0か100かではありません。
私の会社ではこうしています:
- 基幹DB(Oracle):VMでどっしり構える。安定性重視。
- Webアプリ・API:Docker + K8s。スピードと効率重視。
- 開発環境:Docker。
適材適所。これがプロの選択です。
決定版:選択フローチャート
あなたのプロジェクトは?
├─ 新規開発?
│ ├─ はい → マイクロサービス?
│ │ ├─ はい → 【Docker】 ✅
│ │ └─ いいえ → 頻繁に更新・デプロイする?
│ │ ├─ はい → 【Docker】 ✅
│ │ └─ いいえ → どちらでもOK
│ └─ いいえ(既存システムの移行)
│ ├─ 特定の古いOSが必要? → 【VM】 ✅
│ └─ コンテナ化できそう? → 【Docker】 ✅
│
├─ OS要件は?
│ ├─ Linuxのみ → 【Docker】
│ └─ Windows/Linux混在 → 【VM】 ✅
│
└─ セキュリティ要件は?
├─ 他社システムと同居(マルチテナント) → 【VM】 ✅
└─ 自社専用 → 【Docker】実際のところ、みんなどうしてる?
事例をいくつか紹介します。
事例1:スタートアップ(SaaS企業)
予算がないので、Docker全振り。3台の安いサーバーにKubernetesを入れ、60以上のコンテナを詰め込んで運用。VMだったらサーバー代が3倍かかっていたはず。
事例2:伝統的な製造業
基幹システム(SAP)はVMで塩漬け。新しく作る在庫管理アプリだけDockerで開発。いわゆる「バイモーダルIT(2つの流儀の共存)」です。
事例3:クラウドホスティング会社
顧客ごとに完全に隔離された環境を提供する必要があるため、KVM(仮想マシン)を採用。コストよりセキュリティと契約上の「独立性」を重視。
まとめ
Dockerと仮想マシン、どっちが優れているか? 答えは「用途による」です。
- 新しく作る、速く動かす、効率重視 → Docker
- 古くからある、重厚長大、隔離重視 → 仮想マシン
もしあなたがこれから新しいWebサービスを作るなら、迷わずDockerから始めてください。その軽快さは、一度味わうと戻れません。逆に、古いシステムを無理にコンテナ化して泥沼にハマるくらいなら、VMでそっとしておくのも勇気ある決断です。
ツールに使われるのではなく、ツールを使いこなすエンジニアになりましょう。
FAQ
Dockerと仮想マシンの決定的な違いは何ですか?
Dockerを使うとどれくらい速くなりますか?
Dockerのセキュリティは安全ですか?
WindowsアプリはDockerで動かせますか?
5 min read · 公開日: 2025年12月17日 · 更新日: 2026年1月22日
関連記事
Next.js ファイルアップロード完全ガイド:S3/Qiniu Cloud 署名付き URL 直接アップロード実践

Next.js ファイルアップロード完全ガイド:S3/Qiniu Cloud 署名付き URL 直接アップロード実践
Next.js Eコマース実践:カートと Stripe 決済の完全実装ガイド

Next.js Eコマース実践:カートと Stripe 決済の完全実装ガイド
Next.js ユニットテスト実践:Jest + React Testing Library 完全設定ガイド


コメント
GitHubアカウントでログインしてコメントできます