Docker Hubではなく完全にプライベートなレジストリが作りたいことがあると思います。
そんなときはregistry serverを自前で立てれば実現可能ですが、GoogleCloudではServerを立てずにほぼ無料で使えるので紹介したいと思います。
セットアップ
consoleにログインして「Container Registry」を開き「Container Registry API」を有効化します。
APIの有効化に成功したら、どれぐらい効果あるかわかりませんが設定から脆弱性スキャンの設定を確認します。無料で使えるので特に無効にしなくてもいいかと思います。
gcloudのインストールがまだの場合はここを参照してください。
Dockerイメージをpushする
Dockerのバージョンにより認証方法が異なるため、バージョンの確認をします。
$docker -v
18.03以上の場合
gcloudコマンドで認証します。ドキュメントはここ。
$gcloud auth configure-docker
これをやらずにpullすると認証エラーになります。以下は認証せずにdocker-compose upを実行した際のエラーです。
$docker-compose up
Pulling shimer-hp (asia.gcr.io/XXXXXXX/shimer-hp:latest)...
ERROR: unauthorized: You don't have the needed permissions to perform this operation, and you may have invalid credentials. To authenticate your request, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication
ビルド〜pushまでの例
#!/bin/sh
APP_NAME=asia.gcr.io/XXXXXXX/shimer-hp
docker build -t $APP_NAME:latest ./
# 新しいイメージをlatestでアップ
docker push $APP_NAME:latest
# 不要なローカルにあるイメージを削除
docker image prune -f
18.02以下の場合
トークンを発行します。
$ gcloud auth print-access-token
そのトークンを使ってdocker loginします。
$docker login -u oauth2accesstoken -p トークン https://asia.gcr.io
oauth2accesstokenは固定で、asia.gcr.ioの部分はレジストリの場所によって変える必要があります。
以下は古いDockerで認証せずにdocker-compose upを実行した際のエラーです。
$docker-compose up -d
Pulling shimer-hp (asia.gcr.io/XXXXXXXXXXX/shimer-hp:latest)...
Pulling repository asia.gcr.io/XXXXXXXXXXX/shimer-hp
ERROR: unauthorized: authentication required
ビルド〜pushまでの例
#!/bin/sh
APP_NAME=asia.gcr.io/XXXXXXXX/shimer-hp
docker build -t $APP_NAME:latest ./
# 新しいイメージをlatestでアップ
gcloud docker -- push $APP_NAME:latest
# 不要なローカルにあるイメージを削除
docker image prune -f
おまけ
その他コマンド
古いイメージを消したり
# 古いイメージを削除
gcloud container images delete $APP_NAME:v1 --force-delete-tags --quiet
# latestにv1タグ追加
gcloud container images add-tag $APP_NAME:latest $APP_NAME:v1 --quiet
# latestタグを削除
gcloud container images untag $APP_NAME:latest --quiet
気になる料金
ストレージと下りネットワークのみが課金対象です。無料枠を考えるとほぼ無料で使えます。
詳細はここ
さいごに
Dockerのバージョンによりコマンドが異なるため分かりづらいですが、
これからはじめる方は18.03以上のDockerを使ったほうがdockerコマンドそのままなので無駄なことを覚えなくてすむんじゃないかと思います。