Docker Cloud Automated build from GitHub

# 背景と目的
ローカル環境に色々なDockerfileが増えてきた。
ごちゃごちゃし始めたので、GitHubにアップしてスッキリしたい。
ついでに、前から気になっていたAutomated buildを試してみる。
[公式ドキュメント](https://docs.docker.com/docker-cloud/builds/automated-build/)

# 注意
[Product and tool manuals](https://docs.docker.com/manuals/)に
「Docker Hub - Superseded by Docker Store and Docker Cloud」
と記載されています。

~~https://hub.docker.com/~~ ではなく
https://cloud.docker.com/ から設定やリポジトリの作成を行って下さい。

# 手順概要
1. GitHubにリポジトリを作成
2. Docker Cloudの設定からGitHubを連携
3. Docker Cloudにリポジトリを作成
4. GitHubにDockerfileを保存
5. Docker Cloudでビルドの状況を確認

## GitHubにリポジトリを作成
[Build your own image](https://docs.docker.com/engine/getstarted/step_four/)を参考にDockerfileを作るので、リポジトリ名は **whalesay** にしました。
**README**は、Automated buildが完了後、Docker Cloudにも同じ内容が表示されます。
![Create_a_New_Repository.png](https://qiita-image-store.s3.amazonaws.com/0/68632/578663cd-609b-4722-1746-8135be758f7c.png)


リポジトリの Settings / Integrations & services / Add service から Docker を選択します。
![Integrations_and_services.png](https://qiita-image-store.s3.amazonaws.com/0/68632/5d0ce88e-1320-dbe4-b57a-9133591114fa.png)

Add serviceをクリックします。
![Add_service.png](https://qiita-image-store.s3.amazonaws.com/0/68632/3a7d0c5d-4985-d48c-76de-aa06100205c1.png)


## Docker Cloudの設定からGitHubを連携
Docker Cloudの設定からGitHubへ接続します。
![Docker_Cloud.png](https://qiita-image-store.s3.amazonaws.com/0/68632/40f9909f-a751-2766-39fd-ab4a29e1a3b6.png)

GitHubへ転送されるので許可します。
![Authorize_Docker_Cloud_Builder.png](https://qiita-image-store.s3.amazonaws.com/0/68632/456b8924-2fa9-cd84-b589-143c44da60bd.png)


## Docker Cloudにリポジトリを作成
Docker側のリポジトリ名は、GitHubと一致させる必要はないが、今回は **whalesay** にしました。
Build SettingsでGitHubをクリックして、GitHub側のリポジトリを選択します。
![Docker_Cloud.png](https://qiita-image-store.s3.amazonaws.com/0/68632/5f415988-8aeb-6f0a-1b6a-e7ccca0f564e.png)

連携がうまくいくと Recent builds にGitHubの情報が表示されます。
ただし、この段階では、ビルドは行われません。
この後、GitHubに更新が発生するとビルドが行われます。ビルド完了後にGitHubのREADMEも表示されます。
![Docker_Cloud.png](https://qiita-image-store.s3.amazonaws.com/0/68632/0f1d1192-cb49-cc45-98fa-46a7c2a85212.png)


## GitHubにDockerfileを保存
GitHubのリポジトリをcloneします。

```
$ git clone git@github.com:maedamikio/whalesay.git
$ cd whalesay
```

Dockerfileを作成します。

```
$ vim Dockerfile
FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay
```

Dockerfileを保存します。

```
$ git add Dockerfile
$ git commit -m "create Dockerfile"
$ git push
```

## Docker Cloudでビルドの状況を確認
Docker CloudのリポジトリでBuildsを確認します。
Build Statusは **EMPTY** です。キューに登録されているが、ビルドは始まっていない状態です。
![Docker_Cloud.png](https://qiita-image-store.s3.amazonaws.com/0/68632/66ec3aed-0400-e845-54bc-b42848e572ab.png)

2〜3分経ったでしょうか？Build Statusが **BUILDING** になりました。
![Docker_Cloud.png](https://qiita-image-store.s3.amazonaws.com/0/68632/89ce01c7-b1b6-19cd-a028-cc3bdc55d2eb.png)


Timelineから詳細を確認できます。
![Docker_Cloud.png](https://qiita-image-store.s3.amazonaws.com/0/68632/42210307-91d8-fd38-81c6-d0cc7d35e525.png)


ビルドが完了しました。約15分かかりました。
ちなみに、ローカル環境(i7 3GHz)では、3分弱でした。apt-get updateが2分強でした。
棒グラフをクリックすると詳細が表示されます。
![Docker_Cloud.png](https://qiita-image-store.s3.amazonaws.com/0/68632/892ae057-fd1c-ccbd-ac7e-eac94092c46a.png)
![Docker_Cloud.png](https://qiita-image-store.s3.amazonaws.com/0/68632/a9474313-eb46-b755-727d-3d60dc737d91.png)

ビルド環境を変更することもできます。
![Docker_Cloud.png](https://qiita-image-store.s3.amazonaws.com/0/68632/8f0afa59-0092-54e4-5c3f-f51eb95523e8.png)

BUILD RULESでBuild Cachingが有効になっているので、Dockerfileに変更がほとんどなければビルド時間は短縮されます。
BUILD LOCATIONは「Small 1 CPU, 1GB RAM」です。課金無しでも「Large(even faster) 1CPU, 3.75GB RAM」に変更できます。
ただ、人気があるのか、ビルド時間は、あまり短縮されません。むしろ、キャッシュ有りでSmallの倍の時間がかかってます。

下記のグラフは、キュー待ち時間(Queue)とビルド時間(Success)です。Dockerfileは変更していません。Trigger Buildを使ってビルドを再実行しました。左から

- 初回のビルド。Small。
- 2回目のビルド。Small。キャッシュの効果でビルド時間は大幅に短縮。
- 3回目のビルド。Small。キュー待ち時間が発生。この辺りは、運次第っぽい。
- 4回目のビルド。Largeへ変更。キュー待ちは発生しないが、ビルド時間はSmallの2倍超。
![Docker_Cloud.png](https://qiita-image-store.s3.amazonaws.com/0/68632/3e4d02af-4a7f-66b8-17ff-9c83b0531aba.png)



# まとめ
- 手順自体は、非常に簡単でした。DockerfileをGitHubにアップしてスッキリしたいと思います。
- Docker Cloudの無料プライベートリポジトリは、1つなので、複数のプライベートリポジトリを利用する場合は、課金が必要です。
- ビルドは、**Build on my own nodes**が選べるので、高性能環境があればビルド時間を短縮出来るのだと思う。ただ、そこまでするならローカル環境でも良い気がする。
- [Automated repository tests](https://docs.docker.com/docker-cloud/builds/automated-testing/)と[Redeploy services automatically](https://docs.docker.com/docker-cloud/apps/auto-redeploy/)も出来るのでやってみたいです。