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 の違いの詳細な説明

推薦する

HTML CSS3は画像表示効果を引き伸ばさない

1. transform 属性を使用して、画像を拡大せずに表示します (パスの問題は必要に応じて修正...

Vue シングルページ アプリケーションで Markdown レンダリングを実装する

以前、Markdown をレンダリングするときに、mavonEditor のプレビュー モードを使用...

Linux に MySQL 8.0.x をインストールするための完全な手順

マイグレーションMySQL 入門MySQL はもともとオープンソースのリレーショナル データベース管...

Windows 64 ビットでの MySQL 8.0.13 のインストールと設定方法のグラフィック チュートリアル

この記事では、MySQL 8.0.13のインストールと設定のチュートリアルを参考までに紹介します。具...

シンプルな広告ウィンドウを実現するjs

この記事では、参考までに、シンプルな広告ウィンドウを実装するためのjsの具体的なコードを紹介します。...

MySQL で最大接続数を設定するためのヒントのまとめ

方法1: コマンドラインの変更次の図に示すように、MySQL コンソールを開いて「set GLOBA...

Xshell にショートカット コマンドを追加する方法

便利なターミナル エミュレーターである Xshell は、開発者がホスト サーバーをリモート管理する...

CSS3 背景コントロールプロパティと色遷移を使用してグラデーション効果を実現します。

CSS3 背景画像関連互換性: IE9+背景クリップ 背景画像描画領域background-cli...

Vue テンプレート構成と Webstorm コード形式仕様設定

目次1. コンパイラコードフォーマット仕様設定2. Vueテンプレートの設定1. コンパイラコードフ...

jQuery Ajax チャットボットの実装事例

チャットボットは多くの手作業を省くことができ、顧客サービス、天気予報対応など、さまざまな状況で使用で...

Docker nginxのインストールと設定方法

DockerでNginxイメージをダウンロードする docker プル nginx Docker イ...

bash のスクリプトデバッグメカニズムの詳細な説明

スクリプトをデバッグモードで実行するbash -x <script> を使用すると、スク...

css3 flexレイアウト justify-content:space-between 最後の行は左揃えになります

justify-content:space-betweenレイアウトを使用する場合、要素の最後の行に...

MySQL コピーテーブルと許可分析の 3 つの実装方法

テーブルを素早くコピーする方法まず、テーブル db1.t を作成し、1000 行のデータを挿入します...

Linux で固定 IP を設定する方法 (テスト済みで効果的)

まず、仮想マシンを開きます xshell5 を開いて仮想マシンに接続します (より便利です。Linu...