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 マージンの重複とその防止方法

推薦する

最適なウェブページ幅とその互換性のある実装方法

1. Web ページをデザインするときに、幅を決定するのは非常に面倒な作業です。 jb51.net ...

20個のJavaScriptワンラインコードを共有する

目次1. ブラウザのクッキーの値を取得する2. RGBを16進数に変換する3. クリップボードにコピ...

MySQLトリガーの使用

トリガーにより、ステートメントの実行前または実行後に他の SQL コードを実行できます。トリガーは、...

CSS3のボックスサイズプロパティの興味深いボックスモデルについての簡単な説明

誰もがボックス モデルの構成を、内側から外側まで、コンテンツ、パディング、境界線、マージンについて知...

Vueはフォーム検証機能を実装します

この記事では主に、NUXT の validate メソッドに基づいてフォーム検証を実装する方法につい...

テーブル関連の配置とJavascript操作テーブル、tr、td

適切に機能するテーブル プロパティ設定:コードをコピーコードは次のとおりです。 <テーブル セ...

Echarts 基本入門: 棒グラフと折れ線グラフの一般的な構成

1eChartsの基本手順4つのステップ1 DOMコンテナを見つける2 初期化3 設定オプション4 ...

JS は Web ページナビゲーションバーの特殊効果を実現します

この記事では、ネイティブ JS を使用して実装された実用的な Web ナビゲーション バー効果を紹介...

Dockerコンテナが起動直後に終了する問題を解決する

最近、Docker がコンテナの起動時に特定のプロセスを直接実行できるようにする方法を調べていたとこ...

テーブル内の要素のドラッグと並べ替えの問題について簡単に説明します

最近、要素テーブルを使用すると、並べ替えの問題によく遭遇します。単純な並べ替えであれば、要素の公式が...

HTML テーブル マークアップ チュートリアル (38): ヘッダーの境界線の色属性 BORDERCOLOR

テーブルを美しくするために、ヘッダーに異なる境界線の色を設定できます。基本的な構文<TH 境界...

CSS グリッドレイアウトで列にアイテムを埋め込む方法

n 個のアイテムがあり、これらのアイテムをグリッド レイアウトの列に並べ替える必要があるとします。列...

VMware ESXi 6.0 および仮想マシンのインストール チュートリアルの展開 (画像とテキスト)

社内には以前からアイドル状態だった、構成の整ったサーバーがあったので、EXSI 6.0 を使って複数...

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

この記事では、MacOSでのMySQL 8.0.18のインストールと成功したコマンドライン操作を記録...

CSSのoutline-offsetプロパティを使用してプラス記号を実装する

次のような初期コードがあると仮定します。 <!DOCTYPE html> <htm...