Dockerイメージの階層化の原理の詳細な説明

Dockerイメージの階層化の原理の詳細な説明

ベースイメージ

ベースイメージには 2 つの意味があります。

  • 他のイメージに依存せず、ゼロから構築します
  • 他の画像も拡大できます

したがって、ベースイメージは通常、Ubuntu、Debian、CentOS などのさまざまな Linux ディストリビューションの Docker イメージです。

ベース イメージは、最小限のインストールで Linux ディストリビューションを提供します。

ほとんどのイメージはベースイメージに基づいて構築されます。そのため、通常は公式にリリースされたベースイメージが使用されます。 Docker Hub で見つけることができます。たとえば、centos: https://hub.docker.com/_/centos

Docker ベースイメージを自分で構築することも、既存のベースイメージを直接使用することもできます。たとえば、centos。 Docker Hub から直接プルできます。
引く

docker プル CentOS

チェック

docker イメージ Centos 
リポジトリ タグ イメージ ID 作成 サイズ
centos 最新 1e1148e4cc2c 2か月前 202MB

最新の CentOS イメージは 200 MB しかないことがわかります。小さすぎると思いますか?これは、Docker イメージが実行時に Docker ホスト マシンのカーネルを直接使用するためです。

Linux オペレーティング システムは、ユーザー空間とカーネル空間で構成されています。

カーネル空間はカーネル、ユーザー空間は rootfs です。異なるディストリビューション間の違いは主に rootfs です。たとえば、Ubuntu 14.04 ではサービス管理に upstart を使用し、ソフトウェア パッケージの管理に apt を使用しますが、CentOS 7 では systemd と yum を使用します。これらはユーザー空間での違いであり、カーネルには大きな違いはありません。

したがって、Docker は複数の Linux イメージを同時にサポートし、さまざまなオペレーティング システム環境をシミュレートできます。

ベースイメージには同じユーザー空間とリリースバージョンのみが含まれており、カーネル空間では Docker ホストマシンのカーネルが使用されます。

ストレージ構造

上記はベースイメージをダウンロードする方法を示しています。通常、このベースイメージに基づいて独自のイメージを構築します。たとえば、CentOS に nginx ロード バランシングを追加します。まず、画像の構造がどのようなものかを理解する必要があります。

公式ドキュメント: https://docs.docker.com/storage/storagedriver/

Dockerイメージのレイヤー構造

画像を開始すると、新しい書き込み可能なレイヤーが画像の上に読み込まれます。このレイヤーは通常「コンテナ レイヤー」と呼ばれ、その下には「イメージ レイヤー」があります。

コンテナ レイヤーは読み取りと書き込みが可能で、コンテナ内のすべてのファイルの変更と書き込みはこのレイヤーで行われます。イメージレイヤーは読み取り専用で、読み取りのみが許可されます。

コピーオンライト

Docker は、変更時のコピー戦略を使用して、ベースイメージのセキュリティを確保するとともに、パフォーマンスとスペースの使用率を高めます。

  • コンテナがファイルを読み取る必要がある場合

一番上の画像レイヤーから下に向かって検索します。見つかったらメモリに読み込みます。すでにメモリ内にある場合は、そのまま使用できます。つまり、同じマシン上で実行されている Docker コンテナは実行時に同じファイルを共有します。

  • コンテナがファイルを変更する必要がある場合

上から下まで検索し、見つかったらコンテナ レイヤーにコピーします。コンテナの場合、コンテナ レイヤーのファイルは表示されますが、イメージ レイヤーのファイルは表示されません。その後、コンテナ レイヤーのファイルを直接変更できます。

  • コンテナがファイルを削除する必要がある場合

上から下まで検索し、見つかったらコンテナに削除を記録します。これは実際の削除ではなく、ソフト削除です。これにより、画像のサイズは減少するのではなく、増加するだけです。

コンテナにファイルを追加する必要がある場合、イメージ レイヤーに影響を与えることなく、最上位のコンテナ書き込み可能レイヤーに直接追加されます。

画像の合理化と最適化

ベースイメージの最適化

ベース イメージを選択するときは、適切な小さいイメージを選択します。一般的に使用される Linux システム イメージには、Ubuntu、CentOs、Alpine などがあります。

Dockerfile命令の連鎖

Dockerfile では、各命令によってイメージ レイヤーが作成され、イメージのサイズが増加します。現在のレイヤーへの変更は、前のレイヤーには影響しません。

  • && を使用して命令を連結します(RUN命令内)
  • ソフトウェアをインストールした後は必ずクリーニングしてください

具体的な例は以下のとおりです。

カスタム Dockerfile:

ubuntu:14.04から
#基本ソースイメージ MAINTAINER xiongkun
#イメージの作成者、名前、メールアドレスを記入してください WORKDIR /home
実行 dd if=/dev/zero of=50M.file bs=1M count=50
#サイズ50Mのテストファイルを作成する RUN rm -rf 50M.file
#ファイルを削除する

最適化された Dockerfile:

ubuntu:14.04から
#基本ソースイメージ MAINTAINER xiongkun
#イメージの作成者、名前、メールアドレスを記入してください WORKDIR /home
実行 dd if=/dev/zero of=50M.file bs=1M count=50 && rm -rf 50M.file
#ファイルを作成し、同じレイヤーで削除する

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Docker イメージの階層化に関する詳細な理解 (初心者必読)
  • Dockerイメージレイヤリングの実装を徹底的に理解する
  • Docker イメージの階層化と Dockerfile の記述スキル
  • Dockerファイルの階層化の原則の詳細な分析

<<:  JavaScript における変数と関数の昇格の詳細な例

>>:  SQLクエリの実行順序をゼロから学ぶ

推薦する

アイデアを war パッケージにパッケージ化し、tomcat にデプロイしてアクセス パスの問題 (図とテキスト)

Web プロジェクトを war にパッケージ化するアイデアにとって最も重要なことは、アトリフィカを...

JavaScript PromiseとAsync/Awaitの詳細な説明

目次概要4つの例例1: 誕生日で説明する約束の基本例2: 数字当てゲーム例3: Web APIから国...

Linuxシステムのログの詳細な紹介

目次1. ログ関連サービス2. システム内の共通ログファイル1. ログ関連サービスCentOS 6....

メモリの原則に関する詳細な説明: JS では変数はヒープに保存されるのか、スタックに保存されるのか?

目次1. 冷蔵庫に入りきらない象2. シャドウクローン文字列3. 実際に見た「奇妙なボール」 4. ...

MySQL は information_schema オブジェクトの付与をバイパスし、ERROR 1044 (4200) エラーを報告します

この質問は、MySQL の権限に関する WeChat グループのネットユーザー間の議論です。次のよう...

CSS3のbox-shadowプロパティの使い方の詳細な例

CSS には多くの属性があります。特に複数の値を設定する必要がある属性は、長期間使用しないと忘れられ...

入力[type=file]の起動が遅くて動かなくなる問題を素早く解決します

入力タグタイプがファイルで、タグ内にaccpet="image/*"属性が設定さ...

MySQLが2つのテーブルを関連付ける際のエンコードの問題と解決策

Mysqlが2つのテーブルを関連付けると、次のエラーメッセージが生成されます:照合順序の不正な組み合...

Centos7 での Rsync+crontab 定期同期バックアップ

最近、社内の重要なサーバデータを定期的にストレージにバックアップし、ついでにメモしておきたい以前、W...

MySQLをインストールして設定し、ルートパスワードを変更する方法

1. インストールapt-get install mysql-server にはアカウントとパスワー...

フロントエンドJavaScript ES6の詳細について

目次1. はじめに1.1 Babel トランスコーダ1.2 ポリフィル2. let と const ...

Alibaba Cloud ESC に MYSQL8.0 をインストールするチュートリアル

接続ツールを開きます。私はMobaXterm_Personal_12.1を使用します(公式サイトのダ...

Linux lsof コマンドの使用方法の詳細な説明

lsof (開いているファイルのリスト) は、プロセスによって開かれたファイルを表示するツールです。...

MySQLからMariaDBへのスムーズな移行のための詳細な手順

1. MariaDB と MySQL の紹介1. MariaDB の紹介MariaDB は、MySQ...

vue3 のコンポーネントの互換性のない変更の詳細な説明

目次機能コンポーネント非同期コンポーネントの書き方とdefineAsyncComponentメソッド...