目次
開発の歴史
元
ソフトウェア開発時の環境展開で最も面倒なことの 1 つは、環境構成です。通常の状況では、プログラムを確実に実行するには、オペレーティング システムをセットアップし、さまざまなライブラリとコンポーネントをインストールする必要があります。たとえば、Python プログラムを実行するには、コンピューターに Python エンジンが搭載され、プログラムのさまざまな依存関係がインストールされ、さらに特定の環境変数が構成されている必要があります。同じサーバーにデプロイする必要がある 2 つのプログラムがあり、1 つは Python 2.0 ベースのソフトウェアを必要とし、もう 1 つは Python 3.0 ベースのソフトウェアを必要とする場合、デプロイメントで混乱が生じやすくなります。異なるバージョンの Python モジュールは相互に互換性がない可能性があり、異なる開発環境のライブラリにも追加の構成が必要になるためです。多数のプログラムをデプロイしたい場合、開発環境とデプロイ環境が異なる場合、その設定がどれほど面倒であるかは想像できます。
ソフトウェアをある環境から別の環境に適切に移植するには、問題の根本原因を解決する必要があります。では、ソフトウェアを移植するときにまったく同じ元の環境を移行するにはどうすればよいでしょうか?
仮想マシン
仮想マシンは環境を移行するためのソリューションです。仮想マシンは本質的に、別のオペレーティング システムを実行できるソフトウェアです。たとえば、MacOS 上で Linux システムを実行したい場合は、コンピュータに Linux イメージをインストールし、仮想マシンを使用してイメージを開いてミラーインミラーを作成します。このソリューションは非常に便利です。新しい環境が必要な場合は、イメージをインストールし、仮想マシンを使用してそれを開くことができます。イメージを直接削除する必要はありません。ただし、この解決策にはいくつかの欠点があります。
- 多くのリソースを占有します: 仮想マシンはオペレーティング システム全体をインストールする必要があるため、必然的に大量のメモリとハード ディスク容量が消費されます。1MB のソフトウェアのみを実行する必要がある場合、それを実行するために複数の G 環境をインストールする必要がある場合があります。
- 冗長な実行手順: 仮想マシンは完全なシステムとともにインストールされます。プログラムを実行するたびに、手順を段階的に実行する必要があります。システムを開いたり、ユーザーにログインしたり、その他の面倒な手順を実行するのは非常に不便です。 。
- 実行速度が遅い: 特定の環境でソフトウェアを実行するには、まず仮想マシンでシステムを実行する必要があり、システムは多くのリソース (ネットワーク、GUI、IO など) を占有することが多く、当然、実行速度に影響します。 。
容器
仮想マシンのこうした欠点を解決するために、Linux は別の仮想化テクノロジである Linux コンテナを開発しました。Linux コンテナーは、完全なオペレーティング システムをシミュレートするのではなく、プロセスを分離します。言い換えれば、保護層は通常のプロセスの外で適用されます。コンテナ内のプロセスの場合、基礎となるプログラムからの分離を実現するために、プロセスが接触するさまざまなリソースは仮想的です。コンテナはプロセスレベルであるため、仮想マシンよりも多くの利点があります。
- 占有リソースが少ない: コンテナは必要なリソースのみを占有し、使用されていないリソースは占有しません。完全なオペレーティング システムを仮想マシンにインストールする場合と比較して、コンテナーが消費するスペースははるかに少なくなります。
- 高いリソース使用率: 仮想マシンはすべて排他的なリソースであり、コンピューターは各仮想環境に個別にリソースを割り当てる必要があるため、多くのスペースを占有するだけでなく、リソース使用率も低くなります。コンテナーはリソースを共有して、リソースの使用率を最大化できます。
- 高速な実行速度: コンテナー内のアプリケーションは基盤となるシステムのプロセスであるため、コンテナーの起動は、完全で肥大化したオペレーティング システムではなく、ローカル マシンのプロセスを直接実行することと同等であり、当然のことながら、はるかに高速になります。
ドッカー
概要
Docker は、使いやすいコンテナ インターフェイスを提供する Linux コンテナのパッケージであり、現在最も人気のある Linux コンテナ ソリューションです。Docker は、ソフトウェア コードとその依存関係を 1 つのファイルにパッケージ化します。単一のファイルを実行すると、仮想コンテナが生成されます。この仮想コンテナでは、ローカル オペレーティング システムがどのように異なっていても、このコンテナは通常どおり実行できます。つまり、ユーザーがコンテナーをより適切に作成して使用できるようになり、同じコードが異なる環境でも正常に実行できるようになります。
Docker を使用すると、開発者はアプリケーションと依存関係を軽量でポータブルなコンテナにパッケージ化して、一般的な Linux マシンに配布したり、仮想化したりできます。
注:
- Docker は、 Go 言語に基づくオープン ソースのアプリケーション コンテナ エンジンであり、 Apache2.0 プロトコルに準拠したオープン ソースです。
- Dockerはバージョン17.03からCE(コミュニティエディション:Community Edition)とEE(エンタープライズエディション:Enterprise Edition)に分かれており、Community Editionを利用することができます。
Docker コンテナと従来のVM
仮想マシンと Docker コンテナのアーキテクチャの比較:
仮想マシンと Docker コンテナーのパフォーマンスの比較:
動作原理
Docker コンテナの実行ロジックは以下の図に示されており、Docker はクライアント/サーバー (C/S) アーキテクチャ モードを使用しており、サーバー側としての Docker デーモン (Docker デーモン) は Docker クライアントからのリクエストを受け取り、 Dockerコンテナの作成、実行、配布。通常、Docker デーモンは Docker ホストのバックグラウンドで実行され、ユーザーは Docker クライアントを使用して Docker デーモンと直接対話します。
Docker の構成
- ミラーリング: Docker ミラーリングは特別なファイル システムであり、コンテナーのランタイムに必要なプログラム、ライブラリ、リソース、構成ファイル、その他のファイルを提供するだけでなく、ランタイム用に準備されたいくつかの構成パラメーターも含まれています。イメージには動的データが含まれておらず、その内容は構築後に変更されません。イメージを使用して Docker コンテナーを作成でき、ユーザーはデバイス上の既存のイメージを使用して複数の同一の Docker コンテナーをインストールできます。
- コンテナ: イメージによって作成された実行中のインスタンス。Docker はコンテナを使用してアプリケーションを実行します。各コンテナは、分離された安全なプラットフォームです。コンテナは軽量の Linux オペレーティング環境と考えることができます。
- ミラーウェアハウス: ミラーファイルが集中的に保管される場所。ユーザーはイメージを作成した後、それをパブリック ウェアハウスまたはプライベート ウェアハウスにアップロードでき、別のホストでイメージを使用する必要がある場合はウェアハウスからダウンロードするだけで済みます。
プロセスの実行
- Docker クライアント: Docker デーモン (Docker Daemon) との通信を確立するために使用されるクライアント。Docker クライアントは、Docker サーバーまたはデーモン プロセスにリクエスト (Docker ビルド、Docker プル、および Docker 開始命令) を送信するだけでよく、サーバーまたはデーモン プロセスはすべての作業を完了して結果を返します。
- オレンジ色のプロセスで示されているように、Docker build コマンドを実行すると、Docker ファイルに基づいてイメージが構築され、ローカルの Docker ホストに保存されます。
- 青いプロセスで示されているように、Docker pull コマンドを実行すると、クラウド イメージ リポジトリからローカル Docker ホストにイメージがプルされるか、ローカル イメージがリモート イメージ リポジトリにプッシュされます。
- 黒のプロセスで示されているように、Docker start コマンドを実行すると、イメージがコンテナにインストールされ、コンテナが起動されます。
- Docker ホスト: Docker デーモンとコンテナーを実行するために使用される物理マシンまたは仮想マシン。
- Docker デーモン: Docker クライアントから送信されたリクエストを受信して処理し、Docker API リクエストを監視し、イメージ、コンテナー、ネットワーク、データ ボリュームなどの Docker オブジェクトを管理します。