dockerプライベートレジストリ構築(Google Compute Engine用)

docker hubはデファクトのdockerイメージレジストリで、各種公式イメージの流通・取得のために現状使わざるを得ない部分があります。

ただ、ID・パスワードやSSL鍵などのクレデンシャルを含むイメージを公開するわけにはいかないのと、あやまって素性の知れないイメージをつかんでしまうセキュリティリスクがあるため、自作のイメージ管理にはプライベートなレジストリ(イメージ置き場)を利用した方が安全です。

実行環境としてGoogle Compute Engineを利用する場合、Googleのホスティングサービスを利用する方法と、google製のdockerイメージを自分で構築する方法の2つが手軽です。

Google Container Registry

Google Container RegistryはGoogleがホストするdockerレジストリです。

事前にセットアップすることなくすぐに利用開始できます。

以下のように、dockerイメージにgcr.io/から始まるイメージ名称をつけてgcloud dockerコマンドでpush/pullするだけで手軽に使えます。

$ docker build -t gcr.io/{プロジェクトID}/{イメージ名} .
$ gcloud docker push gcr.io/{プロジェクトID}/{イメージ名}

プロジェクトIDはGoogle Compute Engineで共通的に使われているプロジェクトIDを指定します。このプロジェクト単位でアクセスや課金が制御されているため、gcloud docker pushするにはあらかじめWebコンソールから操作ユーザーをプロジェクトに追加したうえで、gcloud auth loginでログインしておく必要があります。

このGoogle Container Registryは、Google Container Engine(GKE)も統合されているため、 kubernetes環境のイメージ置き場としても使えます。

なお、gcloud dockerコマンドはイメージのpushにdockerコマンドを使用しています。通常は意識する必要はありませんが、プッシュ操作時に unable to ping registry endpoint https://asia.gcr.io/v0/ のようなタイムアウトエラーが発生している場合、dockerクライアントの異常のケースがあります。

たとえば、OSXのDocker Toolboxには挙動不安定な面があり、上記のエラーの際にdocker-machine restartでクライアント側のdockerホスト再起動によって直るケースがありました。

docker registryイメージをローカルに立てる

docker hubで google/docker-registryというdockerイメージが配布されています。

Google Cloud Storageにイメージ置き場を作り、このdockerイメージから接続するだけでプライベートにpush/pullできるようになります。

プロジェクト&バケット作成

gsutilコマンドでイメージ置き場にするバケットを作成します。今回は専用のプロジェクトを作成しましたが、既存のプロジェクトを流用しても問題はないはずです。

  1. developer consoleでプロジェクト作成
  2. $ gsutil mb -l ASIA -p your-own-project-ID gs://your-own-bucket-name

※ your-own-project-ID(プロジェクト名ではなくプロジェクトID)とyour-own-bucket-nameは環境に合わせた名称を指定

Google Cloud Storageの接続情報ファイルを作成

dockerレジストリコンテナからGoogle Cloude StorageにOAuth認証するための接続情報を環境変数に指定する設定ファイルを作成。

$ gcloud auth login(先ほど用意したバケットにアクセスできるユーザーでログイン)
$ gcloud auth print-refresh-token > registry-params.env
$ vi registry-params.env

GCP\_OAUTH2\_REFRESH_TOKEN=your-own-refresh-token
GCS_BUCKET=your-own-bucket-name

※ your-own-refresh-tokenの文字列だけが入っているはずなので、1行目の環境変数名や2行目を手で編集して設定

接続設定の指定方法については、 google/docker-registryのページに他2種類の手法が紹介されています。

Dockerレジストリコンテナ起動

以下のコマンドを実行することで、google/docker-registryイメージと先ほどの接続情報ファイルを使用してプライベートdockerレジストリが起動します。

$ docker run -d --env-file=registry-params.env -p 5000:5000 google/docker-registry

dockerが動く環境であれば、Google Compute EngineだけでなくローカルPCなどでも同じコマンドで動作します(registry-params.envファイルを事前に各ホストに持ってくる必要はあります)。

Dockerレジストリコンテナにイメージをpush

localhost:5000/のプレフィクスをつけたタグ名を指定してpushすることで、先ほどのdockerレジストリ経由でGoogle Compute Storageにイメージをpushできます。

$ docker tag myawesomeimage localhost:5000/myawesomeimage
$ docker push localhost:5000/myawesomeimage

レジストリイメージのバックアップ

dockerレジストリの障害などに備えて、念のためgoogle/docker-registryをファイルにバックアップしておきます。

$ docker save google/docker-registry | gzip > google-docker-registry.tgz

pushしたイメージはGoogle Compute Storageのサービスレベルで保全されるので、あとはdocker実行環境とレジストリイメージがあればdocker資産を利用できる環境がそろいます。

中馬崇尋
Chuma Takahiro