技術ノート プログラミング エミュレーション、仮想化、Docker: 違いは何ですか?

エミュレーション、仮想化、Docker: 違いは何ですか?

エミュレーション、仮想化、Docker: 違いは何ですか?

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

パフォーマンスの問題

エミュレーション、仮想化、Docker: 違いは何ですか?

簡単に言うと、エミュレーションは仮想化よりもはるかに遅いということですが、それはすべてハードウェアの最適化にかかっています。

エミュレーション、仮想化、Docker: 違いは何ですか?

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

エミュレーション、仮想化、Docker: 違いは何ですか?

「エミュレーション」は一般的にビデオ ゲームのエミュレーションを指すのに使用されますが、ビジネス アプリケーションでも同様によく使用されます。たとえば、DOS などのシステム上で実行する必要があるレガシー ソフトウェアの重要な部分があるとします。新しいサーバー上のエミュレーターで実行するほうが、当時のマシンで実行するより簡単な場合があります。また、古いネットワーク コントローラーのエミュレーションなど、レガシー ハードウェアの効果をエミュレートするソフトウェアを指すこともあります。

エミュレーション、仮想化、Docker: 違いは何ですか?

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

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

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

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

これは、 独自の M1 プロセッサで動作する Apple の新しい ARM ベースの Macbook の場合と同様に、問題となる可能性があります。 x86 オペレーティング システムの仮想化はサポートされていません。 Parallels などのプログラムを使用して他の OS を実行することはできますが、エミュレーションを使用する必要があるため、速度は大幅に遅くなります。

結論として、別のオペレーティング システムからプログラムを実行する場合、100% に近いネイティブ速度を達成するには、ある種の仮想化を使用して実行する必要があります。

エミュレーション、仮想化、Docker: 違いは何ですか?

Docker との比較は?

Docker を使用すると、コンテナ内でアプリを実行できます。コンテナとは、アプリの実行に必要なすべてのコードが含まれる分離されたパッケージです。また、非常に安全です。ホスト マシンは、複数の Docker コンテナを、コンテナから飛び出したり、相互に干渉したりすることを心配せずに実行できます。

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

Docker はエミュレーションや仮想化を使用しません。すべてのコードを CPU およびホスト システム上で直接実行し、仮想化オーバーヘッドはゼロです。コンテナを分離するために、プロセスを独自の「コンテナ ジェイル」に分離できる機能の中でも、 Linux 名前空間 を巧みに利用します。ジェイル内のプロセスは、割り当てられていないファイル、プロセス、またはシステム リソースを表示したり、それらと対話したりすることはできません。

これにより、仮想プライベート サーバーごとに個別のオペレーティング システムのオーバーヘッドを発生させることなく、1 つのホスト オペレーティング システム上で複数のアプリを並行して実行できるシステムが実現します。 AWS のようなプロバイダーにとって、これは大幅なコストの節約になります。

仮想化を検討しているがパフォーマンスが心配な場合は、ベアメタル上でアプリを実行する場合と比較して、Docker にはオーバーヘッドがほとんどありません。 ください。

「エミュレーション、仮想化、Docker: 違いは何ですか?」に関するベスト動画選定!

【初めてのDocker】コンテナってそもそも何なの?
【Docker基礎】Dockerとは何か?その概要を完全解説 簡単なWebサーバー構築も