Docker コンテナは仮想マシンに同様のサービスを提供し、アプリケーションを実行するための分離された環境を提供しますが、これらは基本的に 2 つの異なるテクノロジです。違いと、Docker がなぜ非常に便利なのかについて説明します。
Docker はなぜそれほど便利なのでしょうか?
仮想マシンの主な目的は、大規模なサーバーを小さなチャンクに分割することです。重要な部分は、各 VM で実行されているプロセスを分離することです。たとえば、ホスティング プロバイダーが 32 コアのマシンを持ち、それを 8 つの 4 コア VM に分割して、さまざまな顧客に販売することができます。これにより全員のコストが削減され、多数のプロセスを実行している場合や、基盤となるハードウェアへの完全な SSH アクセスが必要な場合に最適です。
ただし、1 つのアプリを実行しているだけの場合は、必要以上に多くのリソースを使用している可能性があります。その 1 つのアプリを実行するために、ハイパーバイザーはゲスト オペレーティング システム全体を起動する必要があります。これは、32 コアのマシンが Ubuntu の 8 つのコピーを実行していることを意味します。さらに、インスタンスごとに仮想マシンのオーバーヘッドが発生します。
Docker はより優れたソリューションを提供します。 Docker コンテナは、仮想マシンのオーバーヘッドを発生させずに分離を提供します。各コンテナーは、 Linux 名前空間 で区切られた独自の環境で実行されますが、重要なのは、コンテナー内のコードがマシン上で直接実行されることです。エミュレーションや仮想化は含まれません。
ネットワークやホスト システムとのインターフェースによるオーバーヘッドはまだ多少ありますが、Docker のアプリケーションは通常、ベアメタル速度に近い速度で実行され、平均的な VPS よりも確実にはるかに高速です。 Ubuntu のコピーを 8 つ実行する必要はなく、1 つだけ実行すればよいため、1 つのホスト上で複数の Docker コンテナを実行するのが低コストになります。 AWS の Elastic Container Service や GCP の Cloud Run などのサービスは、基盤となるサーバーをプロビジョニングせずに個々のコンテナを実行する方法を提供します。
コンテナーは、OS が使用するライブラリやバイナリなど、アプリの実行に必要なすべての依存関係をパッケージ化します。 CentOS コンテナを Ubuntu サーバー上で実行できます。どちらも Linux カーネルを使用しており、唯一の違いは OS に含まれるバイナリとライブラリです。
Docker コンテナーとの主な違いは、通常、コンテナーに SSH アクセスできないことです。ただし、必ずしも必要というわけではありません。設定はすべてコンテナ ファイル自体によって処理されるため、更新を行う場合は、コンテナの新しいバージョンをプッシュする必要があります。
この構成はすべてコード内で行われるため、サーバー ソフトウェアに Git などのバージョン管理を使用できます。コンテナーは単一のイメージであるため、コンテナーのさまざまなビルドを簡単に追跡できます。 Docker を使用すると、開発環境が本番環境とまったく同じになるだけでなく、他の人の開発環境も同じになるため、「私のマシンでは壊れている!」という問題が軽減されます。
別のサーバーをクラスターに追加する場合、そのサーバーを再構成したり、必要なすべての依存関係を再インストールしたりすることを心配する必要はありません。コンテナーを構築したら、多くの構成を必要とせずに、そのコンテナーの 100 個のインスタンスを簡単にスピンアップできます。これにより 、非常に簡単な Auto Scaling も有効になり、大幅なコストの節約になります。
Docker の欠点
もちろん、Docker がすぐに仮想マシンに取って代わるわけではありません。これらは 2 つの異なるテクノロジーですが、仮想マシンには依然として多くの利点があります。
一般にネットワーキングはより複雑です。仮想マシンでは通常、専用のネットワーク ハードウェアが直接公開されています。ファイアウォールを簡単に構成し、特定のポートでリッスンするようにアプリケーションを設定し、HAProxy を使用した負荷分散などの複雑なワークロードを実行できます。 Docker では、すべてのコンテナーが同じホスト上で実行されるため、多くの場合、これはもう少し複雑になります。ただし、通常は、AWS の Elastic Container Service や GCP の Cloud Run などのコンテナ固有のサービスが、サービスの一部としてこのネットワーキングを提供します。
非ネイティブ オペレーティング システム上のパフォーマンスは依然として仮想マシンと同等です。 Windows ホスト マシン上で Linux コンテナーを実行することはできないため、Docker for Windows は実際には Linux VM 用の Windows サブシステムを使用して、実行中のコンテナーを処理します。この場合、Docker は基本的に仮想マシンの上に抽象化レイヤーを提供します。
永続データも少し複雑です。 Docker コンテナはステートレスになるように設計されています。これは、ホスト上のディレクトリをコンテナにマウントするボリューム マウントで修正できます。また、ECS などのサービスを使用すると、共有ボリュームをマウントできます。ただし、通常のサーバーにデータを保存することに勝るものはなく、実際に Docker で実稼働データベースを実行することは望ましくありません。





