GNU/Linux >> Linux の 問題 >  >> Panels >> Docker

Dockerイメージマニフェストとは何ですか?

Dockerマニフェストは、イメージ内のレイヤーを記述します。マニフェストを使用すると、異なるタグが割り当てられている場合でも、2つの画像を正確に比較できます。

マニフェストはJSONで表現され、画像のレイヤーとアーキテクチャに関する情報が含まれています。 Dockerクライアントはマニフェストを使用して、イメージが現在のデバイスと互換性があるかどうかを判断します。次に、その情報を使用して、新しいコンテナを開始する方法を決定します。

マニフェストフォーマット

マニフェストスキーマは現在バージョン2です。完全なファイルはそのスキーマバージョンを宣言し、次にイメージで使用可能なマニフェストエントリのリストを宣言します。各エントリは、x86やARM64などの画像のさまざまなバリエーションを表します。

docker manifest inspectを使用して、任意の画像のマニフェストを表示できます 指図。これは、ローカルイメージとDockerHubなどのリモートレジストリに保存されているイメージの両方で機能します。

docker manifest inspect my-image:latest

マニフェストは、画像に含まれるレイヤーのリストです。レイヤーのコンテンツのハッシュと全体のサイズを確認できます。

--verboseを追加した場合 フラグを立てると、画像に関するさらに多くの情報が得られます。これには、画像のタグが含まれます(Ref内) フィールド)、そのアーキテクチャ、およびそのオペレーティングシステム。

Dockerは、デフォルトでは、安全でないレジストリからマニフェストの詳細をロードしません。不適切に保護されたレジストリを使用する必要がある場合は、--insecureを追加してください docker manifestにフラグを立てます コマンド。

マニフェストとマルチアーチビルド

これまで、Dockerは複数のイメージアーキテクチャをサポートしていませんでした。イメージは、それらが構築されたものと同じアーキテクチャのマシンでのみ使用できました。 Dockerがサーバー環境や新しいARMベースのマシンでより多くの用途を見つけたため、これはすぐに制限を示しました。

マニフェストは、画像の一意の識別を可能にするだけでなく、マルチアーキテクチャの構築を容易にします。複数のアーキテクチャをサポートする画像を調べると、微妙に異なるマニフェスト出力が表示されます。

docker manifest inspect php:latest

上記のコマンドを実行すると、公式のPHPDockerイメージのマニフェストが表示されます。スクリーンショットから、AMD64やARMなどのいくつかのプラットフォームオプションが利用可能であることがわかります。サポートされている8つの異なるアーキテクチャを実際に含む完全なリストを切り捨てました。

マニフェストを使用すると、画像の作成者は1つの画像タグで複数のアーキテクチャのサポートを宣伝できます。 Dockerクライアントは、リスト内のオプションに基づいて、プラットフォームに適したイメージバージョンを選択します。作成者は、同一の機能を提供するイメージのみをグループ化することが期待されます。ターゲットのアーキテクチャまたはオペレーティングシステム以外に変更を加えることはできません。

リスト内の各アーキテクチャは、別のを参照しています。 digestを介してマニフェスト 分野。参照されるマニフェストは、通常の単一アーキテクチャファイルになります。 Dockerは、現在のプラットフォームを適切な単一アーチマニフェストと照合し、そのファイルを読み込んで、画像レイヤーの最終的なリストを決定します。

docker manifestを使用して、マルチアーキテクチャイメージを手動で作成できます 指図。個々のイメージをそれぞれ作成し、レジストリにプッシュします。次に、docker manifest createを使用します 1つのタグの下で画像を新しい共有マニフェストに結合するコマンド。

# on an AMD64 machine
docker build -t my-image:amd64 .
docker push my-image:amd64

# on an ARM machine
docker build -t my-image:arm .
docker push my-image:arm

# now combine the manifests
docker manifest create my-image:latest 
--amend my-image:x64
--amend my-image:arm
docker manifest push my-image:latest

manifest createの使用 --amendを使用 フラグを使用すると、複数の独立したマニフェストをマージできます。次に、最終的なマニフェストがlatestを使用してDockerHubにプッシュされます。 鬼ごっこ。 AMD64とARMの両方のユーザーは、このイメージからコンテナーを作成できます。

マルチアーチ画像を手動で組み立てる必要はありません。 buildxを使用できます 代わりに、プロセスを大幅に簡素化するコマンド。

docker buildx build --platform linux/amd64,linux/arm64/v8 --tag my-image:latest

この単一のコマンドにより、AMD64プラットフォームとARM64プラットフォームの両方で機能するイメージが生成されます。内部的には、まだ複数のアーチのマニフェストリストが作成されているため、画像がどのようにリンクされるかについての内部の仕組みを理解するのに役立ちます。

注釈マニフェスト

Dockerを使用すると、アノテーションを使用してマニフェストデータを手動でオーバーライドできます。サポートされているフィールドには、アーキテクチャとオペレーティングシステムの情報が含まれます。

docker manifest annotateを使用する 注釈を設定するコマンド。単一のアーキテクチャの画像に注釈を付ける場合は、それを参照する画像タグを指定します。マルチアーチ画像の場合、全体的な画像タグと、マルチアーチマニフェストリスト内の個々のマニフェストのタグの両方が必要になります。

docker manifest annotate my-image:latest my-image:amd64 --os-version linux

このコマンドは、AMD64バージョンのmy-image:latestをマークします Linuxベースのコンテナとしてのイメージ。

多くの場合、注釈を手動で設定する必要はありません。これらは通常、ビルド環境から自動的に推測されます。 annotateを使用できます 不足しているフィールドを追加したり、将来的に画像構成を変更したりするコマンド。

概要

Dockerマニフェストは、イメージのレイヤーとそれがサポートするアーキテクチャを記述します。マニフェストは、特定のプラットフォームをサポートする単一のアーキテクチャ、またはマルチアーキテクチャのいずれかです。後者の場合、ファイルには、組み込まれている単一アーチマニフェストへの参照のリストが含まれています。

マニフェストを手動で操作することはまれですが、docker manifestを使用すると可能です。 コマンドグループ。簡素化されたマニフェストアセンブリエクスペリエンスを提供するBuildxを介してマルチアーチビルドを自動化することがより一般的になりました。


Docker
  1. Docker(およびLinuxコンテナー)とは何ですか?

  2. Dockerイメージからファイルを抽出しますか?

  3. Docker イメージ/コンテナの中身は?

  1. Dockerfileを使用してDockerイメージを構築する方法

  2. Dockerイメージを変更する方法

  3. Dockerイメージに基づいてデプロイされたコンテナーを更新する

  1. 黄金のイメージとは何ですか?

  2. Docker Composev2の新機能

  3. Dockerイメージに変更をコミットする方法