Dockerの動作モードと原理の詳細な説明

Dockerの動作モードと原理の詳細な説明

次の図に示すように:

ここに画像の説明を挿入

仮想マシンと Docker を使用するとき、「なぜ Docker は VM よりも高速なのか?」という疑問が生じます。

ここに画像の説明を挿入

上の図はこの問題を客観的に示しています。

1. Docker には仮想マシンよりも抽象化レイヤーが少なくなっています。

2. Docker はホストマシンのカーネルを使用しますが、VM にはゲスト OS が必要です。

したがって、新しいコンテナを作成するときに、Docker は仮想マシンのようにオペレーティング システムを再ロードする必要がありません。仮想マシンはゲスト OS をロードします (数分かかる)。一方、Docker はホスト マシンのオペレーティング システムを使用するため、この複雑なプロセスは省略されます (数秒かかる)。

ここに画像の説明を挿入

これらを明確にした後、クライアント側でどのように使用するかを見てみましょう。

まず、いくつかの用語を理解する必要があります。

ホスト (Docker エンジン)

Docker デーモンとコンテナを実行するために使用される物理マシンまたは仮想マシン。

画像

Docker イメージとは何ですか?簡単に言えば、Docker イメージは Linux カーネル上で実行できるプログラムと対応するデータを含む Linux ファイル システム (ルート ファイル システム) です。
コンテナはイメージを通じて起動されます。イメージとは、コード、ランタイム、ライブラリ、環境変数、構成ファイルなど、アプリケーションの実行に必要なすべてのものが含まれる実行可能パッケージです。
Docker はアプリ ファイルをミラーにパッケージ化し、複数のスナップショットに似たストレージ テクノロジを使用して次のことを実現します。

  • 複数のアプリが同じ基盤イメージ (初期オペレーティング システム イメージ) を共有できます。
  • アプリ実行中の IO 操作とイメージ ファイルの分離。
  • 異なる構成/データ ファイルを含むディレクトリまたはボリュームをマウントすることにより、単一のアプリ イメージを使用して、さまざまなビジネス用の多数のコンテナーを実行できます。

容器

イメージとコンテナの関係は、オブジェクト指向プログラミングにおけるクラスとインスタンスの関係に似ています。イメージは静的な定義であり、コンテナはイメージの実行時のエンティティです。コンテナは作成、開始、停止、削除、一時停止などが可能です。

画像のレイヤー化

Docker は、既存のイメージを拡張して新しいイメージを作成することをサポートしています。実際、Docker Hub のイメージの 99% は、ベース イメージに必要なソフトウェアをインストールして構成することによって構築されます。

ここに画像の説明を挿入

上の図からわかるように、ベースイメージをレイヤーごとに積み重ねることで新しいイメージが生成されます。ソフトウェアをインストールするたびに、既存のイメージにレイヤーが追加されます。
イメージレイヤー化の最大の利点の 1 つは、リソースの共有です。たとえば、同じベース イメージから複数のイメージが構築される場合、Docker ホストは 1 つのベース イメージをディスクに保存するだけで済みます。同時に、すべてのコンテナーに対応するためにメモリにロードする必要があるベース イメージも 1 つだけです。また、画像の各レイヤーを共有することもできます。
複数のコンテナがベースイメージを共有している場合、コンテナが /etc の下のファイルなど、ベースイメージの内容を変更しても、他のコンテナの /etc は変更されず、変更は 1 つのコンテナに限定されます。これはコンテナのコピーオンライト機能です。

書き込み可能なコンテナレイヤー

コンテナが起動すると、イメージの上に新しい書き込み可能なレイヤーが読み込まれます。このレイヤーは通常「コンテナ レイヤー」と呼ばれ、「コンテナ レイヤー」の下にあるものはすべて「イメージ レイヤー」と呼ばれます。

ここに画像の説明を挿入

コンテナへのすべての変更 (ファイルの追加、削除、変更など) は、コンテナ レベルでのみ行われます。コンテナ レイヤーのみが書き込み可能で、コンテナ レイヤーの下にあるすべてのイメージ レイヤーは読み取り専用です。

イメージ レイヤーの数は膨大になる可能性があり、すべてのイメージ レイヤーが結合されて統合されたファイル システムが形成されます。 /a のように、異なるレイヤーに同じパスを持つファイルがある場合、上位レイヤーの /a が下位レイヤーの /a を上書きするため、ユーザーは上位レイヤーのファイル /a にのみアクセスできます。コンテナ層では、ユーザーが目にするのは重ね合わせたファイルシステムです。

データは変更が必要な場合にのみコピーされます。この機能は、Copy-on-Write と呼ばれます。コンテナ レイヤーは画像の変更された部分を保存し、画像自体には変更を加えないことがわかります。

要約すると、コンテナ レイヤーはイメージへの変更を記録し、すべてのイメージ レイヤーは読み取り専用であり、コンテナによって変更されないため、イメージは複数のコンテナで共有できます。

音量

実際、コンテナはオペレーティング システムの簡易版のようなものです。ただし、システムはプログラムの実行に必要な環境のみをインストールします。前述のように、コンテナは削除できます。コンテナを削除した場合、コンテナ内のプログラムによって生成された、保持する必要があるデータはどうすればよいでしょうか。コンテナが実行中の場合、コンテナに入って表示することができます。コンテナが削除されると、何も残りません。

そこで、データ ボリュームがこの問題を解決するために使用されます。これは、ホスト マシン上のデータを永続化し、コンテナー間のデータ共有を実現するために使用されます。簡単に言うと、ホスト マシンのディレクトリをコンテナー内のディレクトリにマップします。アプリケーションはコンテナー内のディレクトリでデータを読み書きし、そのデータはホスト マシンに同期されます。このようにして、コンテナーによって生成されたデータを永続化できます。たとえば、データベース コンテナーは、ホスト マシン上の実際のディスクにデータを保存できます。

レジストリ

Docker はレジストリを使用してユーザーが構築したイメージを保存します。レジストリには、パブリックとプライベートの 2 種類があります。 Docker Inc. は Docker Hub と呼ばれるパブリックレジストリを運営しています。ユーザーは Docker Hub にアカウントを登録して、独自のイメージを共有および保存できます。

Docker は、使用できる膨大なイメージのコレクションを提供するパブリック イメージ リポジトリ hub.docker.com (Docker では Repository と呼びます) を提供します。

Docker レジストリには複数のリポジトリを含めることができ、各リポジトリには複数のタグを含めることができ、各タグはイメージに対応します。

通常、リポジトリには同じソフトウェアの異なるバージョンのイメージが含まれており、タグはソフトウェアの異なるバージョンに対応しています。 <ウェアハウス名>:<ラベル> の形式を使用して、どのバージョンのソフトウェアがミラーであるかを指定できます。タグが指定されていない場合、デフォルトのタグは最新になります。

要約する

Docker の公式 Web サイトには、次のような文章があります。「あらゆるアプリケーションをどこでもビルドして出荷できます。」今理解したことと組み合わせると、要約すると、「一度ビルドすれば、どこでも実行できます。」となります。
さらに、Docker は、イメージを自動的に構築する GitHub Connect というパブリック イメージ リポジトリ hub.docker.com (Docker では Repository と呼びます) を提供し、アプリケーションの配布、展開、アップグレードのプロセスを大幅に簡素化します。さらに、Docker ではさまざまなカスタマイズされたイメージ ファイルを簡単に作成できます。これは、Docker が最も人気のあるコンテナー テクノロジになるための重要な要素です。

上記のテクノロジーを組み合わせることで、最終結果は次のようになります。ほとんどのアプリケーションでは、開発者は docker build を通じてイメージを作成し、docker push を通じてイメージをアップロードし、ユーザーは docker pull を通じてイメージをダウンロードし、docker run でコンテナ アプリケーションを実行できます。ユーザーは、環境の構築方法、インストール方法、異なるディストリビューション間のライブラリ競合の解決方法について心配する必要がなくなり、通常、ハードウェア リソースの消費量が増えたり、パフォーマンスが大幅に低下したりすることもありません。

以上がDockerの動作モードと原理の詳細な説明の詳細な内容です。Dockerの動作モードと原理の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Dockerイメージ送信コマンドcommitの動作原理と使い方の詳細な説明
  • Docker チュートリアル: コンテナの使用 (簡単な例)
  • Dockerネットワークの仕組み
  • Dockerコンテナが使用するリソースを表示する方法の詳細な説明

<<:  MySQLコマンドが中国語で入力できない問題の解決方法

>>:  入力できない無効な値はアクションレイヤーに渡すことができません

推薦する

HTMLはシンプルで美しいログインページを作成します

まずは見てみましょう。 HTML ソースコード: XML/HTML コードコンテンツをクリップボード...

MySQL 5.5.27 winx64 のインストールと設定方法のグラフィックチュートリアル

1. インストールパッケージMYSQLサービスダウンロードアドレス:MySQL公式サイトからダウンロ...

特殊効果メッセージボックスを実現するネイティブJS

この記事では、ネイティブ JS で実装された特殊効果メッセージ ボックスを紹介します。効果は次のとお...

SQL文でのgroup byの使用について簡単に説明します

1. 概要Group by は、by の後の規則に従ってデータをグループ化することを意味します。いわ...

WeChatアプレットを少なく使う方法(最適な方法)

序文私は less/sass を書くことに慣れていますが、小さなプログラムを開発するときには、まだ ...

1つの記事でJavaScriptのクロージャ関数について学ぶ

目次変数のスコープ閉鎖の概念クロージャの使用クロージャのデメリット最後に、クロージャのメリットとデメ...

Baidu 入力メソッドが API を公開、自由に移植して使用できると主張

百度入力方式の担当者は、百度入力方式のオープンAPIの最大の利点は操作が便利であることであり、プラッ...

JSの高階関数5つを共有する

目次1. はじめに2. 再帰3. コールバック関数3.1 匿名コールバック関数3.2 パラメータ付き...

CSS で 3D ルービック キューブを実装するサンプル コード

今日は簡単な3Dルービックキューブを作ってみましょうまずはレンダリングを見てみましょう!これを学んだ...

さまざまな環境での Docker Compose のインストール方法

1. オンラインインストール現在、Linux x86アーキテクチャのオンラインインストールのみを試し...

Docker に ElasticSearch 6.x をインストールする詳細なチュートリアル

まず、イメージをプルします(またはコンテナを作成するだけで、自然にプルされます)。 docker p...

テキストスクロール後の自動停止効果の例

効果は非常にシンプルで、次のコードを自分のページにコピーして実行するだけです。コードをコピーコードは...

Zabbixを使用してMySQLを監視する方法

Zabbix 導入ドキュメントzabbix導入後zabbixエージェントの操作1. MySQLを監視...

vue3 を使用してマテリアル ライブラリを構築する方法

目次なぜマテリアルライブラリが必要なのでしょうか?材質は何ですか?素材の種類fuep、vue3 ベー...