従来の仮想マシン テクノロジは、物理ハードウェア上で仮想化層 (ハイパーバイザー) を実行することにより、物理リソース (プロセッサ、メモリ、ストレージなど) を複数の独立した仮想マシンに仮想化します。各仮想マシンには独自のオペレーティング システムとアプリケーションがあり、物理ハードウェアや他の仮想マシンから分離された独自の仮想環境で実行されます。
ただし、従来の仮想マシンの操作には、ディスク容量、メモリ、プロセッサのパフォーマンスなどの大量のリソースが必要です。各仮想マシンにはオペレーティング システムとアプリケーションの完全なコピーが必要ですが、リソース使用率と起動時間にある程度のオーバーヘッドが生じます。
コンテナ技術は仮想化分野をさらに進化させたもので、より軽量な仮想化手法を採用しています。コンテナ技術は、オペレーティングシステム(Linuxコンテナなど)のコンテナ化機能を利用し、名前空間、ファイルシステム、プロセスのリソース制御グループ(cgroup)を分離することで、アプリケーションの分離と動作環境の仮想化を実現します。
Docker はコンテナを作成するための主流ツールとして近年急速に発展しており、その利点は、開発者が企業で必要なさまざまなアプリケーションやアプリケーション依存ファイルを Docker イメージ ファイルにカプセル化し、任意の物理デバイス (Linux など) 上で実行できることです。デバイスや Windows デバイスなど)にインストールして実行することで仮想化を実現し、アプリケーション プログラムを基盤となるデバイスから完全に分離し、物理マシン間で柔軟に移行および展開できるため、運用保守エンジニアが面倒な環境展開を排除できるため、作業効率が大幅に向上し、展開時間が短縮され、プロセス内の潜在的なリスクが軽減されます。
Docker コンテナには次の 4 つの特徴があります。
軽量: Docker コンテナはオペレーティング システム レベルの仮想化テクノロジに基づいており、従来の仮想マシンと比較してコンテナは軽量です。各コンテナーはホストのオペレーティング システム カーネルを共有し、アプリケーションとその実行に必要な依存関係のみが含まれるため、コンテナーは非常に迅速に起動および停止します。
分離: 各 Docker コンテナは相互に分離されており、独自のファイル システム、プロセス スペース、およびネットワーク インターフェイスを持っています。これは、コンテナーが互いに独立しており、相互に影響を及ぼさないことを意味します。同じホスト上で複数のコンテナーを同時に実行でき、各コンテナーは独立した仮想環境のようなものです。
移植性: Docker コンテナはさまざまなオペレーティング システムやクラウド プラットフォーム上で実行でき、移植性に優れています。コンテナ内のアプリケーションとその依存関係は、開発、テスト、運用環境の間で簡単にデプロイおよび移行できる自己完結型のポータブル ユニットにパッケージ化されます。
スケーラビリティ: Docker コンテナは水平方向に簡単に拡張できます。コンテナ オーケストレーション ツール (Docker Compose、Kubernetes など) を使用すると、さまざまな負荷要件を満たすための要求に応じて、複数のコンテナ インスタンスを自動的または手動で起動、停止、管理できます。
Docker コンテナと仮想マシン (VM) の比較
Docker コンテナと従来の VM テクノロジーは、技術的な実装が異なります。次の図は、VM コンテナと Docker コンテナの論理構成を示しています。
仮想マシン (VM):
ハイパーバイザーは、仮想マシンに実行プラットフォームを提供し、各 VM でのオペレーティング システムの動作を管理するために使用されます。各 VM には、独自のオペレーティング システム、アプリケーション、および必要な依存ファイルが必要です。
Docker コンテナ:
スケジューリングと分離に Docker エンジンを使用すると、リソースの使用率が向上し、より多くのコンテナ インスタンスを同じハードウェア機能で実行できるようになり、各コンテナには独自の分離されたユーザー スペースがあります。
仮想マシンとDockerコンテナの比較
VM と比較して、軽量な仮想化手法である Docker コンテナには、アプリケーションの面で次のような大きな利点があります。
- Docker コンテナは数秒で迅速に起動および停止できるため、従来の仮想マシンと比較して大幅に改善されています。
- Docker コンテナのシステム リソース要件は低く、数千の Docker コンテナを同じホスト上で同時に実行できます。
- Docker コンテナを使用すると、ユーザーは Git のような操作を通じてアプリケーション イメージを取得および更新できます。
- DockerコンテナはDockerfile設定ファイルにより自動作成と柔軟なデプロイを実現し、作業効率を向上させます。
- Docker コンテナは、コンテナ内でアプリケーションを実行すること以外は、基本的に追加のシステム リソースを消費せず、システムのオーバーヘッドを最小限に抑えながらアプリケーションのパフォーマンスを確保します。
次の図は、Docker コンテナと従来の VM 方式の違いを直感的に理解できます。
Docker の 5 つのコンポーネント
ミラービルド:
Docker コンテナの基礎となるのは Docker イメージです。これは、アプリケーションの実行に必要なファイル システムと依存関係を含む読み取り専用のテンプレートです。ミラーは、Dockerfile を作成してビルド コマンドを実行することで作成できます。ソフトウェア パッケージのインストールや環境の構成など、ミラーを構築する手順は Dockerfile で定義されます。
コンテナの作成:
Docker コマンドライン ツールまたは Docker API を使用して、特定のイメージに基づいてコンテナーを作成できます。コンテナーを作成するときは、コンテナーの名前、ネットワーク設定、ポート マッピング、その他のパラメーターを指定できます。各コンテナーには一意の ID と分離されたランタイム環境があります。
ファイルシステムの分離:
Docker コンテナは、Linux カーネルの名前空間や制御グループ (cgroup) などのテクノロジを使用して、コンテナ間のファイル システムの分離を実現します。各コンテナーにはファイル システムの独自のビューがありますが、ホスト オペレーティング システムのカーネルを共有します。
アプリケーションを実行します。
コンテナ内のアプリケーションとプロセスは、分離されたランタイム環境で実行できます。Docker コンテナは、Web サーバーやデータベースなど、オペレーティング システムで実行できるあらゆるアプリケーションを実行できます。コンテナ内のアプリケーションは、ホストまたは他のコンテナとのネットワーク通信を通じてサービスを提供できます。
コンテナ管理:
Docker は、コンテナーを管理および監視するための一連のコマンドライン ツールと API を提供します。これらのツールは、コンテナーの開始、停止、再起動、削除などを行うことができます。同時に、Docker は、複数のコンテナを自動的に管理および拡張するために使用できる、Docker Compose や Kubernetes などのコンテナ オーケストレーション ツールもサポートしています。
一般的なコンテナ化テクノロジーをいくつか紹介します。
Docker: Docker は、最も人気のあるコンテナ化プラットフォームの 1 つです。標準のコンテナ形式とランタイム環境を提供し、開発者がアプリケーションとその依存関係を自己完結型のポータブル コンテナにパッケージ化できるようにします。Docker は、コンテナ化されたアプリケーションを構築、デプロイ、管理するための強力なツールと機能を提供します。
FinClip アプレット コンテナ: FinClip は、モバイル端末に焦点を当てた小規模なプログラム コンテナ プラットフォームです。小規模なプログラムのコンテナ化ソリューションを提供し、開発者がモバイル アプリケーションに小規模なプログラムを埋め込んで実行できるようにします。FinClip は一連の API とツールを提供し、開発者がコンテナ化された方法でアプレットをモバイル アプリケーションに統合し、モバイル アプリケーションの機能と対話できるようにします。
Kubernetes (K8s): Kubernetes は、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するためのオープンソース コンテナ オーケストレーション プラットフォームです。Kubernetes は、コンテナ オーケストレーション、サービス ディスカバリ、ロード バランシング、自動スケーリングなどの機能を提供し、開発者がコンテナ化されたアプリケーションを信頼性と弾力性のある方法で実行できるようにします。
Apache Mesos: Apache Mesos は、リソース管理およびタスク スケジューリング機能を提供する分散システム カーネルです。コンテナ化されたアプリケーションのデプロイと管理をサポートし、さまざまなコンテナ ランタイムと統合できます。
Cloud Foundry: Cloud Foundry は、アプリケーションを構築、デプロイ、管理するためのオープンソースのコンテナ化プラットフォームです。複数のプログラミング言語とアプリケーション フレームワークをサポートするコンテナベースの開発およびランタイム環境を提供します。
LXC (Linux コンテナ): LXC は、コンテナ化用の Linux カーネルに基づく軽量の仮想化テクノロジです。これは、プロセスを独立した名前空間に分離して、アプリケーションの分離とリソース管理を実現する方法を提供します。
これらのテクノロジーにはそれぞれ独自の特性とアプリケーション シナリオがありますが、共通の目標は、便利でポータブルかつスケーラブルなコンテナ化環境を提供して、アプリケーションの展開と管理を簡素化し、より高いリソース使用率と信頼性を提供することです。