Dockerイメージの読み込み原理

Dockerイメージの読み込み原理

Docker イメージ

鏡とは何ですか?

  • イメージは軽量で実行可能なスタンドアロンソフトウェアパッケージ特定のソフトウェアを実行するために必要なソフトウェアを含むパッケージ化されたソフトウェア実行環境および実行環境に基づいて開発されたソフトウェア代碼、ランタイム、環境變量配置文件などすべて。
  • すべてのアプリケーションは Docker イメージに直接パッケージ化して直接実行できます。
  • 画像はどうやって入手するのですか?

リモートリポジトリのダウンロード

友達コピー

ミラーDockerFile自分で作成する

Dockerイメージの読み込み原理

ユニオンFS

  • UnionFS: Union File System (UnionFS) は、分層輕量級高性能ファイル システムであり、ファイル システムの変更を単一のコミットとしてレイヤーごとに重ね合わせることができ、複数のディレクトリを単一の仮想ファイル システムに統合できます。 Union ファイル システムは Docker イメージの基礎となります。イメージは階層化により継承できます。ベースイメージ(親イメージなし)をベースに、さまざまな特定アプリケーションイメージを作成できます。
  • 特徴: 1回限り複数のファイル システムを同時にロードしますが、外部からは 1 つのファイル システムしか見えません。ジョイント ロードでは、すべてのファイル システムを異なるレベルでロードします。重ね合わせたので最終的なファイルシステムには、基礎となるファイルとディレクトリがすべて含まれる。

Docker鏡像加載原理

  • Docker イメージは、実際には UnionFS などのファイル システムのレイヤーで構成されています。
  • bootfs (ブートファイルシステム) には、主にブートローダとカーネルが含まれます。ブートローダは主にカーネルのブートとロードを行います。Linux を起動した直後は、bootfs ファイルシステムがロードされます。Docker イメージの最下層は boots です。このレイヤーは、ブートローダーとカーネルを含む一般的な Linux/Unix システムと同じです。ブートがロードされると、カーネル全体がメモリ上に配置されます。このとき、メモリの使用権は bootfs からカーネルに移行しており、システムは bootfs もアンロードします。
  • roots (ルート ファイル システム)、bootfs より上。一般的な Linux システムの /dev、/proc、/bin、/etc などの標準ディレクトリとファイルが含まれます。 rootfs は、Ubuntu、Centos などのさまざまなオペレーティング システム ディストリビューションを指します。

ここに画像の説明を挿入

通常、仮想マシンにインストールするCentOSは数 GB ですが、Docker はなぜ 200 MB しかないのでしょうか?

ここに画像の説明を挿入

  • 合理化された OS の場合、基礎となるレイヤーがホスト カーネル自体を直接使用し、ルートのみを提供する必要があるため、rootfs は非常に小さくなり、最も基本的なコマンド、ツール、プログラム ライブラリのみを含める必要があります。異なる Linux ディストリビューションでは、bootfs は基本的に同じですが、rootfs は異なる場合があるため、異なるディストリビューションで bootfs を共有できることがわかります。
  • 仮想マシンは1分レベル、コンテナは2分レベル!レイヤーでDocke理解する階層的思考: レイヤーごとにダウンロードし、レイヤーごとにチェックし、存在する場合はスキップし、そうでない場合はダウンロードする
[root@docker ~]# docker pull redis 
デフォルトタグの使用: 最新
最新: library/redis からプル
69692152171a: すでに存在します 
a4a46f2fd7e0: プル完了 
bcdf6fddc3bd: プル完了 
2902e41faefa: プル完了 
df3e1d63cdb1: プル完了 
fa57f005a60d: プル完了 
ダイジェスト: sha256:7e2c6181ad5c425443b56c7c73a9cd6df24a122345847d1ea9bb86a5afc76325
ステータス: redis:latest の新しいイメージをダウンロードしました
docker.io/ライブラリ/redis:最新
  • Docker イメージがこの階層構造を採用しているのはなぜでしょうか?
  • 私の考えでは、最大の利点はリソースの共有です。たとえば、同じベース イメージから複数のイメージが構築される場合、ホストはディスク上に 1 つのベース イメージを保持するだけでよく、メモリにロードする必要があるベース イメージも 1 つだけなので、すべてのコンテナーにサービスを提供でき、イメージの各レイヤーを共有できます。
  • イメージのレイヤーを表示するにはdocker image inspect +容器コマンドを使用します。
  • Layersを観察する

ここに画像の説明を挿入

階層化の意味を理解する

  • すべてのDockerイメージはベースイメージレイヤーから始めて、変更を加えたり新しいコンテンツを追加したりすると、現在の画像レイヤーの上に新しい画像レイヤーを作成します
  • 簡単な例を挙げると、Ubuntu Linux 16.04 をベースに新しいイメージを作成した場合、これが新しいイメージの最初のレイヤーになります。イメージに Python パッケージを追加すると、ベース イメージ レイヤーの上に 2 番目のイメージ レイヤーが作成されます。セキュリティ パッチをさらに追加すると、3 番目のイメージ レイヤーが作成されます。
  • 下の図に示すように、画像には現在 3 つの画像レイヤーが含まれています (これはデモンストレーション用の非常に単純な例です)。

ここに画像の説明を挿入

追加の画像レイヤーが追加されても、画像は常に現在のすべての画像の組み合わせのままであることを理解することが重要です。次の図は、各イメージ レイヤーに 3 つのファイルが含まれ、イメージに 2 つのイメージ レイヤーからの 6 つのファイルが含まれる単純な例を示しています。

ここに画像の説明を挿入

  • 上の画像の画像レイヤーは、前の画像とは少し異なります。主な目的は、ファイルの表示を容易にすることです。
  • 次の図は、少し複雑な 3 層の画像を示しています。外から見ると、画像全体には 6 つのファイルしかありません。これは、最上位層のファイル 7 がファイル 5 の更新バージョンであるためです。

ここに画像の説明を挿入

  • この場合、上の画像レイヤーのファイルによって下の画像レイヤーのファイルが上書きされます。これにより、ファイルの更新バージョンが新しいイメージ レイヤーとしてイメージに追加されます。
  • Docker は、ストレージ エンジン (新しいバージョンではスナップショット メカニズムを使用) を通じてイメージ レイヤー スタックを実装し、複数のイメージ レイヤーが統合されたファイル システムとして表示されるようになります。
  • Linux で使用できるストレージ エンジンは、AUFS、Overlay2、Device Mapper、Btrfs、ZFS です。名前が示すように、各ストレージ エンジンは Linux の対応するファイル システムまたはブロック デバイス テクノロジに基づいており、各ストレージ エンジンには独自のパフォーマンス特性があります。
  • DockerはWindows上で1つのストレージエンジン、Windowsfilterのみをサポートしています。これはNTFSファイルシステム[1]に基づいて階層化とCoWを実装します。
  • 次の図は、システムディスプレイと同じ 3 層イメージを示しています。すべての画像レイヤーが積み重ねられ、結合されて、外部の世界に統一されたビューが提供されます。

ここに画像の説明を挿入

階層型ダウンロード利点

一部のアプリケーションのレイヤーが同じであると仮定すると、それらを直接再利用できます。

特徴

  • Dockerイメージは読み取り専用。コンテナが起動すると、新しい書き込み可能なレイヤーがイメージの上に読み込まれます。
  • このレイヤーは通常、コンテナ レイヤー (run) と呼ばれ、コンテナの下にあるものはすべてイメージ レイヤー (remote pull) と呼ばれます。
  • すべての操作は容器層に基づいている

ここに画像の説明を挿入

コミットミラー

  • ミラーを送信するにはどうすればいいですか?
  • Docker commit
docker commit はコンテナをコミットして新しいコピーにします。docker commit -m="コミットされた説明" -a="作成者" コンテナ ID ターゲットイメージ名: [TAG]

#デフォルトのTomcatイメージを実行 [root@docker ~]# docker run -it -p 8080:8080 tomcat

[root@docker ~]# docker ps
コンテナID イメージ コマンド 作成ステータス ポート名
792ca37197e8 tomcat "catalina.sh run" 34 秒前 32 秒前に起動 0.0.0.0:8080->8080/tcp、:::8080->8080/tcp upbeat_mcnulty

[root@docker ~]# docker exec -it 792ca37197e8 /bin/bash
#このデフォルトの tomcat には webapps アプリケーションがないことがわかりました。ミラーリングのため、公式のミラーリングのデフォルトの webapps にはファイルがありません。基本ファイルを自分でコピーします。root@792ca37197e8:/usr/local/tomcat# cp -r webapps.dist/* webapps

#ブラウザアクセス、テスト成功 http://192.168.100.100:8080/

# 変更したコンテナを送信して新しいイメージにします [root@docker ~]# docker commit -a="pakho" -m="add webapps app" 792ca37197e8 tomcat02:1.0
sha256:d6d429f9d2ba25af8f66bd3e7a7de489cf2219828ea755ce1d0a1a7816c27731

[root@docker ~]# docker イメージ
リポジトリ タグ イメージ ID 作成 サイズ
tomcat02 1.0 d6d429f9d2ba 28秒前 672MB

Docker イメージの概要

ここに画像の説明を挿入

  • Docker イメージの主な機能は、レイヤー化、コピーオンライト、コンテンツ アドレス指定、ユニオン マウントです。
  • Docker イメージは、Docker コンテナを実行するための基盤です。Docker イメージがなければ、Docker コンテナは存在できません。これは、Docker の設計原則の 1 つでもあります。
  • Docker イメージは結局のところイメージであり、静的コンテンツであることは理解できますが、Docker コンテナは動的コンテンツであるため異なります。動的コンテンツというと、プロセス、メモリ、CPU などが思い浮かびます。実際、Dockerコンテナは動的コンテンツとして、これらを含みます
  • 理解しやすいように、Docker コンテナは 1 つ以上の実行中のプロセスと考えることができます。これらの実行中のプロセスは、対応するメモリ、対応する CPU コンピューティング リソース、対応する仮想ネットワーク デバイス、および対応するファイル システム リソースを占有します。 Docker コンテナが占有するファイル システム リソースは、Docker イメージのイメージ レイヤー ファイルによって提供されます。

以上がDockerイメージ原理の詳しい内容です。Dockerイメージについてさらに詳しく知りたい方は、123WORDPRESS.COMの他の関連記事もぜひご覧ください!

以下もご興味があるかもしれません:
  • Dockerイメージの作成とプロジェクト全体のワンクリックパッケージングとデプロイ
  • イメージのパッケージ化とワンクリック展開を実現するためにDockerを組み合わせたアイデア
  • Docker用国産イメージウェアハウスの使い方
  • Docker ロード後にイメージ名が none になる問題の解決方法
  • docker によってプルされたイメージがどこに保存されるかの詳細な説明
  • Docker を使用してイメージをローカルにパッケージ化してデプロイする方法
  • Dockerの国内イメージソースを変更する方法

<<:  クロスブラウザローカルストレージⅠ

>>:  MySQL における in と exists の違いの詳細な説明

推薦する

MySQL における大規模オブジェクトのマルチバージョン同時実行制御の詳細な説明

MySQL 8.0: InnoDB のラージ オブジェクトに対する MVCCこの記事では、MySQL...

nginx.pid を開く際の失敗と無効の解決策

目次1. 問題の説明2. 問題分析3. 解決策解決策1: ディレクトリを作成する解決策2: 構成ファ...

Vue バッチ更新 DOM 実装手順

目次シーン紹介深い応答性トリガーゲッターDep.targetを探すゲッターセッター要約するシーン紹介...

Linux システム ディスクのフォーマットとスワップ パーティションの手動追加

Windows: NTFS、FATをサポートLinux は次のファイル形式をサポートしています: C...

Flexboxレイアウトの最もシンプルなフォーム実装

フレキシブル レイアウト (Flexbox) はますます人気が高まっており、CSS レイアウトの記述...

Linux で Oracle データベースをバックアップするためのスケジュールされたタスクの設定に関するチュートリアル

1. データベースの文字セットを確認するデータベースの文字セットは、Linux で設定された環境変数...

Linux でハードディスクのサイズを確認し、ハードディスクをマウントする方法

Linux には、マウントされたハードディスクとマウントされていないハードディスクの 2 種類のハー...

CSS3 クリアフロートメソッドの例

1. 目的この記事を通じて、誰もがフロートをクリアする原理と方法を理解し、最終的にこの記事が最良であ...

カレンダー効果を実現するための Bootstrap+JQuery

この記事では、カレンダー効果を実現するためのBootstrap+Jqueryの具体的なコードを参考ま...

MySQL 8.0.23 インストールの超詳細なチュートリアル

目次序文1. 公式サイトからMySQLをダウンロードする2. 解凍ファイルを設定する3. 初期化4....

Dockerコンテナレイヤーの概念の詳細な説明

目次01 コンテナの一貫性02 レイヤーの概念03 レイヤードデザインの利点今日はコンテナ レイヤー...

ReactとAntdのFormコンポーネントを組み合わせてログイン機能を実装する方法を詳しく説明します

目次1. ReactとAntdを組み合わせてログイン機能を実現2. ReactとAntdを組み合わせ...

Vueコンポーネント間の通信の非常に詳細な要約

目次序文1. Props、$emit一方向データフロー2. $親、$子3. $attrs、$list...

任意の長さの配列を作成または埋めるための JS のヒントの要約

目次序文直接充填方式for ループの push() メソッド配列コンストラクタメソッド配列コンストラ...

JavaScriptの厳密モードが8進数をサポートしていない問題の説明

JavaScript厳密モードが 8 進数をサポートしていないという問題に関して、まず、 Java...