Google Cloud での Container Registry の使用

ビルドとデプロイのワークフローを簡素化するため、一部の Google Cloud サービス アカウントとランタイム環境には、同じプロジェクトに格納されたコンテナへのアクセス権限が事前に構成されています。

このページでは、Google Cloud サービスとの一般的な統合と、コンテナにアクセスするための関連要件について説明します。

一般的なアクセス要件

デフォルトでは、一部の一般的な統合のサービス アカウントには、同じプロジェクト内の Container Registry にアクセスするための Cloud Storage 権限が構成されています。

Google Kubernetes Engine クラスタ内の VM を含む Compute Engine VM で使用されるサービス アカウントの場合、アクセスは IAM 権限とストレージ アクセス スコープの両方に基づきます。

次の場合は、権限をご自分で構成または変更する必要があります。

  • あるプロジェクトのサービス アカウントを使用して別のプロジェクトの Container Registry にアクセスしている
  • ストレージへの読み取り専用アクセス権を持つデフォルトのサービス アカウントを使用しているが、イメージの pull と push の両方を行う必要がある
  • Container Registry の操作にカスタム サービス アカウントを使用している

詳細については、プロダクト別のセクションをご覧ください。

Cloud Build

デフォルトでは、Container Registry が同じプロジェクトにある場合、Cloud Build サービス アカウントにイメージの push と pull の権限が付与されます。

次の場合は、適切な権限を自分で構成する必要があります。

  • Cloud Build が、ビルドがアクセスするリポジトリとは異なるプロジェクトにある。
  • ビルドが、デフォルトの Cloud Build サービス アカウント以外のサービス アカウントを使用している。この場合、Container Registry にアクセスする権限をサービス アカウントに付与する必要があります。

Compute Engine

VM インスタンスと Container Registry が同じ Google Cloud プロジェクトにある場合、Compute Engine のデフォルトのサービス アカウントにはイメージを pull する権限が構成されます。

VM インスタンスが別のプロジェクトにある場合、または VM インスタンスが別のサービス アカウントを使用する場合、サービス アカウントに対して Container Registry が使用するストレージ バケットにアクセスするための適切な権限を付与する必要があります。

デフォルトでは、Compute Engine VM にはストレージ バケットの read-only アクセス スコープが構成されています。非公開 Docker イメージを push するには、VM インスタンスに read-write ストレージ アクセス スコープが必要です。

コンテナ用に最適化された Compute Engine インスタンス

レジストリ内のイメージを使用してコンテナ用に最適化された Compute Engine インスタンスを起動する方法については、Cloud-Config 経由で Docker コンテナを開始するをご覧ください。

詳細については、インスタンスの作成と構成をご覧ください。

Google Kubernetes Engine

Google Kubernetes Engine は、クラスタノードの VM インスタンスで構成されたサービス アカウントを使用して、イメージの push と pull を行います。

必要な権限

Google Kubernetes Engine クラスタと Container Registry ストレージ バケットが同じ Google Cloud プロジェクトにある場合、Compute Engine のデフォルトのサービス アカウントには、イメージを push または pull するための適切な権限が構成されます。

クラスタが別のプロジェクトにある場合、またはクラスタ内の VM が別のサービス アカウントを使用する場合、サービス アカウントに対して Container Registry が使用するストレージ バケットにアクセスするための適切な権限を付与する必要があります。

デフォルトでは、Compute Engine VM にはストレージ バケットの read-only アクセス スコープが構成されています。非公開 Docker イメージを push するには、VM インスタンスに read-write ストレージ アクセス スコープが必要です。

イメージを実行する

次のコマンドを使用して、Google Kubernetes Engine クラスタで Container Registry イメージを実行できます。

kubectl run [NAME] --image=[HOSTNAME]/[PROJECT-ID]/[IMAGE]:[TAG]

ここで

  • [NAME] はリソースの名前です。
  • [HOSTNAME] は、Console で Location の下に表示されます。gcr.ious.gcr.ioeu.gcr.ioasia.gcr.io の 4 つのうち、いずれかのオプションになります。
  • [PROJECT-ID] は、Google Cloud Console プロジェクト ID です。プロジェクト ID にコロン(:)が含まれている場合は、ドメインをスコープとするプロジェクトをご覧ください。
  • [IMAGE] は、Container Registry 内のイメージ名です。
  • [TAG] は、Container Registry 内のイメージのバージョンを識別するタグです。タグを指定しない場合、Container Registry はデフォルトタグ latest を探します。

Kubernetes コマンドの詳細については、kubectl の概要をご覧ください。

App Engine フレキシブル環境

App Engine フレキシブル環境を使用すると、既存のランタイム(Java 8 など)をカスタマイズできます。また、カスタム Docker イメージまたは Dockerfile を提供することによって、独自のランタイムを構成できます。

フレキシブル環境では、Cloud Build を使用してコンテナ イメージが自動的にビルドされ、Container Registry に保存されます。

必要な権限

イメージの push または pull を行う VM インスタンスと Container Registry ストレージ バケットが同じ Google Cloud プロジェクトにある場合、Compute Engine のデフォルトのサービス アカウントには、イメージの push と pull のための適切な権限が構成されます。

VM が別のプロジェクトにある場合、または VM が別のサービス アカウントを使用している場合は、Container Registry が使用するストレージバケットに適切な権限を付与します。

デフォルトでは、Compute Engine VM にはストレージ バケットの read-only アクセス スコープが構成されています。非公開 Docker イメージを push するには、VM インスタンスに read-write ストレージ アクセス スコープが必要です。

App Engine へのデプロイ

gcloud コマンドライン ツールを使用して、Container Registry がホストするイメージを App Engine にデプロイできます。

イメージのルート ディレクトリで gcloud beta app gen-config コマンドを使用すると、App Engine にデプロイするために必要な app.yaml ファイルが自動的に作成されます。このファイルは自分で作成することもできます。

App Engine 構成ファイルを作成し、Docker イメージをビルドしてイメージを Container Registry に push したら、次のコマンドを実行してイメージを App Engine にデプロイできます。

gcloud app deploy --image-url=[HOSTNAME]/[PROJECT-ID]/[IMAGE]:[TAG]

ここで

  • [HOSTNAME] は、Console で Location の下に表示されます。gcr.ious.gcr.ioeu.gcr.ioasia.gcr.io の 4 つのうち、いずれかのオプションになります。
  • [PROJECT-ID] は、Google Cloud Console プロジェクト ID です。プロジェクト ID にコロン(:)が含まれている場合は、ドメインをスコープとするプロジェクトをご覧ください。
  • [IMAGE] は、Container Registry 内のイメージ名です。
  • [TAG] は、Container Registry 内のイメージのバージョンを識別するタグです。タグを指定しない場合、Container Registry はデフォルトタグ latest を探します。