ウェブサイト検索

エミュレーション、仮想化、そして Docker: それぞれの違いは何ですか?


エミュレーションと仮想化はどちらも同じ目的を達成します—仮想マシン内で別のオペレーティングシステムを実行することです。しかし、それぞれ異なる方法でこれを行い、仮想化が使用できる場合ははるかに速くなります。それでは、Dockerはこれらのすべてにどのようにフィットするのでしょうか?

パフォーマンスの問題

簡単に言うと、エミュレーションは仮想化よりもはるかに遅く、すべてはハードウェアの最適化に帰着します。

エミュレーションは、意図しないホスト上でアプリを実行する最も基本的な形式です。エミュレーターは、ターゲットシステム用に意図されたコマンドを受け取り、それをホストコンピュータが理解し、実行できるものに翻訳します。通常、これにはCPUオペコードとレジスタのエミュレーションが含まれます。良い例は、Nintendo N64のような古いゲームを現代のPC上でエミュレートすることです。PCはN64のゲームを直接実行することはできませんが、エミュレーターはN64用に意図された命令を取り、それをできるだけ完璧に実行することができます。

"エミュレーション"は一般にビデオゲームのエミュレーションを指すために使われますが、ビジネスアプリケーションのためにも同様に頻繁に使われます。例えば、DOSのようなシステム上で動作しなければならない重要なレガシーソフトウェアがある場合、新しいサーバー上のエミュレーターでそれを実行することは、その時代のマシンで実行するよりも容易なことがよくあります。また、古いネットワークコントローラのようなレガシーハードウェアの効果をエミュレートするソフトウェアを指すこともあります。

しかし、エミュレーションは不必要に遅くなることがあります。非常に一般的な利用ケースは、1つのホストオペレーティングシステム上で複数のLinux仮想マシンを実行することです。ホストマシンが仮想マシンと同じである場合、CPU全体を完全にエミュレートするのは、通常通りに実行するのに比べて非常に遅いです。

その代わりに、ほとんどの仮想マシンはハードウェア最適化された仮想化技術を使用します。Intelの場合、この技術はIntel-VTと呼ばれ、AMDの場合はAMD-Vと呼ばれています。どちらもx86アプリケーションの仮想化という同じ目的を達成します。デスクトップコンピュータを使用している場合、デフォルトで有効になっていない場合は、BIOSでこれらを有効にする必要があるかもしれません。

仮想化は、複数の仮想プライベートサーバーを管理する基本的なOSであるハイパーバイザーと組み合わせて使用されることがよくあります。AWSのようなクラウドコンピューティング会社からVPSをレンタルしている場合、それはAWSのNitro、Proxmox、またはHyper-Vのようなハイパーバイザーで動作している可能性が高いです。現代のハイパーバイザーは、ネイティブに非常に近いパフォーマンスを達成することができます(「ベアメタル」とも呼ばれます)。常に少しのオーバーヘッドはありますが、それをエミュレートするよりは良いです。

仮想化は、ほぼ常に同じアーキテクチャを仮想化する場合に最も効果的です。例えば、AMDやIntelのx86 CPUは、標準のWindowsやLinuxのようなx86オペレーティングシステムを仮想化できます。ARM CPUがx86 CPUを仮想化することは技術的には不可能ではありませんが、一般的には行われません。

これは問題になる可能性があります。例えば、Appleの新しいARMベースのMacbookは独自のM1プロセッサーで動作します。x86オペレーティングシステムの仮想化はサポートされていません。他のOSをParallelsのようなプログラムで実行することはできますが、エミュレーションを利用しなければならないため、かなり遅くなります。

したがって、結論として、他のオペレーティングシステムからプログラムを実行する場合は、100%ネイティブスピードに近づくためには、何らかの仮想化を使用していることを確認してください。

Dockerはどのように比較されますか?

Dockerはアプリをコンテナで実行できるようにします。これらのコンテナは、アプリを実行するために必要なすべてのコードを含む孤立したパッケージです。また、非常に安全でもあります。ホストマシンは、複数のDockerコンテナを実行しても、それらがコンテナから脱出したり、お互いに干渉したりする心配はありません。

多くの点で、Dockerは複数のアプリケーションをプライベートなLinux仮想マシンで実行するという同じ正確な目的を達成していますが、内部的には少し異なる方法で動作します。

Dockerはエミュレーションや仮想化を使用しません。すべてのコードはCPUとホストシステム上で直接実行され、仮想化オーバーヘッドはゼロです。コンテナを分離するために、Linuxの名前空間などの機能を巧妙に利用し、プロセスを独自の「コンテナ刑務所」で分離します。刑務所内のプロセスは、自分に割り当てられていないファイルやプロセス、システムリソースを見ることも、相互作用することもできません。

これにより、複数のアプリケーションが一つのホストオペレーティングシステム上で同時に動作できるシステムが実現され、それぞれの仮想プライベートサーバーのために別々のオペレーティングシステムを持つ必要がなくなります。AWSのようなプロバイダーにとって、これは多くのコストを節約します。

仮想化を検討しているが、パフォーマンスについて心配している場合、Dockerはベアメタルでアプリを実行するのと比較してほとんどオーバーヘッドがありません。詳細を学ぶには、始め方に関するガイドをお読みください。

関連記事: