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