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 における単一テーブルと複数テーブル、およびビューと一時テーブルに対する Update と Select の違い

1. テーブルAのデータを使用してMySQLのテーブルBの内容を更新するたとえば、データ テーブル内...

Windows での MySQL 8.0.13 解凍バージョンのインストール グラフィック チュートリアル

この記事では、参考までにMySQL 8.0.13のインストールグラフィックチュートリアルを紹介します...

Docker での FastAPI デプロイの詳細なプロセス

Docker 学習https://www.cnblogs.com/poloyy/p/15257059...

CSS3 を使用したテキスト折り紙効果のサンプルコード

序文この記事では主に、CSS3 を使用してテキスト折り紙効果を実現する例を紹介します。これは、参考と...

MySQLが日付フィールドインデックスを使用しない理由の要約

目次背景探検する要約する背景テーブルでは、dataTime フィールドは varchar 型に設定さ...

Chrome プラグイン (拡張機能) 開発ガイド (完全デモ)

目次前面に書かれた序文ChromeプラグインとはChrome プラグイン開発を学ぶことの意義は何です...

MySQLクエリ文の実行プロセスを理解するための記事

序文要件を満たす特定のデータをデータベースから取得する必要があります。Select ABC FROM...

Dockerコンテナがホストポートにアクセスできない場合の解決策

最近、仕事中に問題が発生しました。Docker コンテナがホストの redis にアクセスできず、t...

独自の FTP および SFTP サーバーを構築するプロセスの紹介

FTP と SFTP はファイル転送プロトコルとして広く使用されています。関連する機能を開発するには...

JavaScriptがDOMツリーの構築にどのように影響するかについて詳しく説明します。

目次ドキュメント オブジェクト モデル (DOM) DOM と JavaScript DOMツリーの...

MySQL REVOKE でユーザー権限を削除する

MySQL では、REVOKE ステートメントを使用してユーザーの特定の権限を削除できます (ユーザ...

nginx が複数のプロキシ層を通過して実際の送信元 IP を取得するプロセスの詳細な説明

質問Nginx は $remote_addr を実際の IP アドレスとして受け取りますが、実際には...

JDBC 探索 SQLException 分析

1. SQLExceptionの概要JDBC を使用してデータ ソース (この記事のデータ ソースは...