1. 概要

このチュートリアルでは、リモートの Docker レジストリに画像を一覧表示する方法と、画像のタグを取得する方法について説明します。

これは、特定のイメージのどのバージョンがレジストリで使用可能であるかを調べ、どのバージョンを使用するかを決定するのに役立ちます。

2. DockerレジストリAPI

Dockerレジストリーは、レジストリーと対話するためのAPIを提供します。 このAPIには、画像のプル、プッシュ、タグ付けなどのさまざまなタスクを実行するためにDockerCLIによってバックグラウンドで使用されるさまざまなエンドポイントが含まれています。

これらのエンドポイントを直接使用して、DockerCLIを使用せずにレジストリと対話することもできます。

レジストリAPIのエンドポイントの形式を見てみましょう。

/<api-version>/<repository-name>/<resource>/<params>

このエンドポイントのさまざまなコンポーネントを調べてみましょう。

  • APIバージョンAPIのバージョン。 たとえば、現在のバージョンはv2です。
  • リポジトリ(イメージ)名イメージの名前。 ネストされたリポジトリの場合、名前にスラッシュで区切ったパスを含めることもできます。 たとえば、 / ubuntu /nginxまたは/redisです。
  • リソース操作するAPIの下位区分。 たとえば、マニフェストは、特定の画像のマニフェストを処理します。
  • パラメータ–これらは、操作をさらに洗練するために使用できるオプションのパラメータです。 たとえば、マニフェスト/最新のは、最新のタグのマニフェストをフェッチします。

上記のルールに基づいて、以下はエンドポイントの具体例です。

GET /v2/ubuntu/nginx/manifests/latest

3. Docker Registry API V2

執筆時点では、V2はレジストリAPIの現在のバージョンです。 リモートレジストリから画像とタグを一覧表示するためにそれを使用する方法を調べてみましょう。

URLにレジストリがデプロイされていると仮定しましょう https://my-registry.io。 使用しますカール HTTPリクエストを実行します。

3.1. 画像の一覧表示

レジストリ内の画像を一覧表示するには、_ / catalogエンドポイントを使用できます。

$ curl -X GET my-registry.io/v2/_catalog
{"repositories":["centos","ubuntu"]}

有効になっている場合、特定のリポジトリにアクセスするために認証が必要になる場合があることに注意してください。 このような場合、 -u オプションを使用して、ユーザー名とパスワードをパラメーターとしてcurlコマンドに渡すことができます。

$ curl -u user:password -X GET my-registry.io/v2/_catalog 
{"repositories":["centos","ubuntu"]}

3.2. ページ化されたリスト画像

レジストリに多数のイメージが含まれる場合があります。 そのような場合、 n=を追加できますページ付けされた応答を取得するための_/catalogエンドポイントへのパラメーター:

$ curl -X GET my-registry.io/v2/_catalog?n=1
{"repositories":["centos"]}

現在、応答には最初の画像のみが含まれています。

最初のリクエストへの応答を使用して、結果の次のページを取得できます。 これには、curlコマンドに2つの変更が必要です。

  • 前のリクエストで返された最後の画像名を含む_/catalogエンドポイントへのlastパラメーター。
  • 新しいリクエストを前のリクエストにリンクするヘッダー。 ヘッダーの形式は次のとおりです。
Link: <my-registry.io/v2/_catalog?n=1&last=centos>; rel="next"

URLを囲む角かっこは必須です。 URLは、新しいリクエストのURLと同じです。 rel =” next” ヘッダーは、 RFC 5988 に従って、新しい要求が前の要求の継続であることを示します。

それでは、次のリクエストを行いましょう。

$ curl -H 'Link: <my-registry.io/v2/_catalog?n=1&last=centos>; rel="next"' -X GET "my-registry.io/v2/_catalog?n=1&last=centos"
{"repositories":["ubuntu"]}

応答は、1つの画像を含む結果の次のページを返します。

3.3. タグの一覧表示

画像タグを一覧表示するには、 / tags /listエンドポイントを使用できます。

$ curl -X GET my-registry.io/v2/ubuntu/tags/list
{"name":"ubuntu","tags":["latest","16.04"]}

応答には、画像の名前とそれに関連付けられたタグの配列が含まれます。

画像リストで見たのと同じルールでページ付けを使用することもできます。

4. Docker Registry API V1

レジストリAPIv1はDocker17.06で非推奨になり、Docker17.12で削除されました。 ただし、非推奨になる前にホストされていたレジストリに遭遇した場合は、v1APIを使用できます。 この場合、リクエストがどのように変化するかを調べてみましょう。

4.1. 画像の一覧表示

v1で画像を一覧表示する直接のエンドポイントはありません。 代わりに、 docker search コマンドを使用して、指定された文字列を含む画像を検索できます。

$ docker search my-registry.io/centos

これにより、名前または説明に文字列「centos」が含まれている画像のリストが返されます。

レジストリを指定しない場合、検索はデフォルトのレジストリで実行されます。 デフォルトのリポジトリはDockerHubリポジトリです。

たとえば、次の画像は、リポジトリを指定せずに「ubuntu」という用語を検索した場合の出力を示しています。

4.2. タグの一覧表示

タグを一覧表示する方法は、v2APIに似ています。 ただし、この場合、出力は異なります。

$ curl -X GET https://registry.hub.docker.com/v1/repositories/baeldung/mesos-marathon-demo/tags
[{"layer": "", "name": "32"}, {"layer": "", "name": "33"}, {"layer": "", "name": "34"}]

ご覧のとおり、単一のタグの配列ではなく、オブジェクトの配列があります。 各オブジェクトには、タグの名前と画像のレイヤーIDが含まれます。

必要に応じて、応答を配列に変換できます。 これを行うには、出力を jqコマンドにパイプして、JSONを解析します。

$ curl -s GET https://registry.hub.docker.com/v1/repositories/baeldung/mesos-marathon-demo/tags | jq -r '[.[].name]'
[
  "32",
  "33",
  "34"
]

ここで使用されているjqコマンドと式を理解しましょう。

  • -r フラグは、出力を生のテキストとして返します。
  • 。[]。nameは、curl出力の各オブジェクトからnameプロパティを返します。
  • 式を囲む角かっこ[]は、出力を配列に収集することを示します。

最後に、プログレスバーの出力を抑制するには、curlコマンドで使用される-sフラグが必要です。

5. 結論

この記事では、DockerレジストリAPIを使用してリモートレジストリ内の画像とタグを一覧表示する方法について説明しました。

また、画像とタグのページ化されたリクエストを送信する方法と、JSON応答を解析する方法についても説明しました。