これは大々的に発表された割には誰も使っているという噂を聞かない Google が提供する Docker の Private repository サービスである Google Container Registry を、Google Container Engine (以降、GKE)と組み合わせて使ってみようといいう記事です。
結論
- GKE 使うなら、Google Container Registryはとても便利なので、利用を強く推奨します。
- GKE のドキュメントがなさすぎるのが普及にしない原因なんじゃないかと思う。
利点
Docker の Private リポジトリサービスは本家の Docker Hub とか Quay.IOなどがありますが、Google Container Registry の利点は、
- Private リポジトリの数は無制限で、安い(GCS のストレージとネットワーク料金だけで済む = 約3円/GB/月)
- GKE からのイメージの取得が速い
といったところでしょうか。
利用手順
利用手順は公式ドキュメントに書いてあるので、詳細はそちらを参照してください。
が、相変わらず日本語ドキュメントはないので、上記から重要な部分だけ抜粋して解説していきます。
gcloud toolのインストール
gcloud preview commands CLI のインストール
Google Container Registry はまだ preview なので、gcloud preive commands 経由で操作します。以下のコマンドでインストールします。
$ gcloud components update preview
プロジェクトの作成
GKEを利用するプロジェクトを作る/選択して、gcloud CLI のデフォルトとして設定したおきます。この後のために、自分が owner か editor 権限のあるプロジェクトを選んでください。
$ gcloud auth login
$ gcloud config set project your-project-id
Docker インストール
https://docs.docker.com/installation/ を参照。
Docker イメージの build & push
イメージは何でも良いので、とりあえず以下の1行を書いた Dockerfile という名前のファイルを作ります。
FROM dockerfile/nginx
次にこれを特別なタグ名を付けてビルドします。タグ名の規則は、project IDが your-project-id
だった場合、
gcr.io/your_project_id/image-name
です。注意点としては、Image の tag 名に '-'(ハイフン)
は使えないので、Project ID にハイフンが入っている場合、アンダースコアに置換しなければいけないことです。
なので、ビルドするには、
$ docker build -t gcr.io/your_project_id/nginx .
で、最後に gcloud preview docker
コマンドで push します。
$ gcloud preview docker push gcr.io/your_project_id/nginx
このコマンドは自動的に artifacts.your-project-id.appspot.com
という名前の GCS バケットを US リージョンに作成します。なので、GKE クラスタを US リージョン以外に立てると、ネットワーク転送量がかかるのでご注意を。
Docker イメージの Pull(おまけ)
今回は GKE からの利用を想定しているので使いませんが、普通に pull もできます。開発用イメージの共有とかに使えるかもしれません。
$ gcloud preview docker pull gcr.io/your_project_id/nginx
GKE クラスタの立ち上げ
GKEクラスタの立ち上げの方法が公式ドキュメントに書いていないので、やり方を書いておきます。正直、preview サービスで結構コマンド体系が変わるのが悩みどころです。
#
# 利用するネットワークを作成
#
$ gcloud compute networks create gketest-network \
--range 10.241.0.0/16
#
# SSH/HTTP ポートを解放
#
$ gcloud compute firewall-rules create gketest-network-allow-ssh \
--allow tcp:22 \
--network gketest-network \
--source-ranges 0.0.0.0/0 # 気になるならここは自分のIPに限定する
$ gcloud compute firewall-rules create gketest-network-allow-http \
--allow tcp:80 \
--network gketest-network \
--source-ranges 0.0.0.0/0
#
# 作成したネットワークを利用するクラスタの起動
#
$ gcloud preview container clusters create gketest \
--zone us-central1-a \
--network gketest-network \
--num-nodes 1 \
--machine-type n1-standard-1 \
--no-set-default
で、クラスタが起動したら、このクラスタに先ほど作成したイメージを利用する Pod を作成します。
以下のような JSON 形式の設定ファイルを nginx-pod.json
という名前で作成し、
{
"id": "nginx",
"kind": "Pod",
"apiVersion": "v1beta1",
"desiredState": {
"manifest": {
"version": "v1beta1",
"containers": [{
"name": "nginx",
"image": "gcr.io/your_project_id/nginx",
"ports": [{
"containerPort": 80,
"hostPort": 80
}]
}]
}
},
"labels": {
"name": "nginx"
}
}
これを使って pod を作成します。pod の作成には gcloud preview container kubectl
コマンドを利用します。
$ gcloud preview container kubectl \
--cluster gketest \
--zone us-central1-a \
create -f nginx-pod.json
大体、30秒〜1分ぐらいでアクセスできる様になります。以下のコマンドで、status が Running になっていれば、準備完了です。
$ gcloud preview container kubectl \
--cluster gketest \
--zone us-central1-a \
get pods
最後にサービス定義 nginx-service.json
を作って、
{
"id": "nginx-service",
"apiVersion": "v1beta1",
"kind": "Service",
"port": 80,
"containerPort": 80,
"selector": {
"name": "nginx"
},
"createExternalLoadBalancer": true
}
サービスを立ち上げます。
$ gcloud preview container kubectl \
--cluster gketest \
--zone us-central1-a \
create -f nginx-service.json
サービスのIPアドレスは、Compute Engine -> Network メニューからみつけられます。
これをブラウザで開いて、nginx の画像が確認できれば成功です。