このトピックの唯一の doc は、マニフェストが何であるか、それが解決する問題、およびそれがドッカーエコシステムにどのように適合するかをすでに知っていることを前提としているようです。ドキュメントを読んだ後、マニフェストが実際にどのように機能するかまだわかりません。
私のプライベートGCRにはマニフェストファイルが含まれています。実際にはその目的を理解しないでください。 Dockerハブもマニフェストファイルを使用しますか?レイヤーと各レイヤーのハッシュが含まれていることがわかりますが、Dockerがそれらをどのように生成/使用するかについてはまだわかりません。
コンテナマニフェストの目的は何ですか?
マニフェストタイプは、事実上、JSONで表現された名前付き/タグ付き画像の説明です。この説明(マニフェスト)は、Dockerエンジンのようなコンテナーランタイムが使用するためのものです。
Dockerディストリビューションv2 API/v2.2イメージ仕様のサポートがあると主張するレジストリまたはランタイムは、さまざまなマニフェストタイプと相互作用して次のことを確認します。
Dockerfile
で表される)。前述の回答として、レジストリと通信するクライアント(docker pull
実装など)はDocker v2 APIを介して対話し、最初に特定のイメージ/タグのマニフェストをフェッチしてから、さらに何をダウンロードするかを決定しますこのイメージに基づいてコンテナを実行できます。 v2マニフェスト形式には署名がエンコードされていませんが、 notary server などのツールを使用した外部検証を使用して、完全な暗号化信頼のために同じ「blob」/ハッシュのコンテンツで外部署名を検証できます。 Dockerはこれを「Docker Content Trust」と呼びますが、レジストリと通信する場合はこれを必要としません。また、画像レジストリと通信する場合はAPIフローの一部でもありません。
V2.2仕様のマニフェストに関する追加の詳細:標準のマニフェストタイプだけでなく、レジストリが表すことができるmanifest listタイプもあります単一の「image:tag
」参照の下での複数のプラットフォーム(CPUまたはオペレーティングシステムのバリエーション)のサポート。マニフェストリストには、既存のマニフェストへのリダイレクタを備えたプラットフォームエントリのリストが含まれているだけなので、エンジンはその特定のプラットフォーム/アーキテクチャの組み合わせに対して正しいコンポーネントを取得できます。現在のDockerHubでは、すべての公式画像が実際にマニフェストリストになり、同じ画像name:tag
の組み合わせを使用して多くのプラットフォームをサポートできるようになりました。レジストリ内のエントリを照会し、それらがマニフェストリストであるかどうかを表示し、マニフェストの内容(マニフェストリストと「通常の」マニフェストの両方)をダンプできるツールがあります。 manifest-tool GitHub repository で詳細を読むことができます。
コンテナ化設計に関するこの講演 のスライド12には、マニフェストリストが特定のプラットフォームのイメージ構成とレイヤーを表すマニフェストにリンクする方法の素敵なグラフィカル表現もあります。
image
は、JSONマニフェストと個々のレイヤーファイルの組み合わせです。画像を取得するプロセスは、これらの2つのコンポーネントを取得することを中心にしています。したがって、画像ファイルをプルするとき:
マニフェストを取得:
GET /v2/<name>/manifests/<reference>
マニフェストが手元にある場合、クライアントは名前とレイヤーが有効であることを確認するために署名を検証する必要があります。
次に、クライアントはダイジェストを使用して個々のレイヤーをダウンロードします。レイヤーは、V2
レジストリAPIにblobs
として保存され、ダイジェストによってキー設定されます。