Artifact Registry は、コンテナやその他の形式をサポートするユニバーサル パッケージ管理サービスです。アーティファクトの柔軟性と制御を強化するために、Container Registry からの移行について説明します。

Container Registry の概要

Container Registry は、Google Cloud 上で実行される非公開のコンテナ イメージ レジストリです。Container Registry は、Docker イメージ マニフェスト V2 と OCI イメージをサポートしています。

多くのユーザーは Docker 公開イメージを保存するための中央レジストリとして Docker Hub を使用しますが、イメージへのアクセスを制御するには、Container Registry などの非公開レジストリを使用する必要があります。

セキュアな HTTPS エンドポイントを使用して Container Registry にアクセスできるため、あらゆるシステム、VM インスタンス、所有のハードウェアからイメージを push、pull、管理することが可能です。

  • Container Registry を Google Cloud CI / CD サービスまたは既存の CI / CD ツールと統合できます。
  • コンテナ ソフトウェアのサプライ チェーンを保護します。
    • Container Analysis を使用して、コンテナのメタデータを管理し、コンテナの脆弱性をスキャンします。
    • Binary Authorization を使用してデプロイ ポリシーを適用します。
  • VPC Service Controls セキュリティ境界でレジストリを保護します。

レジストリ

Container Registry 内のレジストリは、ホストとプロジェクト ID によって命名されます。イメージを操作(push、pull、delete など)するには、次の形式を使用してイメージを識別します。

HOSTNAME/PROJECT-ID/IMAGE:TAG

または

HOSTNAME/PROJECT-ID/IMAGE@IMAGE-DIGEST

ここで

  • HOSTNAME は、イメージが保存される場所です。

    • gcr.io は現時点では米国でイメージをホストしていますが、今後は場所が変更される可能性があります。
    • us.gcr.io は米国でイメージをホストしますが、その場所は、gcr.io によってホストされるイメージからは独立したストレージ バケットです。
    • eu.gcr.io は、欧州連合でイメージをホストします。
    • asia.gcr.io は、アジアでイメージをホストします。

    これらの場所は、Cloud Storage ストレージ バケットのマルチリージョンに対応します。イメージを新しいホスト名でレジストリに push すると、Container Registry では、指定されたマルチリージョン内にストレージ バケットを作成します。このバケットは、レジストリの基盤となるストレージです。1 つのプロジェクト内では、ホスト名が同じであるすべてのレジストリが 1 つのストレージ バケットを共有します。

  • PROJECT-ID は、Google Cloud Console プロジェクト ID です。プロジェクト ID にコロン(:)が含まれている場合は、下記のドメインをスコープとするプロジェクトをご覧ください。

  • IMAGE はイメージの名前です。イメージのローカル名とは別の名前にできます。Google Cloud Console では、プロジェクトのレジストリはイメージ名で一覧表示されます。各リポジトリでは、名前が同じである複数のイメージを保持できます。たとえば、名前が「my-image」であるイメージの異なるバージョンを保持できます。

  • 末尾に :TAG または @IMAGE-DIGEST のいずれかを追加すると、イメージの特定のバージョンを区別できますが、省略することもできます。タグまたはダイジェストを指定しなかった場合、Container Registry はデフォルトのタグ latest が付いたイメージを探します。下記のレジストリ内のイメージのバージョンをご覧ください。

レジストリ gcr.io/PROJECT-ID 内のイメージ my-image の場合、次の形式でイメージを push または pull します。

gcr.io/PROJECT-ID/my-image:tag1

PROJECT-ID は、Google Cloud Console プロジェクト ID です。

リポジトリを使用したイメージの整理

レジストリ内のリポジトリに基づき関連イメージをグループ化できます。イメージにタグ付け、push、pull するときに、イメージパス内のプロジェクトに基づきリポジトリ名を指定します。

次に例を示します。

us.gcr.io/builds/dev/web-app:beta-2.0
us.gcr.io/builds/stable/web-app:1.0

プロジェクト builds には、web-app という名前のイメージが 2 つあります。1 つは dev リポジトリにあり、もう 1 つは stable リポジトリにあります。この構造により、さまざまなバージョンのイメージを保存して、開発のさまざまな段階やさまざまなチームに対応できます。

必要に応じて、リポジトリはネストできます。この例の 2 つのプロダクトでは、最上位のリポジトリの下に子リポジトリがあります。

us.gcr.io/builds/product1/dev/product1-app:beta-2.0
us.gcr.io/builds/product1/stable/product1:1.0
us.gcr.io/builds/product2/dev/product2:alpha
us.gcr.io/builds/product2/stable/product2:1.0

リポジトリは整理の助けになります。それらはイメージパス中では論理フォルダのように機能しますが、実際のファイル システム構造を反映しませんし、よりきめ細かなアクセス制御はサポートしません。

レジストリ内のイメージのバージョン

1 つのレジストリには多くのイメージを含めることができ、それらはバージョンの異なる場合があります。レジストリ内でイメージの特定のバージョンを識別するには、イメージのタグまたはダイジェストを指定します。

  • タグはラベルとして機能します。1 つのイメージに複数のタグを適用できます。たとえば、1 つのイメージには、バージョン番号のタグ v1.5 や、最終テストの準備状況を示す release-candidate を付けられます。
  • ダイジェストは自動的に生成されます。これは、イメージのバージョンに固有のものであり、@IMAGE-DIGEST の形式になります。IMAGE-DIGEST は、イメージ コンテンツの sha256 ハッシュ値です。

イメージ my-image の特定のバージョンを指定する手順は、次のとおりです。

  • イメージのタグを追加します。

    gcr.io/PROJECT-ID/my-image:tag1
    
  • または、イメージのダイジェストを追加します。

    gcr.io/PROJECT-ID/my-image@sha256:4d11e24ba8a615cc85a535daa17b47d3c0219f7eeb2b8208896704ad7f88ae2d
    

PROJECT-ID は、Google Cloud Console プロジェクト ID です。プロジェクト ID にコロン(:)が含まれている場合は、下記のドメインをスコープとするプロジェクトをご覧ください。

Cloud Console の [イメージ] 画面で、[タグ] 列にイメージのタグが一覧表示されます。イメージのバージョンをクリックすると、メタデータ(イメージ ダイジェストを含む)が表示されます。

タグの変更方法については、イメージにタグを付けるをご覧ください。

ドメインをスコープとするプロジェクト

プロジェクトのスコープがドメインに設定されている場合、プロジェクト ID に含まれるドメインの名前の後にコロン(:)が続いています。Docker でのコロンの処理方法の関係で、Container Registry でイメージ ダイジェストを指定する場合は、コロン文字をスラッシュで置き換える必要があります。このようなプロジェクトのイメージを指定する場合は、次の形式を使用します。

HOSTNAME/[DOMAIN]/[PROJECT]/IMAGE

たとえば、ID が example.com:my-project のプロジェクトには、次のイメージが含まれる場合があります。

gcr.io/example.com/my-project/image-name

URL としてのレジストリ名

URL https://HOSTNAME/PROJECT-ID/IMAGE は、Cloud Console 内のそのレジストリの URL です。これらのリンクには、レジストリへのアクセス権限を持つ認証済みのユーザーがアクセスできます。レジストリ名の作成方法については、上記の説明をご覧ください。

たとえば、次の URL は Cloud Console 内の公開レジストリにリンクしています。

Container のイメージ形式

Container Registry は、Docker イメージ マニフェスト V2 と OCI イメージをサポートしています。

詳細については、Container のイメージ形式をご覧ください。

アクセス制御

Container Registry は自身と同じプロジェクト内の Cloud Storage バケットにコンテナ イメージのタグとレイヤファイルを格納します。バケットへのアクセスは、Cloud Storage の Identity and Access Management(IAM)で構成します。

デフォルトでは、プロジェクトのオーナーと編集者にプロジェクトの Container Registry バケットに対する push および pull 権限が付与されます。プロジェクト閲覧者にはイメージの pull 権限のみが付与されます。

詳細については、アクセス制御の構成をご覧ください。

Cloud Storage から高性能なバックエンド データベースへのイメージ メタデータの移動計画については、Container Registry 非推奨のお知らせをご覧ください。

認証

イメージを push または pull するには、その前に、認証を構成する必要があります。gcloud コマンドライン ツールを使用して Container Registry に対してリクエストを認証するように Docker を構成できます。Container Registry では、アクセス トークンまたは JSON 鍵ファイルを使用した高度な認証方式もサポートしています。

Docker 認証ヘルパー

Docker は、イメージを push および pull するために Container Registry にアクセスする必要があります。Docker 認証ヘルパー コマンドライン ツールを使用して、Docker で使用するための Container Registry 認証情報を構成できます。

認証ヘルパーは、Container Registry 認証情報を自動的に、または --token-source フラグで指定したロケーションからフェッチし、それらを Docker の構成ファイルに書き込みます。この方法で、Docker のコマンドライン ツール docker を使用して、Container Registry を直接操作できます。

詳細については、高度な認証をご覧ください。

Container Registry サービス アカウント

Container Registry API を有効にすると、Container Registry はプロジェクトにサービス アカウントを追加します。このサービス アカウントの名前は次の形式です。

service-[PROJECT_NUMBER]@containerregistry.iam.gserviceaccount.com

Container Registry サービス アカウントは、プロジェクトでサービスに関して必要な処理を実行するための Container Registry 専用のサービス アカウントです。Google はこのアカウントを所有していますが、これはプロジェクトに固有のアカウントであり、Cloud Console のサービス アカウントと IAM のセクションに表示されます。

このサービス アカウントを削除したり、その権限を変更したりすると、Container Registry の一部の機能は正常に動作しなくなります。役割を変更したり、アカウントを削除したりしないでください。

プルスルー キャッシュ

mirror.gcr.io レジストリは、頻繁にリクエストされる公開イメージを公式の Docker Hub リポジトリからキャッシュします。

キャッシュに保存されたイメージを使用すると、Docker Hub から pull を高速化できます。クライアントは、Docker Hub から直接 pull する前に、Docker Hub イメージのキャッシュに保存されたコピーを常にチェックします。

詳細については、キャッシュに保存された Docker Hub イメージの pull をご覧ください。

通知

Pub/Sub を使用して、コンテナ イメージの変更に関する通知を受け取ることができます。

詳細については、Pub/Sub 通知の構成をご覧ください。

Google Cloud での Container Registry の使用

Compute Engine インスタンスと Google Kubernetes Engine クラスタは、インスタンスの Cloud Storage スコープに基づいて Container Registry イメージの push と pull を行います。Google Cloud での Container Registry の使用をご覧ください。

Container Registry に格納されているイメージは、App Engine フレキシブル環境にデプロイできます。

継続的デリバリー ツールの統合

Container Registry は、広く使用されているいくつかの継続的デリバリー システムと連動します。

サードパーティ ソリューションでの Container Registry の使用

アプリケーションの開発時に、Google Cloud 外部のサードパーティのクラスタ管理ソリューションや継続的インテグレーション ソリューションなどを使用できます。Container Registry は、これらの外部サービスと統合できます。

これらのソリューションでは、認証用の gcloud コマンドライン ツールにアクセスできない場合があります。その場合は、docker login を使用して Container Registry に対して直接認証を行うことができます。詳細については、高度な認証をご覧ください。

Container Registry と統合するサードパーティ ソリューションの一覧については、継続的デリバリー ツールの統合をご覧ください。