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

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

今日はコンテナ レイヤーの概念について見ていきます。

前のセクションでは、コンテナはプロセスであることを学びました。このプロセスに基づいて、次の 3 つの部分が追加されます。

1. 物理マシンからの分離を実現するために、Linux 名前空間構成を開始します。

2. コンテナ リソースを制限するために Cgroups パラメータを設定します。

3. システムファイルディレクトリ、つまりrootfsファイル(ミラーファイルとも呼ばれる)を生成します。

ここで注意すべき点は、rootfs はコンテナが使用する必要がある基本ファイルの組み合わせのみであり、オペレーティング システム カーネルは含まれていないことです。コンテナのオペレーティング システム カーネルは、引き続きホスト マシンのカーネルを使用します。もちろん、rootfs の存在は無意味ではありません。rootfs の存在により、コンテナは最も重要なパフォーマンスである一貫性を実現できます。

01 コンテナの一貫性

コンテナの rootfs には、すべての依存関係を含むオペレーティング システムのすべてのファイルとディレクトリがパッケージ化されています。この機能により、コンテナがローカルにあるかクラウドにあるかに関係なく、ユーザーはパッケージ化されたコンテナ イメージを解凍するだけで、アプリケーションの実行環境がセットアップされます。

これはコンテナの一貫性です。

02 レイヤーの概念

「私が遠くまで見渡せるのは、巨人の肩の上に立っているからだ」とニュートンはかつて言いましたが、それは今でも当てはまります。 「車輪の再発明はしない」。アプリケーションを開発するときは、Linux オペレーティング システムを使用するだけで済みます。アプリケーションを実行するために Linux システムを再開発する必要はありません。

コンテナの使用中に、データ A が含まれた既存の MySQL コンテナ イメージがすでに存在し、他の人も MySQL コンテナ イメージを使用してデータ B をインポートする必要がある場合、自分の MySQL コンテナでデータ A を削除し、データ B を再インポートするだけで済みます。

上記のシナリオでは、データ A が削除され、データ B がインポートされると、データ A が削除されているため、このコンテナーを自分で使用することはできません。これは明らかに私たちが望んでいる結果ではありません。当然のことながら、データセット A とデータセット B の両方に、MySQL がインストールされているがデータがないコンテナ イメージ (つまり、rootfs) が必要です。

Docker ソフトウェアが設計されたときに、「レイヤー」という概念が導入され、この問題は巧みに解決されました。

「レイヤー」の概念は、ユニオン ファイル システム AuFS を通じて実装されます。正式名称は Advance UnionFS です。その概念は、以下に示すように、理解するのが難しくありません。

ディレクトリ1にはファイルa、ファイルcが含まれています

ディレクトリ2にはファイルb、ファイルcが含まれています

ファイルを結合することで、ディレクトリ 1 と 2 がディレクトリ 3 にマウントされます。この時点で、ディレクトリ 3 には a、b、c の 3 つのファイルがあります。

このとき、ディレクトリ 3 内のファイル a、b、c が変更されると、対応するディレクトリ 1 と 2 にも反映されます。

「ユニオン ファイル システム」を通じてレイヤーを実装する方法は、実際にはかなり複雑な問題なので、興味のある読者に考えてもらうことにします。ここでは、レイヤーの概念がユニオン ファイル システムを通じて実装されることを理解するだけで十分です。

以下は、mysql ベース イメージの「レイヤー」の例です。

[root@VM-0-14-centos ~]# docker イメージを検査する docker.io/mysql
 [
    {
        「ID」: 「sha256:db2b37ec6181ee1f367363432f841bf3819d4a9f61d26e42ac16e5bd7ff2ec18」、
        「リポジトリタグ」: [
            「docker.io/mysql:最新」
        ]、
......
        「ルートFS」: {
            「タイプ」:「レイヤー」、
            「レイヤー」: [
                "sha256:d0fe97fa8b8cefdffcef1d62b65aba51a6c87b6679628a2b50fc6a7a579f764c",
                "sha256:329fe06a30f03f9131ce8d9db2e8a9f725b18efe3457d6f015e1c4d8a3f41a0a",
                "sha256:ec8c80284c72bcf47ffedc0dde4d5792de761d52f974c30d37d52b9ac00e8a2a",
                "sha256:9dae2565e824235798981525d6ff9114817b7139c073e0d216b00ae9e58f74d0",
                "sha256:36b89ee4c647b9c21de8b5476b4922efc873aba69705c169e1a3edcf9128679b",
                "sha256:c21e35e55228365b268f57fac382a6e991db216cb03d9b7079496f5498956ab0",
                "sha256:15b463db445cb750fa6bc908a41fd18e38c4d2a02a978b66beb598c4f3f57b95",
                "sha256:7832ac00d41eda3a773a18408dea0b8e05ddbdd3a1e94afef3b6e3dc6444b7bb",
                "sha256:7f893b7c04ac2f939737d2da4e15af796c7acc0fd10c2951d9ae5bf33ceec2dc",
                "sha256:060fef62a228fff7e9dc3b7008bc9089e642ef29dc699f7e90c36ced5b2e75c6",
                "sha256:af6e790b82373cc65ca73efe5cc8945731525a9dcae6deeea2a5a5802561a72a",
                「sha256:9b0377a95c0e0bd5aa5b220449d17333faaa0e2bd7e8b93565beeadbf3906646」
            ]
        }
    }
]

ご覧のとおり、RootFS はコンテナのファイルシステムであり、Layers は「レイヤー」です。

では、Docker コンテナ イメージはどのようなレイヤーで構成されているのでしょうか? ? ?

機能の違いにより、主に読み取り専用層、初期化層、読み書き層に分けられます。

読み取り専用レイヤー:

読み取り専用レイヤーは読み取り専用でマウントされます。これらのレイヤーは、オペレーティング システムの一部を段階的にマウントします。

読み取り/書き込みレイヤー:

これはイメージの最上位レイヤーであり、マウント モードは読み取り/書き込みです。ファイルを書き込む前は、このディレクトリは空です。コンテナー内で書き込み操作を実行すると、変更したコンテンツがこのレイヤーに増分的に表示されます。

初期化レイヤー:

init レイヤーは、docker によって特別に生成される内部レイヤーで、主に /etc/hosts や /etc/resolv.conf などのファイルが格納されます。

これらの特定のファイルを保存する理由は、これらのファイルは元々オペレーティング システムの一部ですが、ユーザーのアプリケーションによって頻繁に変更されるためです。これらの変更は現在のコンテナーに対してのみ有効です。Docker がコミットするときに、これらの変更が読み取り/書き込みレイヤーと一緒に送信されることは望ましくありません。

いくつかの注意事項:

1. ユーザーが docker commit を実行すると、読み取り/書き込みレイヤーの内容のみがコミットされます。

2. 読み取り専用レイヤー ファイル a.txt を削除する場合は、読み取り/書き込みレイヤーに同じ名前 .wh.a.txt のファイルを書き込むだけです。このようにして、a.txt ファイルは .wh.a.txt ファイルによって隠され、削除の目的が達成されます。

03 レイヤードデザインの利点

階層化された設計と増分データ操作により、毎回取得および変更されるコンテンツは、完全なオペレーティング システムよりも小さくなります。

基礎となる読み取り専用レイヤーを共有することで、複数のコンテナ イメージによって使用される合計スペースが、各コンテナ イメージの合計よりも小さくなります。

同時に、コンテナ イメージに基づくチーム コラボレーションにより、さまざまな企業や分野の人々を結び付け、新しい機能をより迅速に反復することができます。

以上がDockerコンテナレイヤーの概念の詳細な説明です。Dockerコンテナレイヤーの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Dockerイメージの階層化の原理の詳細な説明
  • Docker基盤技術の適用に関する詳細な説明 名前空間Cgroup
  • Dockerイメージの階層化に関する考慮事項の簡単な分析

<<:  ウェブページサイズに関する調査

>>:  CSS マージンの重複とその防止方法

推薦する

AIX マウント NFS の書き込み効率が低い場合の解決策

NFSが提供するサービスマウント: サーバー上で /usr/sbin/rpc.mountd サーボ ...

TypeScript ジェネリックを簡単に説明する方法

目次概要ジェネリック医薬品とはビルドシステムジェネリック医薬品の一般的な理解ジェネリッククラスジェネ...

MySQL 8.0.3 RCがリリースされようとしています。変更点を見てみましょう。

MySQL 8.0.3がリリースされます。新機能を見てみましょうMySQL 8.0.3 は RC ...

Dockerイメージ送信コマンドcommitの動作原理と使い方の詳細な説明

ローカルでコンテナを作成した後、このコンテナに基づいてローカル イメージを作成し、このイメージを D...

MySQLで大きなテーブルを正常に削除する方法の詳細な説明

序文テーブルを削除するには、無意識に思い浮かぶコマンドは、DROP TABLE "テーブル...

航空機戦争ゲームを実装するためのネイティブJS

この記事の例では、参考のために航空機戦争ゲームを実装するためのJSの具体的なコードを共有しています。...

Vueはダイアログのカプセル化を実装します

目次Vue2 ライティングVue3プラグインのバージョンの記述Vue3 動的コンポーネントの記述書き...

JavaScript の instanceof メソッドの手動実装

1. instanceofの使用法instanceof演算子は、コンストラクター関数のprototy...

実用的な基本的な Linux sed コマンドのサンプルコード

Linux ストリーム エディターは、データ センターでスクリプトを実行するのに便利な方法です。これ...

ハイパーリンクのWebデザイン原則

<br />関連記事: Web コンテンツ ページ作成のための 9 つの実用的なヒント、...

Linux の総合システム監視ツール dstat の詳細な例

オールラウンドなシステム監視ツール dstat dstat は、vmstat、iostat、nets...

Dockerイメージを素早くデプロイして実行する最新のIDEAプロセスの詳細な説明

背景docker とアイデアを使用して、Java Web の開発、展開、運用までのプロセス全体を実現...

Linux での mysql および mysql.sock のインストールに関する問題

最近、Linux に Aphace、mysql、php をインストールするときに多くの問題に遭遇しま...

Vue はシームレスなカルーセル効果を実現

この記事では、シームレスなカルーセル効果を実現するためのVueの具体的なコードを参考までに紹介します...