はじめに
この実験では、docker manifest annotate コマンドを使用して、Docker マニフェストリストにプラットフォーム情報を追加する方法を学びます。まず、alpine イメージの異なるアーキテクチャバージョンを含むマニフェストリストを作成します。
マニフェストリストを作成した後、リスト内の個々のマニフェストに注釈を付けて、アーキテクチャ、オペレーティングシステム、OS 機能、バージョン、およびアーキテクチャバリアントを指定する練習を行います。最後に、注釈を付けたマニフェストリストを調べて、追加されたプラットフォーム情報を確認します。このプロセスは、マルチアーキテクチャの Docker イメージを効果的に構築および配布するために不可欠です。
マニフェストリストを作成する
このステップでは、マニフェストリストを作成する方法を学びます。マニフェストリストはイメージマニフェストのインデックスで、単一の名前で異なるアーキテクチャやオペレーティングシステム用の複数のイメージを参照できます。これはマルチアーキテクチャイメージを配布する際に特に有用です。
マニフェストリストを作成する前に、いくつかのイメージが必要です。この実験では、異なるアーキテクチャ用の alpine イメージを使用します。alpine イメージの amd64 および arm64 バージョンを取得します。
まず、alpine イメージの amd64 バージョンを取得します。
docker pull alpine:latest
イメージが取得されて展開されていることを示す出力が表示されるはずです。
次に、alpine イメージの arm64 バージョンを取得します。この取得ではプラットフォームを指定する必要があることに注意してください。
docker pull --platform arm64 alpine:latest
再び、イメージが取得されていることを示す出力が表示されます。
これでイメージが揃ったので、マニフェストリストを作成できます。docker manifest create コマンドを使用します。このコマンドは、作成したいマニフェストリストの名前を指定し、その後にリストに含めたいイメージの名前を指定します。
alpine:latest (amd64) と alpine:latest (arm64) イメージを含む my-alpine-list という名前のマニフェストリストを作成しましょう。
docker manifest create my-alpine-list alpine:latest alpine:latest --amend --amend
--amend フラグは、マニフェストリストのエントリを追加または更新するために使用されます。ここでは 2 つのイメージを追加しているため、2 回使用しています。
このコマンドを実行すると、マニフェストリストが作成されます。ただし、このリストは現時点ではローカルにのみ保存されています。後のステップで、これをレジストリにプッシュします。
マニフェストにアーキテクチャと OS を注釈付けする
このステップでは、前のステップで作成したマニフェストリストに注釈を付けます。マニフェストに注釈を付けることで、イメージが対象とするアーキテクチャやオペレーティングシステムなどのメタデータを追加できます。この情報は、コンテナが実行される環境に基づいて Docker がマニフェストリストから正しいイメージを選択するために重要です。
docker manifest annotate コマンドを使用して、my-alpine-list マニフェストリスト内のエントリにアーキテクチャと OS の情報を追加します。このコマンドは、マニフェストリスト名、リスト内のイメージ名、および注釈用のフラグを引数に取ります。
まず、amd64 アーキテクチャと linux オペレーティングシステムに対応する alpine:latest イメージに注釈を付けましょう。
docker manifest annotate my-alpine-list alpine:latest --arch amd64 --os linux
このコマンドは、my-alpine-list マニフェスト内の alpine:latest イメージが amd64 アーキテクチャと linux オペレーティングシステム用であることを Docker に伝えます。
次に、arm64 アーキテクチャと linux オペレーティングシステムに対応する alpine:latest イメージに注釈を付けます。
docker manifest annotate my-alpine-list alpine:latest --arch arm64 --os linux
このコマンドは、リスト内のもう一方の alpine:latest イメージに注釈を付け、それが arm64 アーキテクチャと linux オペレーティングシステム用であることを指定します。
マニフェストリストにアーキテクチャと OS の情報を付与することで、ユーザーが特定のアーキテクチャのシステムで my-alpine-list を取得する際に、Docker が自動的に正しいイメージを選択できるようになります。
マニフェストに OS 機能とバージョンを注釈付けする
このステップでは、OS 機能とバージョンに関する情報を追加することで、マニフェストリストの注釈付けを続けます。Alpine のような基本的なイメージではあまり一般的ではありませんが、特定のオペレーティングシステムの機能やバージョンを必要とするイメージに対しては、これらの注釈が役立つことがあります。
docker manifest annotate コマンドを使用すると、--os-features フラグで OS 機能を、--os-version フラグで OS バージョンを指定できます。
デモンストレーションのために、amd64 の Alpine イメージが特定の OS 機能(例:fips)を必要とし、特定の OS バージョン(例:1.0)用に構築されていると仮定しましょう。この情報を使って、my-alpine-list 内の amd64 エントリに注釈を付けます。
docker manifest annotate my-alpine-list alpine:latest --arch amd64 --os linux --os-features fips --os-version 1.0
このコマンドは、my-alpine-list 内の amd64 エントリの注釈を更新し、指定された OS 機能とバージョンを追加します。
同様に、arm64 の Alpine イメージが別の OS 機能(例:selinux)を必要とし、別の OS バージョン(例:2.0)用に構築されていると仮定しましょう。arm64 エントリに注釈を付けます。
docker manifest annotate my-alpine-list alpine:latest --arch arm64 --os linux --os-features selinux --os-version 2.0
このコマンドは、arm64 エントリの注釈を更新し、その特定の OS 機能とバージョンを追加します。
これらの注釈を追加することで、イメージの要件と互換性に関するより詳細な情報を提供できます。この情報は、マニフェストリストからイメージを選択する際に Docker や他のツールによって利用されます。
マニフェストにアーキテクチャバリアントを注釈付けする
このステップでは、マニフェストリストにアーキテクチャバリアントの情報を追加します。アーキテクチャバリアントは、同じアーキテクチャの異なるバージョンや実装を区別するために使用されます。たとえば、arm アーキテクチャには v6、v7、v8 などのバリアントがあります。
docker manifest annotate コマンドと --variant フラグを使用して、アーキテクチャバリアントを指定します。
arm64 の Alpine イメージが arm64 アーキテクチャの v8 バリアント用に特別に構築されていると仮定しましょう。この情報を使って、my-alpine-list 内の arm64 エントリに注釈を付けます。
docker manifest annotate my-alpine-list alpine:latest --arch arm64 --os linux --variant v8
このコマンドは、my-alpine-list 内の arm64 エントリの注釈を更新し、v8 バリアントの情報を追加します。
amd64 アーキテクチャでは、バリアントはあまり一般的ではありませんが、必要に応じて指定することができます。この実験では、amd64 エントリにバリアントを追加しません。
アーキテクチャバリアントの情報を追加することで、イメージの互換性に関するさらに具体的な詳細を提供でき、Docker が特定のシステムに最適なイメージを選択できるようになります。
注釈付きマニフェストリストを検査する
この最後のステップでは、作成して注釈を付けたマニフェストリストを調査し、追加した情報を確認します。docker manifest inspect コマンドを使用すると、マニフェストリストの詳細を表示できます。これには、マニフェストリストに含まれるマニフェストとその注釈が含まれます。
my-alpine-list マニフェストリストを調査するには、次のコマンドを実行します。
docker manifest inspect my-alpine-list
このコマンドは、マニフェストリストを表す JSON ドキュメントを出力します。amd64 と arm64 の両方のイメージのエントリが表示され、前のステップで追加した注釈(architecture、os、os.features、os.version、variant など)も表示されるはずです。
出力内の manifests 配列を探してください。この配列内の各オブジェクトは、マニフェストリストに含まれるイメージを表しています。各マニフェストオブジェクト内に platform フィールドがあり、これには architecture、os、os.features、os.version の情報が含まれています。arm64 エントリには、variant フィールドも表示されるはずです。
マニフェストリストを調査することは、注釈が正しく適用され、マニフェストリストが意図した通りに構成されていることを確認する良い方法です。
まとめ
この実験では、複数のイメージマニフェストのインデックスとして機能し、単一の名前でマルチアーキテクチャイメージを配布できる Docker マニフェストリストの作成方法を学びました。まず、amd64 と arm64 の両方のアーキテクチャ用の alpine イメージを取得しました。その後、--amend フラグを使用した docker manifest create コマンドを使って、取得したイメージを組み込んだ my-alpine-list という名前のローカルマニフェストリストを作成しました。
マニフェストリストを作成した後、docker manifest annotate コマンドを使用して、リスト内の個々のマニフェストに注釈を付ける方法を調べました。このプロセスでは、アーキテクチャやオペレーティングシステムの情報などの重要なメタデータを追加しました。具体的には、アーキテクチャと OS の詳細をマニフェストに注釈付けする方法を示し、さらに OS の機能、バージョン、アーキテクチャバリアントの情報を追加する方法を調べました。最後に、注釈付きのマニフェストリストを調査して追加したメタデータを確認し、リストが含まれるイメージの特性を正確に反映していることを確認する方法を学びました。



