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

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

推薦する

CentOS 7 での Nginx ログタイミング分割の実装手順の詳細説明

1. 分割スクリプト (splitNginxLog.sh) を作成します。 * この例では、ログ分割...

Vueはカスタムツリーコンポーネントを再帰的に実装します

この記事では、カスタムツリーコンポーネントを再帰的に実装するVueの具体的なコードを参考までに共有し...

HTML テーブルタグチュートリアル (21): 行の境界線の色属性 BORDERCOLOR

テーブルを美しくするために、行ごとに異なる境界線の色を設定できます。基本的な構文<TR 境界線...

CSS で美しい時計アニメーション効果を実装するためのサンプルコード

仕事を探しています!!!事前準備:まず、このアニメーションは、以前のローディングアニメーションとクー...

auto.jsを使用して毎日の自動チェックイン機能を実現する

auto.js を使用して毎日のチェックインを自動化する感染症のせいで、毎日時間通りに家に帰らなけれ...

ブラウザのURLの前に小さなアイコンを表示する方法

多くのウェブサイトを閲覧すると、ブラウザのアドレスバーの前に小さなアイコンがあり、ブラウザのタブの位...

Linux環境変数ファイルの簡単な紹介

Linux システムでは、環境変数は適用範囲に応じて、システムレベルの環境変数とユーザーレベルの環境...

JavaScriptはシンプルな日付効果を実装します

JavaScriptの日付エフェクトの具体的なコードは参考用です。具体的な内容は次のとおりです。コー...

JSONデータをHTMLで表示する方法

背景:場合によっては、json データをページに直接表示する必要があります (たとえば、インターフェ...

JavaScript を使用して QR コードを解析する 3 つの方法

目次1. JavaScriptを使用してQRコードを解析する1. QR コードとは何ですか? 2.q...

Vue プロジェクトで垂直テーブルを 2 つの方法で実装するアイデアの分析

問題の説明私たちのプロジェクトでは、水平方向のテーブルが一般的ですが、必要に応じて垂直方向のテーブル...

MySqlは、外部ネットワーク接続クライアントの低速問題を解決するためにskip-name-resolveを使用します。

Tencent Cloud上に構築されたMySQLは、開発用コンピュータでNavicatを使用して...

Spring Boot + jar パッケージングのデプロイメント Tomcat 404 エラーの問題を解決する

1. Spring Boot は jsp jar パッケージをサポートしていません。jsp は wa...

回転灯効果を実現するWeChatアプレットの例

序文日常の開発では、テキストの水平スクロール効果(一般にカルーセルと呼ばれる)によく遭遇します。これ...

Linuxがすべてのコマンドをサポートしていない問題の解決策

Linux がすべてのコマンドをサポートしていない場合はどうすればいいですか?すべてのLinuxコマ...