Dockerイメージを置く場所としてContainer Registryを使う

DockerのレジストリとしてはDockerHubが使われるがプライベートが良いよねーでAWSユーザーの人はECRを使うことが多いのかなと思うが GCPだってある。それがContainer Registry(GCR)

個人で開発しているものをGCP上にのせているのでGCRを使っている

この記事のゴール

FROM: Container RegistryレジストリのURL!

作って

$ docker build -t gcr_sample .

したらlocalのimage listに追加される

レジストリへのPUSH

前提として gcloud auth login はすんでいる状態とします

公式: Container Registry への push

まずlocalにbuildされたイメージがあるとします。 今回は下記のようなものをサンプルとして使用する

FROM busybox
CMD echo "GCP!!!"
$ docker build -t asia.gcr.io/[project id]/echo-gcp .

タグの名前は gcr.io/[project_id]/[image-name] にする必要がある。 gcr.ioに関してはus.gcr.io ,eu.gcr.io, asia.gcr.ioなどがあり、今回は一番近い asia.gcr.io を使用しています

後は gcloud コマンドにpush用のコマンドがついているのでそれを使う

$ gcloud docker -- push asia.gcr.io/[projrect_id]/echo-gcp
The push refers to a repository [asia.gcr.io/[projrect_id]/echo-gcp]
c0de73ac1111: Layer already exists
latest: digest: sha256:111111111111111112222222222 size: 527

確認

GCP上からContainer Registryを見ると先ほどのimage nameが表示される

f:id:hatappi1225:20170411005648p:plain

ちなみにイメージなどはGCSにバケットが自動で作られて保存されておりGCSの画面へいくと確認が出来る

PULL

これもgcloudで提供されているので

$ gcloud docker -- pull asia.gcr.io/[project_id]/echo-gcp:latest

でlocalのimageに追加される。 一旦localにない状態に戻すために docker rmi して

FROM: asia.gcr.io/[project_id]/echo-gcp:latest
CMD echo "GCP!! NEO!!"

を作って

$ docker build -t echo-gcr-neo .
Error: Status 403 trying to pull repository [project_id]/echo-gcp: "Unable to access the repository: [project_id]/echo-gcp; please verify that it exists and you have permission to access it (no valid credential was supplied)."

gcloudが頑張ってくれていた

pushやpullを gcloud docker とつけてましたが、これにより本来必要な認証周りをgcloud側で短時間のアクセストークンをわたして認証しているため、ユーザーはgcloudにログインしていれば無駄な手間なくいける。

ただこれだとDockerfileのFROMに記載するためには毎回localに一旦最新を落としてみたいなフローが必要になる。 今回はlocalになくても docker run したらリモートみにいってほしいから docker login する

$ docker login -e [メールアドレス] -u oauth2accesstoken -p "$(gcloud auth print-access-token)" https://asia.gcr.io

これでOK !! gcloud auth print-access-token によりアクセストークンが発行され、それを使って認証する 認証された情報は $HOME/.docker/config.json に入っている

これでもう一度

$ docker build -t echo-gcr-neo .
$ docker run echo-gcr-neo
GCP!! NEO!!

でた!!!