コンテナと仮想マシンの違いとは?「一戸建てとマンションの一室」でたとえてみる

IT資格

「コンテナ」と「仮想マシン」。クラウドの学習を進めると必ず並んで出てくるが、どちらも「1台のサーバーの中に、独立した環境をいくつも作る技術」と説明されるので、違いがつかみにくい。編集部で公式資料を読み比べてみると、分かれ目は意外と一点に絞れた。「OSを環境ごとに丸ごと持つのか、みんなで共有するのか」である。

まず結論:コンテナと仮想マシンは「どこから下を共有するか」が違う

  • 仮想マシン:ハードウェアを仮想化する。環境ごとにOS(ゲストOS)を丸ごと持つので、独立性が高いぶん重い
  • コンテナ:OSを仮想化する。ホストOSの中核(カーネル)を共有し、アプリと必要な部品だけを包むので、軽くて起動が速い
  • どちらが上位という関係ではなく、仮想マシンの上でコンテナを動かす組み合わせも一般的
コンテナと仮想マシンの違いとは?「一戸建てとマンションの一室」でたとえてみる 図解
図解:コンテナと仮想マシンの違いをひと目で比較

仮想マシンとは?――土地も設備も自前で持つ「一戸建て」のようなもの

仮想マシン(VM:Virtual Machine)は、1台の物理的なコンピューターの上に、ソフトウェアで作り出した「もう1台のコンピューター」のこと。CPU・メモリ・ディスクといったハードウェアを、ハイパーバイザーと呼ばれるソフトウェアが分割して、それぞれの仮想マシンに割り当てる。

ポイントは、仮想マシンの1台1台が自分専用のOSを持つこと。このOSを「ゲストOS」と呼ぶ。物理サーバー側のOSがLinuxでも、仮想マシンの中ではWindowsを動かす、といった使い方ができるのはこのためだ。

たとえるなら一戸建て。玄関も水道も電気の配線も、家ごとにすべて自前で持っている。隣の家と共有しているものが少ないので、隣で何が起きても影響を受けにくい。そのかわり、1軒建てるのに土地も資材も時間もかかる。仮想マシンも同じで、環境ごとにOSを丸ごと抱えるぶん、ディスク容量を使い、起動にも時間がかかる。

コンテナとは?――建物の設備を共有する「マンションの一室」のようなもの

コンテナは、アプリケーションと、その動作に必要なライブラリや設定をひとまとめに包み、ほかから隔離された状態で動かす技術。米国の国立標準技術研究所(NIST)の文書SP 800-190は、コンテナを「OSの仮想化とアプリケーションのパッケージ化を組み合わせたもの」と説明している。

仮想マシンとの決定的な違いは、コンテナが自分専用のOSを丸ごとは持たないこと。OSの中核部分である「カーネル」は、ホストOSのものを全コンテナで共有する。Docker社の公式解説でも、コンテナは同じマシン上でOSカーネルを共有し、それぞれが隔離されたプロセスとして動くと説明されている。

こちらはマンションの一室にあたる。部屋ごとに鍵がかかり、中の家具や間取りは住人が自由に決められるが、建物の基礎、給水管、エレベーターは全戸で共有している。一から家を建てる必要がないので、入居までが速く、同じ敷地にたくさんの世帯が住める。コンテナが「軽い」「起動が速い」と言われる理由は、まさにこの共有にある。

「コンテナと仮想マシンの違い」を住まいのたとえでわかりやすく解説

観点仮想マシンコンテナ
住まいのたとえ設備をすべて自前で持つ一戸建て建物の設備を共有するマンションの一室
仮想化する対象ハードウェアOS
OSの持ち方環境ごとにゲストOSを丸ごと持つホストOSのカーネルを共有する
土台になるソフトウェアハイパーバイザーコンテナエンジン(コンテナランタイム)
サイズの目安数十GBになることがある数十MB程度に収まることが多い
起動の速さOSの起動を伴うので時間がかかるプロセスの起動に近く、速い
環境どうしの独立性高い(OSごと分かれている)仮想マシンよりは低い(カーネルが共通)
異なるOSの同居できる(LinuxとWindowsなど)原則としてホストと同じ系統のOSに限られる
代表的な製品・技術VMware ESXi、Hyper-V、KVMDocker、containerd、Kubernetes(管理基盤)

サイズの目安は、Docker社の公式解説にある「コンテナイメージは通常数十MB、仮想マシンは数十GBを占めることがある」という記述に基づいている。実際の大きさは中に入れるものによって変わるため、あくまで桁の違いとして捉えてほしい。

なぜ仮想マシンだけではダメなのか?そして、なぜコンテナだけでも足りないのか?

仮想マシンは独立性が高く、長年サーバーの集約に使われてきた。それでもコンテナが広まったのは、アプリケーションの開発と配布のやり方が変わったからだと編集部では考えている。

小さなアプリケーションを数多く動かしたい場面で、ひとつひとつにOSを丸ごと用意するのは無駄が大きい。家族1人のために毎回一戸建てを建てるようなものだ。コンテナなら、同じサーバー上により多くの環境を詰め込める。さらに、アプリと必要な部品を1つの「イメージ」にまとめて持ち運べるため、「開発者のパソコンでは動いたのに、本番サーバーでは動かない」という食い違いが起きにくい。

では、すべてコンテナにすればよいかというと、そうでもない。注意点は2つある。

1つ目は独立性。コンテナはカーネルを共有しているため、カーネルに問題が起きると、同じホスト上のすべてのコンテナが影響を受けるリスクがある。マンションで給水管が止まれば全戸が困るのと同じ構図だ。利用者の異なる環境を厳密に分けたい場合は、仮想マシンのほうが向いている。

2つ目はOSの種類。コンテナはホストのカーネルを使うので、Linux用のコンテナはLinuxのカーネルの上でしか動かない。WindowsやmacOSのパソコンでLinuxコンテナを動かせるDocker Desktopは、内部で軽量なLinux仮想マシンを動かし、その上でコンテナを実行している。

実際の現場では「どちらか」ではなく「両方」が多い。クラウドで借りた仮想マシンの上にコンテナを並べる構成は、ごく一般的だ。土地の区画を仮想マシンで分け、その区画に建てたマンションの各部屋をコンテナにする、と考えるとイメージしやすい。

コンテナでアプリが動くまでのステップ

ステップ内容
1. 設計図を書くアプリの動作に必要なものを、Dockerfileなどの定義ファイルに書く
2. イメージを作る定義ファイルをもとに、アプリと部品をまとめた「イメージ」を組み立てる(ビルド)
3. イメージを保管する作ったイメージを「レジストリ」と呼ばれる保管場所に登録する
4. コンテナとして起動する動かしたいサーバーがイメージを取得し、コンテナとして実行する
5. まとめて管理するコンテナの数が増えたら、Kubernetesなどの管理基盤で配置や台数の調整を自動化する

「イメージ」は部屋の設計図と家具一式のセット、「コンテナ」はそれをもとに実際に用意された部屋、と区別しておくと混乱しない。1つのイメージから、同じ中身のコンテナをいくつでも起動できる。

まとめ:3行で理解するコンテナと仮想マシン

仮想マシンはハードウェアを仮想化し、環境ごとにOSを丸ごと持つ一戸建て。コンテナはOSを仮想化し、カーネルを共有するマンションの一室。独立性を取るなら仮想マシン、軽さと速さを取るならコンテナで、両者は組み合わせて使われる。迷ったら「OSは誰のものを使っているか」と自分に問いかけてみてほしい。そこが答えられれば、この2つはもう混同しない。

よくある質問

Q1. DockerとKubernetesは何が違うのですか?

役割が違う。Dockerは、コンテナのイメージを作り、コンテナを起動するための道具。Kubernetesは、多数のコンテナを複数のサーバーにまたがって配置し、台数の増減や、止まったコンテナの再起動などを自動で行う管理基盤にあたる。マンションのたとえで言えば、Dockerが部屋を用意する仕組み、Kubernetesが多数の部屋をまとめて面倒を見る管理会社という関係だ。

Q2. コンテナは仮想マシンより安全性が低いのですか?

一概に低いとは言えないが、独立性の強さは仮想マシンのほうが上と考えるのが基本。コンテナはカーネルを共有するため、設定が不適切だと、ほかのコンテナやホストに影響が及ぶリスクがある。NISTのSP 800-190は、コンテナを安全に運用するための注意点として、イメージの管理、レジストリの保護、コンテナに与える権限を必要最小限にすることなどを挙げている。使う技術の優劣というより、特性を理解して設定することが大切だ。

Q3. ハイパーバイザーの「タイプ1」「タイプ2」とは何ですか?

ハイパーバイザーの動かし方の違いを表す。タイプ1(ベアメタル型)は、物理サーバーに直接ハイパーバイザーを入れ、その上で仮想マシンを動かす方式で、サーバー用途で広く使われる。タイプ2(ホスト型)は、WindowsやmacOSなど通常のOSの上にアプリケーションとしてハイパーバイザーを入れる方式で、手元のパソコンで別のOSを試したいときに向いている。

Q4. 資格試験では、コンテナと仮想マシンはどう問われますか?

基本情報技術者試験や応用情報技術者試験では、仮想化の方式の違いを選ばせる形が中心。「ゲストOSを必要とするのはどれか」「ホストOSのカーネルを共有するのはどれか」といった観点で整理しておくと対応しやすい。クラウド系の資格(AWSやAzureの入門資格など)では、仮想マシンのサービスとコンテナのサービスを用途に応じて選び分ける問題につながるので、この記事の比較表の「OSの持ち方」の行を軸に覚えておきたい。

参考:NIST SP 800-190「Application Container Security Guide」

参考:Docker「What is a Container?」

コメント

タイトルとURLをコピーしました