言語を切り替える
テーマを切り替える

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

はじめに

先週のミーティングで、上司が突然聞いてきました。「次のプロジェクト、Dockerにするか仮想マシン(VM)にするか、決まった?」

私は3秒ほど固まってしまいました。正直、どちらも使ったことはありますが、「違いを明確に説明しろ」と言われると……。席に戻ってネットで検索してみましたが、出てくるのは「ユーザー空間がどうこう」「cgroupsが……」といった難しい技術用語ばかり。「で、結局どっちがどう速いの?」という知りたい情報が見つかりません。

3日間かけて調べ抜き、ようやく腹落ちしました。今日は、過去の私と同じように迷っているあなたのために、Dockerと仮想マシンの違いを「専門用語なし」で解説します。これを読めば、両者の本質的な違い(すごく分かりやすい例えがあります)、性能差のリアルな数字、そして「どちらを選ぶべきか」の判断基準が分かります。

3秒
Docker起動
VMは4分
800+
収容密度
32コア128GBサーバーでのコンテナ数
5%未満
性能ロス
VMは10-20%のロス
数据来源: 実測データ

本質的な違い——コンテナ 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個以上のコンテナ を余裕で走らせることができます。
生産性が一桁違います。

800+
コンテナ収容数
来源: 32コア128GBサーバー実測

性能ロス:ほぼネイティブ 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で十分安全です。

  1. rootで動かさない:コンテナ内でお行儀よく一般ユーザーを使う。
  2. 権限を絞る:不要な特権(Capabilities)を与えない。
  3. 脆弱性スキャン:Trivyなどで定期的にイメージを検査する。

私たちチームも2年間Dockerを使っていますが、この3点を守ることでセキュリティ事故はゼロです。

どっちを選ぶ?——究極の二択チャート

迷ったら、このチャートに当てはめてみてください。

Dockerを選ぶべき4つのシーン

  1. マイクロサービス
    サービスを細かく分割するならDocker一択。サービスごとにVMを立てていたら、リソースがいくらあっても足りません。私の関わったプロジェクトでは、30個のマイクロサービスをVMからDockerに移行して、サーバーコストを1/3に削減しました。

  2. CI/CD と DevOps
    「私の環境では動くのに!」問題を根絶したいならDocker。開発・テスト・本番、全ての環境を同じイメージで統一できます。Jenkinsでテストを回す時も、コンテナなら数秒でクリーンな環境を用意できます。

  3. 急激なアクセス増への対応(オートスケール)
    「今すぐサーバー10台増やして!」と言われて、VMなら50分かかります。Docker(Kubernetes)なら数秒です。このスピード感はビジネスの武器になります。

  4. 開発環境の統一
    チーム内でMac、Windows、Linuxが混在しているなら、docker-compose up 一発で全員同じ環境が手に入ります。

VMを選ぶべき4つのシーン

  1. 古いモノリシックなシステム(レガシー)
    10年前のJavaシステム、CentOS 6でしか動かない……みたいな遺産。下手にコンテナ化するより、現状のままVMに閉じ込めるのが正解です。

  2. OSが混在する環境
    WindowsアプリとLinuxアプリを同時に動かしたい。Dockerは基本Linux向け(Windowsコンテナもあるが茨の道)なので、VMで分けるのが無難です。

  3. 強固な隔離が必要
    前述の通り、セキュリティ最優先の場合。

  4. 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と仮想マシンの決定的な違いは何ですか?
最大の違いは「OS(カーネル)を共有するかどうか」です。仮想マシンはそれぞれが個別のOSを持つ「一軒家」のようなもので重厚ですが、DockerはホストのOSを共有する「シェアハウスの個室」のようなもので、圧倒的に軽量・高速です。
Dockerを使うとどれくらい速くなりますか?
起動速度は分単位から秒単位になります。リソース効率も劇的に改善し、同じサーバーで動かせるアプリの数が数倍から数十倍に増えます。ただし、CPU処理能力そのものが速くなるわけではありません(オーバーヘッドが減るだけです)。
Dockerのセキュリティは安全ですか?
仮想マシンに比べると隔離レベルは低いですが、適切な設定(非root化、権限制限、脆弱性スキャン)を行えば、一般的な企業内利用においては十分安全です。ただし、不特定多数のユーザーコードを実行するような環境には向きません。
WindowsアプリはDockerで動かせますか?
Dockerは基本的にLinuxの技術です。Windowsコンテナも存在しますが、多くの制限があり主流ではありません。WindowsとLinuxを混在させたい場合は、仮想マシンを使うのが無難な選択です。

5 min read · 公開日: 2025年12月17日 · 更新日: 2026年1月22日

コメント

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

関連記事