コンテナーと仮想マシンの比較

コンテナーと仮想マシン (VM) の違い、それぞれの一般的なプロバイダー、それらを併用する方法について確認します。

Ian Buchanan Ian Buchanan

コンテナーと VM は、非常に類似したリソース仮想化テクノロジーです。仮想化とは、RAM、CPU、ディスク、ネットワークなどのシステムの単一リソースを「仮想化」して、複数のリソースとして表現できるプロセスです。コンテナーと VM を区別できる主な点は、VM はマシン全体をハードウェア階層まで仮想化して、コンテナーはオペレーティング システム レベル上のソフトウェア階層のみを仮想化することです。

仮想マシンとコンテナーの違いを示すコンテナー。

コンテナーとは何か

コンテナーは軽量ソフトウェア パッケージで、そこに含まれているソフトウェア アプリケーションの実行に必要なすべての依存関係が組み込まれています。これらの依存関係には、システム ライブラリ、外部サードパーティ コード パッケージ、その他のオペレーティング システム レベルのアプリケーションなどが含まれます。コンテナーに含まれる依存関係は、オペレーティング システムよりも高いスタック レベルに存在します。

メリット

  • イテレーション速度
    コンテナーは軽量で複雑ではないソフトウェアのみを含むため、非常に高速な変更や反復処理が可能です。
  • 堅牢なエコシステム
    ほとんどのコンテナー ランタイム システムでは、事前に作成されたコンテナーのホスト型のパブリック リポジトリを提供しています。これらのコンテナー リポジトリにはデータベースやメッセージング システムなどの一般的なソフトウェア アプリケーションが多数含まれており、すぐにダウンロードして実行できるため開発チームの時間を節約できます。

デメリット

  • 共有ホストの不正アクセス
    コンテナーはすべて、オペレーティング システム レイヤーの下にある同じ基盤となるハードウェア システムを共有しています。あるコンテナー内の不正アクセスが他のコンテナーを突破して、共有ハードウェアに影響する可能性があります。最もよく使用されるコンテナー ランタイムには、ビルド済みのコンテナーのパブリック リポジトリがあります。いずれかのパブリック イメージの使用には不正アクセスが含まれたり悪質なアクターによってハイジャックされる恐れがあったりするため、セキュリティ上のリスクが伴います。

一般的なコンテナー プロバイダー

  • Docker
    Docker は、最も一般的で広く使用されているコンテナー ランタイムです。Docker Hub は、コンテナー化された一般的なソフトウェア アプリケーションの巨大なパブリック リポジトリです。Docker Hub 上のコンテナーは、ローカルの Docker ランタイムに即座にダウンロードしてデプロイできます。
  • RKT
    「ロケット」と呼ばれる RKT は、セキュリティを第一とするコンテナー システムです。RKT コンテナーでは、ユーザーが安全でないフィーチャーを明示的に有効にしない限り、安全でないコンテナー機能は許可されません。RKT コンテナーの目的は、他のコンテナー ランタイム システムが抱える根本的なクロス コンタミネーションによるセキュリティ問題に対処することです。
  • Linux コンテナー - LXC
    LXC は、オープン ソース Linux コンテナー ランタイム システムのコンポーネントの 1 つです。LXC は、オペレーティング システム レベルのプロセスを互いに分離するために使用されます。実際に、Docker は背後で LXC を使用しています。Linux コンテナーの目的は、ベンダー ニュートラルなオープン ソース コンテナー ランタイムを提供することです。
  • CRI-O
    CRI-O は新しいオープン ソース コンテナー ランタイム標準で、多くのエンタープライズ企業がコラボレーションして開発しています。CRI-O 規格は Kubernetes コンテナー管理システム用に最適化されています。

仮想マシンとは何か

VM は重量ソフトウェア パッケージで、CPU、ディスク、ネットワーキングの各デバイスなどの低レベルのハードウェア デバイスを完全にエミュレートします。また、エミュレートされたハードウェアで実行するための補完的なソフトウェア スタックを含められます。これらのハードウェア パッケージとソフトウェア パッケージを組み合わせると、コンピューティング システムの完全な機能のスナップショットが生成されます。

メリット

  • 完全な隔離セキュリティ
    VM は、完全にスタンドアロン システムとして独立して実行されます。つまり、共有ホスト上の他の VM からの不正アクセスや干渉の影響を受けません。それでも、個々の VM が不正アクセスによってハイジャックされる可能性はありますが、悪用された VM が隔離されるため他の隣接する VM は汚染されません。
  • インタラクティブ開発
    コンテナーは通常、コンテナーの実行のために想定される依存関係と構成の静的な定義です。VM は動的であり、対話形式で開発できます。VM に基本的なハードウェア定義を指定すると、その VM は必要最小限のコンピューターとして扱われます。ソフトウェアは VM に手動でインストールして、その VM のスナップショットを撮って現在の構成状態をキャプチャできます。VM スナップショットは、VM をその時点に復元したりその構成で追加の VM を起動したりする場合などに使用できます。

デメリット

  • イテレーション速度
    VM はフル スタック システムを含むため、ビルドと再生成に時間がかかります。VM スナップショットに対する変更は、想定通りに動作するかを再生成して検証するためにかなりの時間がかかる場合があります。
  • ストレージ サイズのコスト
    VM の占有するストレージ領域が大きくなり、すぐに数ギガバイトにも達することがあります。そのため、VM ホスト マシンでディスク領域不足の問題が発生する可能性があります。

一般的な VM プロバイダー

  • VirtualBox
    VirtualBox は、Oracle が所有する無料のオープン ソースの x86 アーキテクチャ エミュレーション システムです。VirtualBox は、VM イメージを開発して配布する際に役立つ補足ツールのエコシステムで確立された、最も一般的な VM プラットフォームの 1 つです。
  • VMware
    VMware は、最初の x86 ハードウェア仮想化テクノロジーの 1 つについてビジネスを展開した上場企業です。VMware には、複数の VM をデプロイして管理するユーティリティであるハイパーバイザーが付属しています。VMware には、VM を管理するための堅牢な UI があります。VMware は、サポートを提供する優れたエンタープライズ VM オプションです。
  • QEMU
    QEUM は最も堅牢なハードウェア エミュレーションの VM オプションで、汎用ハードウェア アーキテクチャをサポートしています。QEMU はコマンド ラインのみのユーティリティであり、構成や実行のためのグラフィカル ユーザー インターフェイスはありません。このために、QEMU は最速の VM オプションの 1 つに挙げられています。

自分に適したオプションはどれか

プロジェクトに特定のハードウェア要件がある、またはあるハードウェア プラットフォームで開発を進めていて Windows と MacOS のような別のプラットフォームをターゲットにする必要がある場合は、VM を使用する必要があります。その他のほとんどの「ソフトウェアのみ」の要件には、コンテナーを使用すれば対応できます。

コンテナーと VM を併用するにはどうすればよいか

コンテナーと VM を統一して使用することは十分可能ですが、実際のユース ケースには制限があります。VM は独自のハードウェア構成をエミュレートするように作成できて、オペレーティング システムはこの VM のハードウェア内にインストールできます。VM が機能してオペレーティング システムが起動したら、コンテナー ランタイムをオペレーティング システムにインストールできます。この時点で、エミュレートされたハードウェアを備えたコンピューター システムが機能して、コンテナーをそこにインストールできます。

この構成の実用的な用途の 1 つは、システム オン チップのデプロイを実験することです。Raspberry Pi 開発ボードや BeagleBone 開発ボードのような一般的なシステム オン チップのコンピューター デバイスを VM としてエミュレートして、実際のハードウェアでテストする前にコンテナーを実行してみれます。

しかし、大体はニーズはそのいずれかで満たされます。仮想化のニーズに合わせてコンテナーまたは VM を決定する上で重要なのは、リソースのニーズと実際に必要となるメリットとデメリットを理解することです。