EC2+S3を利用してDockerのPrivate Repositoryを作る


はじめに
==========

Dockerを組織で使おうとすると、公開リポジトリ以外のリポジトリが欲しくなります。
今回は、EC2+S3を使ったお手軽Private Repositoryの作り方のメモです。
S3をリポジトリのStorageにすることで、Instanceの容量を気にしなくて良くなります。

手順
====
流れ
----

1) S3のBucketを作成する
2) IAM Userを作成する
3) EC2 Instanceを作成する
4) Docker の Install
5) Docker Repositoryの設定

1) S3のBucketを作成する
------------------

普通にAWSのConsoleから S3のBucketを作成します。
**my-docker** という名前で作ったとします。
Regionは(3)のEC2のRegionと同じものにしましょう。

2) IAM Userを作成する
------------------

作成したBucketに対してFull AccessできるUserを作成します。
その **AWS_KEY** , **AWS_SECRET** はちゃんと保存しておいてください。

Policyは例えば、以下のようにしておきます。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": ["arn:aws:s3:::my-docker/*", "arn:aws:s3:::my-docker"]
    },{
        "Effect": "Allow",
        "Action": "s3:ListAllMyBuckets",
        "Resource": "arn:aws:s3:::*"
    }
  ]
}
```

今回は`ListAllMyBuckets`の権限は無くても動くような気がしますが、あった方が便利なときもあるので付けておきます。

3) EC2 Instanceを作成する
----------------------

今回は以下の設定を選びました。

* Instanceは micro instance
* OS： Ubuntu Server 13.10 - ami-b945ddb8 (64-bit)
* SecurityGroup で docker_repo というのを作り、 22, 80 を とりあえず ANY で開けておいた。

80番Portは後ほどIPアドレスで絞るかELBからのみの設定にします。

この Instanceの Host名は **my-docker.example.com** とします(Route53や適切なDNSに登録する、という想定。IPアドレス可ですが、後々不便だとは思います)。

4) Docker の Install
------------------

http://docs.docker.io/en/latest/installation/amazon/ の手順で行います。

*QuickStart* のやり方だと動かなかったので、 *Standard Ubuntu Installation* の方法で行いました。

以下のようにしてDocker環境をSetupします。

```sh
# ssh -i KEY ubuntu@HOSTIP
sudo apt-get update
sudo apt-get install linux-image-extra-`uname -r`

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9

sudo sh -c "echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
sudo apt-get update
sudo apt-get install lxc-docker
```


5) Docker Repositoryの設定
------------------

### 動作確認
まず、Docker RepositoryのImageが起動するか確認します。

```
sudo docker run -p 80:5000 -e SETTINGS_FLAVOR=prod -e AWS_KEY='<AWS_KEY>' -e AWS_SECRET='<AWS_SECRET>' -e AWS_BUCKET=my-docker  blalor/docker-s3-registry
```

無事に起動したら、自動起動の設定をします。

### 自動起動の設定

まず、以下のファイルを作成します。

```/etc/init/docker-repository.conf
description "Docker Repository Container"

start on started docker
stop on runlevel [!2345]

respawn

exec docker run -p 80:5000 -e SETTINGS_FLAVOR=prod -e AWS_KEY='<AWS_KEY>' -e AWS_SECRET='<AWS_SECRET>' -e AWS_BUCKET=my-docker  blalor/docker-s3-registry
```

上記の設定を使って起動します。

```
sudo initctl reload-configuration
sudo initctl start docker-repository
```

### 動作確認

どこか別の場所からdockerを使って、Push成功すればOK.

```
docker pull centos
docker tag centos my-docker.example.com/centos
docker push my-docker.example.com/centos 
```


課題
========

今回、SSLで接続する方法が上手く行きませんでした。

調べていくとサーバには正規のSSL証明書を使って docker login すれば良いというような記述が見受けられますが、
その docker login で

```
% docker login https://docker.example.com
2014/02/19 17:20:42 Invalid Registry endpoint: Get https://docker.example.com/v1/_ping: x509: certificate signed by unknown authority
```

となってダメでした。

```
% curl https://docker.example.com/v1/_ping
true
```
なので、証明書などはOKなのですが。

ELBでSSLのTerminationをさせているのも関係あるのかもしれません。

今後の課題としたいと思います。