Google Container Registry(GCR)はGCPが提供するプライベートなDocker Registryです。Docker Hubと同じようにDockerイメージのアップロード/ダウンロードができ、かつ、外部から利用されることもありません。

今回は、自作したDockerイメージをサービスアカウントを通じてCLIでGCRにpushしてpullするところまでを検証してみようと思います。基本的には公式のクイックスタートをベースに検証を進めます。

GCRの特徴

以下の様なことができるみたいです。

  1. Docker Registoryとして、Dockerイメージをpushしたりpullしたりできる
  2. アクセス制御ができる
  3. CI/CDシステムと連動できる

今回はこれのうち1.と2.あたりを軽く検証してみます。

事前準備

GCP側の設定

  1. こちらからGCPのプロジェクトを作成/選択します
    • 今回はcloud-registry-testというプロジェクトを新規に作りました
  2. こちらから課金が有効になっているかを確認します
    • 自分の場合はすでに別のプロジェクトで請求先アカウントを設定していたので、デフォルトでそれが適用されていました
  3. こちらからContainer Registry API を有効にします
    • 対象のプロジェクトを選択して、「続行」をクリックします
    • 「プロジェクトへの認証情報の追加」画面に遷移しますが、この時点では何もせずキャンセルします

ローカルPC側の設定

  1. Google Cloud SDKのインストール
  2. Docker Engineのインストール
    • まだやってない人はこちらから
    • docker run busybox dateをterminalで実行して日時が表示されればOK

認証を構成する

イメージをdocker pushまたはdocker pullする場合、単純にContainer Registoryにアクセスするのではなく、gcloud CLI を通じてContainer Registry へのリクエストを認証するように Docker を構成する必要があります。

gcloud auth configure-docker

> Adding credentials for all GCR repositories.
> WARNING: A long list of credential helpers may cause delays running 'docker build'. We recommend passing the registry name to configure only the registry you are using.
> After update, the following will be written to your Docker config file
>  located at [/Users/rinoguchi/.docker/config.json]:
>  {
>   "credHelpers": {
>     "gcr.io": "gcloud",
>     "us.gcr.io": "gcloud",
>     "eu.gcr.io": "gcloud",
>     "asia.gcr.io": "gcloud",
>     "staging-k8s.gcr.io": "gcloud",
>     "marketplace.gcr.io": "gcloud"
>   }
> }
> 
> Do you want to continue (Y/n)?  Y
> 
> Docker configuration file updated.

ログを見る限り、以下の2点をやってくれているみたいです。

  • GCRリポジトリのURLおよびクレデンシャルを登録する
  • Dockerのコンフィグファイルに、GCRリポジトリにアクセスする際はgcloudをクレデンシャルヘルパとして利用する、という設定を追加する

個人アカウントでDockerイメージをGCRにpush/pullする

個人アカウントでログインする

# ログイン
gcloud auth loging xxxxx@gmail.com  # => ブラウザで認証画面が表示されるのでそこで認証を行う

# プロジェクトを設定
gcloud config set project cloud-registry-test
> Updated property [core/project].

# 確認
gcloud config list
> [core]
> account = xxxxx@gmail.com
> disable_usage_reporting = False
> project = cloud-registry-test

Dockerイメージを作成する

Dockerfileを作成します

FROM python:latest
ENTRYPOINT [ "python", "-c", "print('python executed.')" ]

Dockerイメージを作成します。

docker build -t python-sample:latest .

> Sending build context to Docker daemon  2.048kB
> Step 1/2 : FROM python:latest
>  ---> 5336a27a9b1f
> Step 2/2 : ENTRYPOINT [ "python", "-c", "print('python executed.')" ]
>  ---> Using cache
>  ---> 097cd088e9a4
> Successfully built 097cd088e9a4
> Successfully tagged python-sample:latest

python-sample:latestというタグでローカルのDocker RegistryにDockerイメージが作成されました。

さらに、DCRにアップロードするために、GCRの命名規則に合わせてタグをつけ直します。

docker tag python-sample:latest asia.gcr.io/cloud-registry-test/python-sample:latest

最初からDockerイメージを作成する際にGCRの命名規則でタグ付けする方がいいかもしれません。

docker build -t asia.gcr.io/cloud-registry-test/python-sample:latest .

GCRにpushする

あとはdocker pushを実行するだけです。

docker push asia.gcr.io/cloud-registry-test/python-sample:latest

> The push refers to repository [asia.gcr.io/cloud-registry-test/python-sample]
> 495sa1d6fa86e2: Layer already exists 
> 省略
> c4fc3hwbd6e3cb: Layer already exists 
> latest: digest: sha256:7vfq87vqreghjiqwef978vchdqwuirweokj2fed8becd235 size: 2217

コンソール から確認すると無事DockerイメージがGCR上にpushされていました。

右側の操作プルダウンからイメージの削除を含めいくつかの操作できる様です。

GCRからpullする

こちらもdocker pullで問題なくできました。

docker pull asia.gcr.io/cloud-registry-test/python-sample:latest

> latest: Pulling from cloud-registry-test/python-sample
> Digest: sha256:7vfq87vqreghjiqwef978vchdqwuirweokj2fed8becd235
> Status: Downloaded newer image for asia.gcr.io/cloud-registry-test/python-sample:latest
> asia.gcr.io/cloud-registry-test/python-sample:latest

サービスアカウントでDockerイメージをGCRにpush/pullする

実際の運用では個人アカウントで作業することは少ないと思いますので、サービスアカウントでもdocker pushおよびdocker pullできることを確認しようと思います。

サービスアカウントを作成する

こちらからサービスアカウントを作成します。

  1. 「+サービスアカウントを作成」リンクからサービスアカウントを作成
  2. 名前をつけて次へ(今回はcloud-registry-test-accountという名前をつけました)
  3. ロールを設定
    • 「ストレージ管理者」ロールを選択します
  4. 完了
    • ここまででサービスアカウントが作成されています。
  5. 一覧画面の「操作」から「鍵を作成」
    • 「JSON」を選択します
    • jsonファイルがダウンロードされるので、任意のフォルダに配置します。

次に、サービスアカウントを有効化します。

# 有効化
gcloud auth activate-service-account --key-file ./cloud-registry-test-xxxxxxxxxx.json --project cloud-registry-test
> Activated service account credentials for: [cloud-registry-test-account@cloud-registry-test.iam.gserviceaccount.com]

# 確認
gcloud config list
> [core]
> account = cloud-registry-test-account@cloud-registry-test.iam.gserviceaccount.com
> disable_usage_reporting = False
> project = cloud-registry-test

GCRにpush、GCRからpullする

まずはdocker pushを試してみましたが、問題なく動きました。

docker push asia.gcr.io/cloud-registry-test/python-sample:latest
> The push refers to repository [asia.gcr.io/cloud-registry-test/python-sample]
> 4951d6fa86e2: Layer already exists 
> 省略
> latest: digest: sha256:7vfq87vqreghjiqwef978vchdqwuirweokj2fed8becd235 > size: 2217

docker pullも大丈夫でした。

docker pull asia.gcr.io/cloud-registry-test/python-sample:latest
> latest: Pulling from cloud-registry-test/python-sample
> Digest: sha256:7vfq87vqreghjiqwef978vchdqwuirweokj2fed8becd235
> Status: Image is up to date for asia.gcr.io/cloud-registry-test/python-sample:latest
> asia.gcr.io/cloud-registry-test/python-sample:latest

その他

少し関連して、AirflowのDockerOperatorでGCRからイメージをpullする件も以下の記事の中で検証しております。ご参考まで。
AirflowでDockerOperatorを動かす

さいごに

わざわざ記事起こすほどもないぐらい特にハマることもなくサクッと動きました。普段からGCPを使ってるので、今後はDockerイメージはここで管理していこうと思います。

Posted in: gcp