Google Container Registry(GCR)はGCPが提供するプライベートなDocker Registryです。Docker Hubと同じようにDockerイメージのアップロード/ダウンロードができ、かつ、外部から利用されることもありません。
今回は、自作したDockerイメージをサービスアカウントを通じてCLIでGCRにpushしてpullするところまでを検証してみようと思います。基本的には公式のクイックスタートをベースに検証を進めます。
GCRの特徴
以下の様なことができるみたいです。
- Docker Registoryとして、Dockerイメージをpushしたりpullしたりできる
- アクセス制御ができる
- CI/CDシステムと連動できる
今回はこれのうち1.と2.あたりを軽く検証してみます。
事前準備
GCP側の設定
-
こちらからGCPのプロジェクトを作成/選択します
- 今回は
cloud-registry-test
というプロジェクトを新規に作りました
- 今回は
-
こちらから課金が有効になっているかを確認します
- 自分の場合はすでに別のプロジェクトで請求先アカウントを設定していたので、デフォルトでそれが適用されていました
-
こちらからContainer Registry API を有効にします
- 対象のプロジェクトを選択して、「続行」をクリックします
- 「プロジェクトへの認証情報の追加」画面に遷移しますが、この時点では何もせずキャンセルします
ローカルPC側の設定
- Google Cloud SDKのインストール
- まだやってない人はこちらから
- 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
できることを確認しようと思います。
サービスアカウントを作成する
こちらからサービスアカウントを作成します。
- 「+サービスアカウントを作成」リンクからサービスアカウントを作成
- 名前をつけて次へ(今回は
cloud-registry-test-account
という名前をつけました) - ロールを設定
- 「ストレージ管理者」ロールを選択します
- 完了
- ここまででサービスアカウントが作成されています。
- 一覧画面の「操作」から「鍵を作成」
- 「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イメージはここで管理していこうと思います。