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

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

推薦する

Dockerプライベートライブラリの実装

プライベート Docker レジストリのインストールとデプロイは、Docker テクノロジーを導入、...

Centos7のFirewalldファイアウォールの基本コマンドの詳細な説明

1. Linuxファイアウォールの基礎Linux ファイアウォール システムは主にネットワーク層で動...

MySQL 8.0 アップグレード体験

目次序文1. まず、既存のバージョンの MySQL を完全にアンインストールします。 2. deb ...

Vueコンポーネントの動的コンポーネントの詳細な説明

目次要約する要約する配列が変更されると、対応するデータを動的にロードしますシナリオ: 異なるコンポー...

VSCode 構成 Git メソッドの手順

Git は vscode に統合されており、git コマンドをいくつか記述しなくても、クリックするだ...

MySQLトリガーの使用と理解

目次1. トリガーとは何ですか? 2. トリガーを作成するトリガーを作成するための構文は次のとおりで...

プログレッシブ ウェブ アプリ (PWA) の開発方法

目次概要必要とするアプリURL PWA にはどのような技術コンポーネントが必要ですか?マニフェストフ...

LeetCode の SQL 実装 (183. 注文をしたことがない顧客)

[LeetCode] 183.注文しない顧客Web サイトに、Customers テーブルと Or...

ウェブデザインの仕事に応募する方法

<br />みなさんこんにちは!ここで皆さんとチャットできて光栄です! (*^__^*)...

グループフィールドを 1 行に書き込むための mysql group_concat メソッドの例

この記事では、MySQL group_concat を使用してグループ化されたフィールドを 1 つの...

HTML におけるいくつかの特殊属性タグの使用法の紹介

以下の属性はブラウザとの互換性があまりありません。 1.transform:rotate(45度) ...

CSSスプライト技術は複数の背景を1つのPNG画像に統合しますCSSポジショニング

アメリカのYAHOOがページ制作で使用している画像統合技術。これらのアイコン、列背景、画像ボタンを定...

Vueは指定された日付間のカウントダウンを実装します

この記事では、指定された日付間のカウントダウンを実装するためのVueの具体的なコードを例として紹介し...

TypeScript での関数オーバーロード

目次1. 関数シグネチャ2. 関数のオーバーロード2.1 オーバーロードされたシグネチャは呼び出し可...

JavaScript es6 における var、let、const の違いの詳細な説明

まず、よくある質問は、ECMAScript と JavaScript の関係は何ですか? ECMAS...