Docker Private Regisrty2.0を認証付きでさくっと動かす

# 概要

Docker Private Registry2.0の認証付きです。
Registryはv1とv2の2種類存在します。
dokcerのバージョンが1.6以降ならv2に対応してます

前回の認証なしはこちらを[参照](http://qiita.com/otmb/items/17bb34f02badf560f914)

# 環境

* Boot2Docker 1.7.0
* Mac Pro Yosemite

# reg.loというHostで準備していく
```
$ mkdir registry
$ cd registry
$ sudo vi /etc/hosts
192.168.59.103 reg.lo
$ boot2docker start
$ eval "$(boot2docker shellinit)"
```

# 鍵作成、CN=reg.loを設定する
```
$ mkdir -p certs && openssl req \
    -newkey rsa:4096 -nodes -sha256 -keyout certs/docker-registry.key \
    -x509 -days 365 -out certs/docker-registry.crt

Generating a 4096 bit RSA private key
.............................................................++
...................................................................++
writing new private key to 'certs/docker-registry.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:reg.lo
Email Address []:
```

# 鍵をboot2dockerに設置(クライアントのdockerへの設定)
```
$ boot2docker ssh
$ cd /var/lib/boot2docker
$ sudo vi bootsync.sh
#!/bin/sh
echo "192.168.59.103 reg.lo" >> /etc/hosts
cat /var/lib/boot2docker/reg.lo.pem >> /etc/ssl/certs/ca-certificates.crt

$ sudo chmod +x bootsync.sh
// boot2dockerはUsersがMountされているのでそこから取得
$ sudo cp /Users/xxx/registry/certs/docker-registry.crt ./reg.lo.pem
$ exit
$ boot2docker ssh sudo /etc/init.d/docker restart
```
pem の読み込みの挙動があやしいのでcertificates.crtに直接書き込むことにした。
前回のProxyを挟まない場合はpemでも正常動作する。

永続化(内容だけみると起動時反映処理ですが。。)することで`$ boot2docker start`時に動的に設定が読み込まれる
なお、上記永続化はdocker v1.6以降のやり方になる

永続化の参照

* [Persist data](https://github.com/boot2docker/boot2docker#persist-data)
* [Persist data FAQ](https://github.com/boot2docker/boot2docker/blob/master/doc/FAQ.md#local-customisation-with-persistent-partition)

# registryを実行
```
$ docker run -d -v $(pwd)/data:/tmp/registry-dev --name docker-registry registry:2.0
```

# 適当にユーザーとパスワード設定
```
$ htpasswd -c .htpasswd hoge
```

# NginxなProxyを実行

```
$ docker run -d -p 443:443 \
  -e REGISTRY_HOST="docker-registry" \
  -e REGISTRY_PORT="5000" \
  -e SERVER_NAME="reg.lo" \
  --link docker-registry:docker-registry \
  -v $(pwd)/.htpasswd:/etc/nginx/.htpasswd:ro \
  -v $(pwd)/certs:/etc/nginx/ssl:ro \
  --name docker-registry-proxy \
  containersol/docker-registry-proxy
```

nginxの設定はこちらを参照
http://container-solutions.com/running-secured-docker-registry-2-0/

# 接続テスト
```
$ docker pull hello-world
$ docker tag hello-world reg.lo:443/hello-world 
$ docker push reg.lo:443/hello-world
The push refers to a repository [reg.lo:443/hello-world] (len: 1)
91c95931e552: Image push failed 

Please login prior to push:
Username: hoge
Password: 
Email: 
WARNING: login credentials saved in /Users/xxx/.docker/config.json
Login Succeeded
The push refers to a repository [reg.lo:443/hello-world] (len: 1)
91c95931e552: Image already exists 
a8219747be10: Image successfully pushed 
Digest: sha256:2b471673e2552749332efa8cac83d4635dce8c276637d630e4c85ac99b4700be
```

# メモ
フロントエンドのUIも試したかったけど、Issue見るとまだ2.0には対応してない模様
マイルストーンでも眺めるか。。
https://github.com/kwk/docker-registry-frontend/milestones

Search機能がうまく動かない。これもバグっぽい