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コマンドが中国語で入力できない問題の解決方法

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

推薦する

AngularJSにおける括弧の役割の詳細な説明

1. 括弧の役割1.1 角括弧 [ ]属性名が角括弧で囲まれている場合、右側には式の値が割り当てられ...

WeChatアプレットの手動および自動追跡の実装の詳細説明(Taro)

どの企業もユーザーベースを拡大したいのであれば、ユーザーの操作データを収集・分析する必要があり、その...

同じドメイン名を持つ Nginx プロキシのフロントエンドとバックエンドの分離プロジェクトの完全な手順

フロントエンド プロジェクトとバックエンド プロジェクトは分離されており、フロントエンドとバックエン...

MySQL 8.0 ディクショナリテーブル拡張の詳細な説明

MySQL のデータ ディクショナリは、データベースの重要なコンポーネントの 1 つです。INFOR...

MySQLでユーザーを作成し、ユーザーに権限を付与する方法の詳細なチュートリアル

目次ユーザー管理新しいユーザーを作成するユーザー名の変更ユーザーのパスワードを設定するルートパスワー...

JavaScript配列の一般的なメソッドの概要

目次1. はじめに2. フィルター() 3. マップ() 4. ソート() 5. 減らす() 6. ...

Javascriptでシングルトンパターンを実装する方法

目次概要コードの実装シングルトンパターンの簡易版改良版プロキシバージョンシングルトンモード遅延シング...

49 個の JavaScript のヒントとコツ

目次1. js整数の演算2. ネイティブアラートを書き換えてポップアップボックスの数を記録する3. ...

IDEAでVUEプロジェクトをデバッグするための詳細な手順

js コードをデバッグするには、コード内にデバッガーを記述するか、Chrome で毎回ブレークポイン...

JavaScript スネーク実装コード

この記事の例では、参考までに貪欲なスネークを実装するためのJavaScriptの具体的なコードを共有...

純粋な CSS を使用してユーザーが Web ページのコンテンツをコピーするのを防ぐ方法

序文私自身の個人ブログを入力しているときに、ブログの詳細ページでさまざまなコンテンツをコピーするさま...

MySQL 5.7.17 のインストールと設定方法のグラフィックチュートリアル (Win7 の場合)

Windows 7 で MySQL 5.7.17 をインストールする方法についてのグラフィック チ...

Linux deb パッケージの解凍、変更、その他の操作方法のコード例

さまざまな理由により、debパッケージ内のさまざまなファイルの内容を直接変更する必要がある場合があり...

Linux環境にRedisをデプロイし、Dockerにインストールする方法

インストール手順1. Redisをインストールするdocker search redis和docke...

Linux でファイル内の特定の文字の数を数える方法

ファイル内の文字列の数を数えることは、実際には砂の中の石を探すようなものです。ある人は、石を見た後に...