プライベートDocker RegistryをGoogle Container Registry で構築

プライベートなDocker Registryを[Google Container Registry](https://cloud.google.com/container-registry)で構築する手順。

# Google Container Registry
自前のDocker Registryを構築しようと思うと、認証周りなどで結構面倒です。
Google Container Registryは、有償ではありますが、さくっと利用でき、
認証もOK。しかも有償と言ってもGoogle Cloud Storageの利用分だけですので、かなりお得に利用出来ます。

今は60日間無料＋$300分のクレジットもついてくるのでお試しにはもってこいかと。

## サインアップ
[Container Registry](https://cloud.google.com/container-registry)のページで「無料トライアルを開始」から必要事項を登録するだけ。

## 準備
Container Registry利用の準備は簡単です。
サインアップした後、Google Cloud Platformで新規プロジェクトを作成します。

Container Registryを操作するにはgcloudが必要なのでGoogle Cloud SDK をインストールします。
詳細は[こちら](https://cloud.google.com/sdk/?hl=ja#Quick_Start)に記載されている通りです。

CentOS7の場合

```
[vagrant@host01 ~]$ curl https://sdk.cloud.google.com | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   421    0   421    0     0   1042      0 --:--:-- --:--:-- --:--:--  1042
Downloading Google Cloud SDK install script: https://dl.google.com/dl/cloudsdk/channels/rapid/install_google_cloud_sdk.bash
######################################################################## 100.0%
Running install script from: /tmp/tmp.WyEvTDnh8K/install_google_cloud_sdk.bash
which curl
curl -# -f https://dl.google.com/dl/cloudsdk/channels/rapid/google-cloud-sdk.tar.gz
######################################################################## 100.0%

Installation directory (this will create a google-cloud-sdk subdirectory) (/home/vagrant): 
mkdir -p /home/vagrant
tar -C /home/vagrant -xvf /tmp/tmp.udd0upV342/google-cloud-sdk.tar.gz
google-cloud-sdk/

〜〜　中略　〜〜

google-cloud-sdk/.install/.download/

/home/vagrant/google-cloud-sdk/install.sh
Welcome to the Google Cloud SDK!

To help improve the quality of this product, we collect anonymized data on how
the SDK is used. You may choose to opt out of this collection now (by choosing
'N' at the below prompt), or at any time in the future by running the following
command:
    gcloud config set disable_usage_reporting true

Do you want to help improve the Google Cloud SDK (Y/n)?  


This will install all the core command line tools necessary for working with
the Google Cloud Platform.



Your current Cloud SDK version is: 93.0.0
Installing components from version: 93.0.0

┌────────────────────────────────────────────────────────────────────────────┐
│                    These components will be installed.                     │
├─────────────────────────────────────────────────────┬────────────┬─────────┤
│                         Name                        │  Version   │   Size  │
├─────────────────────────────────────────────────────┼────────────┼─────────┤
│ BigQuery Command Line Tool                          │     2.0.18 │ < 1 MiB │
│ BigQuery Command Line Tool (Platform Specific)      │     2.0.18 │ < 1 MiB │
│ Cloud SDK Core Libraries (Platform Specific)        │ 2015.11.24 │ < 1 MiB │
│ Cloud Storage Command Line Tool                     │       4.16 │ 2.6 MiB │
│ Cloud Storage Command Line Tool (Platform Specific) │       4.15 │ < 1 MiB │
│ Default set of gcloud commands                      │            │         │
└─────────────────────────────────────────────────────┴────────────┴─────────┘

For the latest full release notes, please visit:
  https://cloud.google.com/sdk/release_notes

╔════════════════════════════════════════════════════════════╗
╠═ Creating update staging area                             ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Installing: BigQuery Command Line Tool                   ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Installing: BigQuery Command Line Tool (Platform Spec... ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Installing: Cloud SDK Core Libraries (Platform Specific) ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Installing: Cloud Storage Command Line Tool              ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Installing: Cloud Storage Command Line Tool (Platform... ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Installing: Default set of gcloud commands               ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Creating backup and activating new installation          ═╣
╚════════════════════════════════════════════════════════════╝

Performing post processing steps...done.

Update done!


Modify profile to update your $PATH and enable shell command 
completion? (Y/n)?  

The Google Cloud SDK installer will now prompt you to update an rc 
file to bring the Google Cloud CLIs into your environment.

Enter a path to an rc file to update, or leave blank to use 
[/home/vagrant/.bashrc]:  
Backing up [/home/vagrant/.bashrc] to [/home/vagrant/.bashrc.backup].
[/home/vagrant/.bashrc] has been updated.
Start a new shell for the changes to take effect.


For more information on how to get started, please visit:
  https://developers.google.com/cloud/sdk/gettingstarted


```

基本、デフォルトでOKです。
シェル再起動

```
[vagrant@host01 ~]$ exec -l $SHELL
```

## プロジェクトの設定
先ほどGoogle Cloud Platformに作成したプロジェクトIDを設定します。
Google Cloud SDK をインストールして初めてログインする時は、下記のように認証コードを求められますので、表示されるURLから認証コードを取得します。

```
[vagrant@host01 ~]$ gcloud auth login
Go to the following link in your browser:

    https://accounts.google.com/o/oauth2/auth?redirect_uri=************


Enter verification code: 
```

取得したコードを入力

```
Enter verification code: ********取得したコード*********
Saved Application Default Credentials.

You are now logged in as [***ユーザー名***].
Your current project is [None].  You can change this setting by running:
  $ gcloud config set project PROJECT_ID
[vagrant@host01 ~]$ 
```

指示通りプロジェクトIDを設定します。

```
[vagrant@host01 ~]$ gcloud config set project [プロジェクトID]
Loading user based configuration file: [/home/vagrant/.config/gcloud/properties].
User based configuration files are deprecated and will not be read in a future gcloud release.
WARNING: Creating and activating new configuration [default].
WARNING: Importing legacy user properties.
```

## イメージをPUSH
適当にDockerのイメージをPULL

```lang:Dockerfile
FROM centos:7
```

```
sudo docker build -t gcr.io/my_project_id/centos7base .
```

タグ名は以下のように指定します。
**gcr.io/プロジェクトID/イメージ名**

*タグ名にはハイフン(-)が使えないので、ハイフンはアンスコ(_)に置換して下さい。*

```
[vagrant@host01 centos7base]$ sudo docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
gcr.io/my_project_id/centos7base   latest              c8a648134623        3 weeks ago         196.6 MB
centos                          7                   c8a648134623        3 weeks ago         196.6 MB
```

### RegistryへPUSH
Google Container RegistryにPUSHします。

```
[vagrant@host01 centos7base]$ gcloud docker push gcr.io/my_project_id/centos7base
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
```

dockerをsudoで実行していたので、エラーに。。。
vagrantユーザーをdockerグループに追加します。

### sudo無しでDocker実行

```
[vagrant@host01 centos7base]$ sudo groupadd docker
[vagrant@host01 centos7base]$ sudo usermod -a -G docker ${USER}
[vagrant@host01 centos7base]$ sudo systemctl restart docker
[vagrant@host01 centos7base]$ exit
```

sudo無しでDockerコマンド実行

```
[vagrant@host01 ~]$ docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos                          7                   c8a648134623        3 weeks ago         196.6 MB
gcr.io/zum01_1195/centos7base   latest              c8a648134623        3 weeks ago         196.6 MB
```

### RegistryへPUSH（再）

```
[vagrant@host01 ~]$ gcloud docker push gcr.io/my_project_id/centos7base
The push refers to a repository [gcr.io/my_project_id/centos7base] (len: 0)
Repository does not exist: gcr.io/my_project_id/centos7base
```

また失敗。。。

先ほど自分で書いたのですが、
**タグ名にはハイフン(-)が使えないので、ハイフンはアンスコ(_)に置換して下さい。**

これでした。
プロジェクト名を修正し、再度PUSH。

```
[vagrant@host01 ~]$ gcloud docker push gcr.io/my_project_id/centos7base
The push refers to a repository [gcr.io/my_project_id/centos7base] (len: 1)
c8a648134623: Pushed 
2bf4902415e3: Pushed 
latest: digest: sha256:d8371b54154b029a7c8e453a8aca5870e3b509c1c12cef882793266fba751c10 size: 6282
```

やっと成功

Developer Consoleで確認すると、こんな感じです。

![スクリーンショット 2016-01-23 12.00.13.png](https://qiita-image-store.s3.amazonaws.com/0/93508/258c508a-7de0-8204-45ac-9e9e332e12fb.png)

## イメージをPULL

別のマシンからPULL、したかったですが、めんどいので先ほどのイメージを削除して、PULLしてみます。

```
[vagrant@host01 ~]$ docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ago          430.5 MB
centos                          7                   c8a648134623        3 weeks ago         196.6 MB
gcr.io/zum01_1195/centos7base   latest              c8a648134623        3 weeks ago         196.6 MB
[vagrant@host01 ~]$ docker rmi c8a648134623
Untagged: centos:7
Deleted: c8a648134623c453dc62abcd747eafa40af057e28cd5937baeebe2ed4c32094e
Deleted: 86bcb57631bd122c32b8e277b64b45ac00382e78e0d21530a50c090fd739d0ee
Deleted: 2bf4902415e362b7e531ac48c5bb4b265292375ae9b9bf735360be9cbca5f8e5
Deleted: fa5be2806d4c9aa0f75001687087876e47bb45dc8afb61f0c0e46315500ee144
[vagrant@host01 ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
[vagrant@host01 ~]$ 
```

いざ、PULL

```
[vagrant@host01 ~]$ gcloud docker pull gcr.io/my_project_id/centos7base
Using default tag: latest
latest: Pulling from my_project_id/centos7base
fa5be2806d4c: Pull complete 
2bf4902415e3: Pull complete 
86bcb57631bd: Pull complete 
c8a648134623: Pull complete 
Digest: sha256:d8371b54154b029a7c8e453a8aca5870e3b509c1c12cef882793266fba751c10
Status: Downloaded newer image for gcr.io/my_project_id/centos7base:latest
[vagrant@host01 ~]$ docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
gcr.io/my_project_id/centos7base   latest              c8a648134623        3 weeks ago         196.6 MB
```

自前でプライベートRegistryを構築しようとすると、認証など面倒なことが多いですが、
Google Container Registryは当然認証が利用出来ますし、設定もDeveloper Consoleから出来るので楽ちんです。
[コストもCloud Storage分](https://cloud.google.com/storage/pricing?hl=ja)だけなので、月に1GBで約3円と安く、個人ベースでの利用も可能な範囲と思います。

チームで利用するには、Google Cloud SDK のインストールが必要だったり、一手間必要ですが、
自前のDockerRegistryを立てたとしても、事前にあれこれ手間がかかりますので、個人的にはこちらの方がかなり楽かと思います。

これを利用して、大分間が空きましたが、[Weblogicコンテナ環境](http://qiita.com/zum/items/11ddf0df39877a26b5e6)とか色々遊んでみようかと思います。

## おまけ
Google Container Registryのリージョンは

- us.gcr.io　アメリカ
- eu.gcr.io　ヨーロッパ
- asia.gcr.io　アジア

の三箇所のようです。
リージョンの指定はイメージのタグ名に指定します。
**リージョン/プロジェクトID/イメージ名**
今回はgcr.ioを利用して下記のようにしましたね。

`gcr.io/my_project_id/centos7base`

gcr.ioの場合はus.gcr.ioに振られるそうです。
日本から利用する場合は、
asia.gcr.ioが良いと思うので、
`asia.gcr.io/my_project_id/centos7base`

こんな感じで。