Google Container Registry を Google Container Engine から使う方法

これは大々的に発表された割には誰も使っているという噂を聞かない Google が提供する Docker の Private repository サービスである Google Container Registry を、Google Container Engine (以降、GKE）と組み合わせて使ってみようといいう記事です。

## 結論

- GKE 使うなら、Google Container Registryはとても便利なので、利用を強く推奨します。
- GKE のドキュメントがなさすぎるのが普及にしない原因なんじゃないかと思う。

## 利点

Docker の Private リポジトリサービスは本家の [Docker Hub](https://hub.docker.com) とか [Quay.IO](https://quay.io/)などがありますが、Google Container Registry の利点は、

- Private リポジトリの数は無制限で、安い（GCS のストレージとネットワーク料金だけで済む = 約3円/GB/月）
- GKE からのイメージの取得が速い

といったところでしょうか。

## 利用手順

利用手順は公式ドキュメントに書いてあるので、詳細はそちらを参照してください。

https://cloud.google.com/tools/container-registry/

が、相変わらず日本語ドキュメントはないので、上記から重要な部分だけ抜粋して解説していきます。

### gcloud toolのインストール

https://cloud.google.com/sdk/#Quick_Start

### gcloud preview commands CLI のインストール

Google Container Registry はまだ preview なので、gcloud preive commands 経由で操作します。以下のコマンドでインストールします。

```bash
$ 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 もできます。開発用イメージの共有とかに使えるかもしれません。

```bash
$ gcloud preview docker pull gcr.io/your_project_id/nginx
```

### GKE クラスタの立ち上げ

GKEクラスタの立ち上げの方法が公式ドキュメントに書いていないので、やり方を書いておきます。正直、preview サービスで結構コマンド体系が変わるのが悩みどころです。

```bash
#
# 利用するネットワークを作成
#
$ 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` という名前で作成し、

```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` コマンドを利用します。

```bash
$ gcloud preview container kubectl \
    --cluster gketest \
    --zone us-central1-a \
    create -f nginx-pod.json
```

大体、30秒〜1分ぐらいでアクセスできる様になります。以下のコマンドで、status が Running になっていれば、準備完了です。

```bash
$ gcloud preview container kubectl \
    --cluster gketest \
    --zone us-central1-a \
    get pods
```

最後にサービス定義 `nginx-service.json` を作って、

```json
{
  "id": "nginx-service",
  "apiVersion": "v1beta1",
  "kind": "Service",
  "port": 80,
  "containerPort": 80,
  "selector": {
    "name": "nginx"
  },
  "createExternalLoadBalancer": true
}
```

サービスを立ち上げます。

```bash
$ gcloud preview container kubectl \
    --cluster gketest \
    --zone us-central1-a \
    create -f nginx-service.json
```

サービスのIPアドレスは、Compute Engine -> Network メニューからみつけられます。

![スクリーンショット 2015-03-20 22.50.02.png](https://qiita-image-store.s3.amazonaws.com/0/25774/17d035b1-c780-461c-3dfe-589fed3c01db.png)

これをブラウザで開いて、nginx の画像が確認できれば成功です。

![スクリーンショット 2015-03-20 22.58.15.png](https://qiita-image-store.s3.amazonaws.com/0/25774/638a358f-e182-5604-2cb9-c1d3b24de192.png)