ホストOSのカーネルを共有して軽量にアプリ環境を隔離する仮想化方式。
コンテナ型仮想化とは、ホストOSのカーネルを共有しながら、アプリと依存ライブラリ(アプリが動くのに必要な部品)だけをひとまとめにして隔離する方式です。この「まとまり」をコンテナと呼びます。代表的なソフトはDockerです。
ここでカーネルとは「OSの中核となる、ハードウェアを動かす土台部分」のことです。コンテナ型では、このカーネルを全コンテナで共有するのが最大のポイントです。
身近な例で考えると、大部屋の中をパーティション(仕切り)で区切って各人のブースを作るイメージです。建物の床や空調(カーネル)は全員で共有しつつ、自分の机まわり(アプリとライブラリ)だけは独立して使えます。
コンテナが軽い理由は、1つ1つがゲストOSを持たないことにあります。OSはサイズが大きく起動にも時間がかかりますが、その部分をホストと共有するため、次のような利点が生まれます。
・起動が速い:OSを立ち上げる必要がないため、数秒で起動できます
・サイズが小さい:OSを含まないぶん、コンテナのデータが小さくなります
・多数を集約できる:1台のサーバに、より多くのコンテナを詰め込めます
仮想マシンが「家具つきの一軒家を丸ごと建てる」のに対し、コンテナは「すでにある建物に荷物だけ持ち込む」イメージです。持ち込む荷物(アプリとライブラリ)が少ないほど、出し入れが速いわけです。
コンテナと仮想マシン(VM)の一番の違いは、ゲストOSを持つかどうかです。VMは各々がゲストOSを持つため重い反面、OSごと分かれているので隔離が強く、コンテナはOSを共有して軽い反面、隔離はVMより弱くなります。
| 項目 | コンテナ型 | VM(仮想マシン)型 |
|---|---|---|
| ゲストOS | 無し(カーネル共有) | 各VMにあり |
| 起動速度 | 速い(秒単位) | 遅い(分単位) |
| サイズ | 小さい | 大きい |
| 隔離レベル | やや弱い | 強い |
| 代表例 | Docker | VMware / Hyper-V |
どちらが優れているということはなく、軽さ・速さを重視するならコンテナ、強い隔離やOSごとの独立が必要ならVMという使い分けになります。1台のサーバでVMを動かし、その中でさらにコンテナを動かすといった組み合わせもよく行われます。
コンテナを理解する上で重要な概念が「コンテナイメージ」です。イメージとは、アプリとそれが動くのに必要なライブラリ(部品)・設定をまとめた「設計図」のことです。この設計図から実際に動かせる「コンテナ(実体)」を生み出します。
なぜどこでも同じように動くのか。イメージの中に必要な部品がすべて同梱されているからです。「私のパソコンでは動くのに本番サーバでは動かない」という問題が起きやすい理由は、環境(インストールされているライブラリのバージョンなど)が違うためです。コンテナはアプリと部品をセットで梱包するので、どの環境にイメージを持っていっても同じ結果が得られます。
身近な例で考えると、料理の「ミールキット」に似ています。食材・調味料・レシピがセットになっているので、どの台所(環境)でも同じ料理(アプリ)が完成します。「食材が足りない」「バージョンが違う」という心配がなくなるのです。
コンテナの「軽い・速い・どこでも同じ結果」という特性は、特に次のような場面で力を発揮します。
・開発環境の統一:チーム全員が同じコンテナイメージを使うことで、「自分の環境では動く」問題がなくなる
・CI/CD(自動テスト・自動デプロイ):コードを変更するたびにコンテナを素早く起動してテストを走らせ、問題があればすぐ検知できる
・クラウドへの大量展開:需要が増えたとき、同じコンテナイメージを数十・数百個まとめて起動してスケールアウトできる
現代のWebサービス(ネットショッピング・動画配信など)の多くがこの仕組みで動いています。Kubernetes(クバネティス)という、コンテナを自動で管理・増減する仕組みもよく使われますが、まずは「コンテナ=ゲストOS無しの軽い実行単位」「Docker=代表的なコンテナエンジン」を押さえておきましょう。
Q1. コンテナ型仮想化の説明として最も適切なものはどれか。
Q2. コンテナが仮想マシン(VM)より軽量である理由として正しいものはどれか。
Q3. コンテナ型と仮想マシン(VM)型の違いとして正しいものはどれか。