
仮想化とコンテナ化の主な違いは何ですか?また、それぞれのテクノロジーは何に使用されますか?
仮想化 (VM)。 仮想マシンは物理ハードウェアを抽象化したもので、1 つのサーバーを多数のサーバーに変換します。 ハイパーバイザはホストと VM の間に位置し、CPU、メモリ、ストレージをプールします。各 VM には、ゲスト OS の完全なコピー に加えて、アプリケーションとすべてのライブラリが含まれています。ハイパーバイザー (VMM) は分離を強制し、その境界は CPU 仮想化拡張機能 (Intel VT-x / AMD-V) によってハードウェア支援されます。
ハイパーバイザーには 2 つのタイプがあります。
- タイプ 1 (ベアメタル): はハードウェア上で直接実行されます。クリーンな例としては、VMware ESXi/vSphere、Microsoft Hyper-V、Xen などがあります。 KVM はハイブリッド ケースです。ホストが通常のプロセスを実行しながら、カーネルをタイプ 1 ハイパーバイザーに変える Linux カーネル モジュールです。
- タイプ 2 (ホスト型): 従来の OS (VirtualBox、VMware Workstation) 上でアプリケーションとして実行されます。個人のマシンに適しています。
コンテナ化。 コンテナはコードとそのすべての依存関係 (ランタイム、ライブラリ、設定) をパッケージ化し、ハードウェアではなく オペレーティング システムを仮想化します。コンテナは ホスト OS カーネルを共有し、ユーザー空間で分離されたプロセスとして実行されます。 Linux では、これは 名前空間 (分離) と cgroups (リソース アカウンティングと制限) を使用し、機能、seccomp、MAC (SELinux/AppArmor)、ユーザー名前空間、ルートレス モード によってさらに強化されます。カーネル共有は OS ファミリの互換性を意味します。Linux コンテナには Linux カーネルが必要であるため、Windows/macOS 上の Docker Desktop は軽量の Linux VM を静かに実行します。 Docker はコンテナを普及させましたが、形式は OCI によって標準化されています。他のランタイム (containerd、CRI-O、Podman) も存在します。
主な違い:
- サイズ: コンテナ イメージは通常、数 MB から数百 MB です。 VM は GB です (固定された数ではなく、桁数を例示したものです)。
- 起動: コンテナは秒/ミリ秒で起動します。 VM は完全な OS を起動する必要があります。
- オーバーヘッド: コンテナーはアプリごとに個別の OS を必要としません。高密度でライセンス コストが低くなります。
- 分離/セキュリティ: VM は、より強力なハードウェア ベースの分離を提供します。コンテナは、より弱いソフトウェアベースの分離を提供します (コンテナが共有カーネルから逃れるリスク)。中間点は、VM レベルの分離に近づくサンドボックス ランタイム (gVisor、Kata Containers、Firecracker) です。
それぞれの用途:
- VM: 1 台のサーバー上で異なる OS を実行し、リソースを大量に消費するワークロードまたはモノリシックなワークロード、および強力な分離 (マルチテナンシー、レガシー アプリ)。
- コンテナ: クラウドネイティブ開発、マイクロサービス、CI/CD、移植性、高速水平スケーリング (Kubernetes によって調整)。
実際には、この 2 つは補完的です。コンテナは多くの場合、アジャイルな配信と強力な分離を組み合わせるために VM 内で実行されます。
