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 がデフォルトのデータベース パスを変更したため、サービスを開始できませんでした。ログ...

MySQLデータベースは重複データを削除し、メソッドインスタンスを1つだけ保持します

1. 問題の紹介ユーザー テーブルに 3 つのフィールドが含まれているシナリオを想定します。 id、...

Tencent Cloud 上で Hadoop 3.x 疑似クラスターを構築する方法を説明します

1. 環境整備CentOS Linux リリース 7.5.1804 (コア)インストールフォルダを作...

通知メッセージカルーセルを実装するための CSS3 トランジション

Vueバージョンをファイルにコピーして使用します <テンプレート> <!-- カル...

Centos8 の Django プロジェクトに nginx+uwsgi をデプロイするチュートリアル

1. 仮想環境virtualenvのインストール1. virtualenvをインストールするpip3...

MySQLの水平および垂直テーブルパーティションの説明

前回の記事で、MySQL ステートメントの最適化には限界があると述べました。MySQL ステートメン...

MYSQLは、ショッピングカートに追加する際に重複追加を防ぐためのサンプルコードを実装します。

序文最近、仕事の都合で、APP ショッピングカートの注文支払いに取り組んでいました。テスト中にバグが...

ウェブデザインのためのオンライン開発ツール10選の紹介

1. オンラインテキストジェネレーターBlindTextGenerator: デザイナーにとって、こ...

VMware10 での CentOS 7 のインストールと設定のチュートリアル

Ubuntu が今日のデスクトップ ユーザーの間で最も人気のある Linux オペレーティング シス...

JavaScript で虫眼鏡の特殊効果を実現

達成される効果:マウスを小さな画像の上に置くと、小さなブロックが小さな画像の上に表示され、この小さな...

1 つ以上のフィールドに基づいて重複データを検索する MySQL SQL ステートメント

SQLはテーブル内の重複レコードをすべて見つけます1. テーブルには id と name の 2 つ...

デザイナーが再びハマーの公式サイトに不満を述べる

昨年、この公開書簡は大ヒットし、羅永浩氏を驚かせた。今日、著者が新しい章を発表するとは思ってもみなか...

MySQL ルートパスワードを変更する複数の方法 (推奨)

方法1: SET PASSWORDコマンドを使用する MySQL -u ルート mysql> ...

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

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