GKEでGoogle Container Registryを利用する

Google Container Engine（GKE）でコンテナを起動する際に、dockerイメージの保管場所にGoogle Container Registryを使用する方法です。

ローカルでdockerイメージを作成 -> Google Container Registryにpush　-> pushしたdockerイメージをGKEで利用する、といった手順になります。

# 環境
- ローカルPC
 - PC：MacBook Pro
 - OS：OS X El Capitan（ver 10.11.6）
 - Docker：Docker for Mac[stable] ver 1.12.1（build：12133）

# 前提
下記フォルダ構成で、各種リソースをローカルに配置することを前提としています。

```shell
gke-test
  |--Dockerfile
  |--html
    |--index.html
```   

# Google Cloud SKDのインストール
ローカルからGoogle Container Registryにdockerイメージをpushする為に、Google Cloud SDKを下記よりインストールします。
[Google Cloud SDKのインストール](https://cloud.google.com/sdk/)

# dockerイメージの作成
自分で作成したイメージがGKEで使用されていることを確認する為に、簡単なHTMLファイルをnginxの公開用フォルダに格納して、それをdockerイメージにします。

・HTMLファイルの作成

```html:index.html
<!DOCTYPE html>
<head>
  <meta charset="utf-8">
  <title>nginx test</title>
</head>
  <body>
    <h1>Hello World!</h1>
  </body>
</html>
```

・Dockerfileの作成
公式のnginxイメージをベースに、作成したhtmlファイルをnginxの公開フォルダにコピーするDockerfileを作成します。

```shell:Dockerfile
FROM nginx
COPY html /usr/share/nginx/html
```

・dockerイメージの作成
Dockerfileを元にdockerイメージを作成します。
Google Container Registryにpushできるようにする為に、作成するdockerイメージには「リージョン/プロジェクトID/イメージ名:タグ」の形式で名前をつけています。

```shell
$ cd gke-test
$ docker build -t gcr.io/xxxxxx-xxxxxx-123456/mynginx:latest .
```
なお、Google Container Registryで使用できるリージョンは

| リージョン      | 地域     |
|:-------------|:--------|
| us.gcr.io    |アメリカ    |
| es.gcr.io    |ヨーロッパ  |
| asia.gcr.io  |アジア     |

となっていて、gcr.ioと指定した場合は、us.gcr.ioを指定したことになり、アメリカのリージョンを利用することになります。
また、プロジェクトIDはGoogle Cloud Platform上のプロジェクトIDを指定して下さい。

# Google Container Registryへdockerイメージをpush
dockerイメージの作成が完了したら、Google Container Registryへdockerイメージをpushします。
先にインストールしたGoogle Cloud SDKを使用してpushを行います。

```shell
$ gcloud docker push gcr.io/xxxxxx-xxxxxx-123456/mynginx:latest
```

pushに成功すれば下記のようにGoogle Container Resitoryにイメージが保管されたことを確認できます。

<img width="1280" alt="GKE-GCR-イメージpush後.png" src="https://qiita-image-store.s3.amazonaws.com/0/141783/99d17120-50e4-a84a-fd1a-234bebf881a0.png">

# pushしたdockerイメージの利用
[前回](http://qiita.com/smiyaguchi/items/0897bc14ddbc5730acdd)と同じ構成で、ReplicationController、Serviceを立ち上げます。
その際、ReplicationControllerで使用するdockerイメージにGoogle Container Registryに保管したものを使用するように、ReplicationControllerのyamlファイルを修正します。

```shell:nginx-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: frontend
spec:
  replicas: 3
  selector:
    app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx-container
        image: gcr.io/xxxxxx-xxxxxx-123456/mynginx:latest #変更箇所
        ports:
        - containerPort: 80
```

# ReplicationController、Serviceの起動
[前回](http://qiita.com/smiyaguchi/items/0897bc14ddbc5730acdd)と同じ方法で、ReplicationControllerとServiceを立ち上げます。
立ち上げた後にブラウザでアクセスして、用意したindex.htmlファイルの内容が表示されれば成功です。

<img width="1255" alt="GKE-pushイメージ使用確認.png" src="https://qiita-image-store.s3.amazonaws.com/0/141783/5f09c9e2-b9de-5060-8f50-945c566212ac.png">

# 最後に
Google Container Registryにdockerイメージを保管するまでのやり方を把握するのに少し時間を要しました。
しかし、一度やり方がわかってしまえば、プライベートなDocker Registryを簡単に利用でき、GKEとの連携も特別な設定が不要なのですごく便利だと思います。

# 参考リンク
[プライベートDocker RegistryをGoogle Container Registry で構築](http://qiita.com/zum/items/1904ccd280879ca481c5)