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

推薦する

HTML マークアップ言語 - フォーム

123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...

MySQLは、where in()順序ソートを実装するためにfind_in_set()関数を使用します。

この記事では、MySQL で find_in_set() 関数を使用して where in() の順...

Kubernetes を使用して Springboot または Nginx をデプロイするための詳細なチュートリアル

1 はじめに「Maven がワンクリックで Springboot を Docker リポジトリにデプ...

ブラウザでのjsのイベントループイベントキューの詳細な説明

目次序文スタックと2つのキューを理解する実行プロセス簡単な例より難しい例要約する序文以下の内容はブラ...

Linux でシステム ディスクを初期化した後にデータ ディスクを再マウントする方法

Linuxインスタンスでシステムディスクを初期化した後、データディスクを再マウントするLinux イ...

Linux システムで httpd の自動インストールと構成を Ansible で実装する方法

1. Ansibleのプレイブックを使用してhttpdを自動的にインストールする1) まず、Ansi...

組み込み Linux 開発環境で ping と nfs を構築するためのソリューション

1. 組み込みソフトウェアレベル 1) ブートローダ -> ブートローダ組み込みシステム全体の...

純粋な CSS で実装された 3 つの通知バーのスクロール効果

序文通知バー コンポーネントは、比較的一般的なコンポーネントです。基本的に、すべてのサイトにこのよう...

MySQLデータベースのトランザクション分離レベルの詳細な説明

データベーストランザクション分離レベルデータベース トランザクションには、低から高まで 4 つの分離...

ウェブサイトの速度を上げる6つの方法

1. .js ライブラリ ファイルのアドレスを Google CDN アドレスに置き換えます。 (G...

Golang を使って Docker API を実際に操作する

目次SDKのインストールローカル Docker の管理コンテナの実行バックグラウンドでコンテナを実行...

Windows での Tomcat サーバーのインストールに関するチュートリアル

1 ダウンロードして準備するまず、公式ウェブサイトからTomcatをダウンロードする必要があります。...

スキン効果を実現するJavaScript(背景の変更)

この記事では、スキン変更効果を実現するためのJavaScriptの具体的なコードを参考までに紹介しま...

スパンの最小高さを定義するソリューションは効果がありません

span タグは HTML ウェブページを作成するときによく使用されますが、このタグの使い方がよくわ...

画像ブラインド表示の効果を実現するための純粋な CSS の例

まず、完成した効果をお見せしましょう 主なアイデア: 実際、このブラインドは一種の手品を使用していま...