CircleCI で入門する Docker

# [at コンテナに乗り遅れた人たちへ](https://askul.connpass.com/event/104621/) 2018/11/02

---

## 想定する対象者

* コンテナをこれから利用していきたい (大前提)
* Web アプリケーション開発者

---

## 今日話さないこと

* CircleCI の細かいセットアップ周り
    * 適宜ググるなどしましょう
    * 資料は公開してるので、メモしたり写真を取るよりも雰囲気で聞きましょう

---

## Docker を始めよう！

* どこから始めるか?
* 本番環境？
    * アーキテクチャの見直しを伴う可能性もあり、いきなりはリスクが大きいのでオススメしない
    * デプロイも当然色々変わる
    * [Twelve Factor App](https://12factor.net/) になっていればいけるかも？
    * まずは Heroku 対応からやってみるとコンテナ対応しやすい

---

# 始めるなら始めやすいところから

---

## Docker を始めやすいところ

* 開発環境
    * 本番環境と違ってリスクは小さい
    * 徐々にコンテナ対応を進めれば良い
    * 結局のところアーキテクチャの見直しを伴う可能性はある (本番環境に持って行く前の準下準備)
* CI (Continuous Integration)
    * ユニットテストをコンテナで実行できるようにする
    * 「現時点でユニットテストすらない」という人は足枷がないので逆にチャンスとも言える？ (ユニットテスト化しやすいところからしていけば良い)

---

## CircleCI から Docker を始めよう

* CircleCI でやるメリット
    * 設定ファイルに Docker イメージを指定するだけでコンテナ環境が使える
    * 無料で始められる (並列 1 コンテナのみ、~~1500~~ 1000 minutes/month)
    * 並列にたくさん動かしたくなったら 1 コンテナあたり $50/month 払うだけ
    * YAML でジョブの依存関係を定義するだけで複雑なワークフローも組める (慣れて必要になってからやれば良い)

---

## CircleCI で Docker を使う意味

* あらかじめ CI の実行に必要なものを Docker イメージに詰め込んでおける
    * 言語処理系、コンパイラやテストツール、ライブラリのビルドに必要なパッケージ等
    * よくある言語は [CircleCI がオフィシャルのイメージを提供している](https://hub.docker.com/u/circleci/)ので、そのまま使えば OK (`circleci/ruby`, `circleci/node` 等)
* 自分で用意することもできる
    * 言語オフィシャルのイメージだったり CircleCI が提供するイメージを元に、必要なツールのインストール等を行ったものを Docker Hub 等に push して使用する

---

## Docker イメージを自分で用意するべきか

* 自分で用意するイコール自分でメンテしていくことになるので、本当に必要になってからやれば良い
    * CI 環境のセットアップにあまりに時間がかかって開発におけるボトルネックになっているような場合とか

---

## Docker イメージを自分で用意するなら

* Docker イメージ自体を CD (Continuous Delivery) できるようにしておくと便利
    * `Dockerfile` をリポジトリで管理し、Pull Request をマージしたら build して push
    * Docker Hub または Docker Cloud を使う

---

## Docker Hub と Docker Cloud

* どちらも Docker, Inc. が運営するコンテナレジストリサービス
    * しかもデータは基本的に共有している (マジかよ)
* Docker Hub
    * 基本的には自分が作った Docker イメージを世の中に公開するのに特化している (Docker ユーザのハブサイト)
    * 手元で build して push することもできるし Dockerfile から自動ビルドもできる
* Docker Cloud
    * 基本的には自分たちの Docker イメージを管理するためのもので、他人の Docker イメージを検索したりすることはできない
    * それでいて Docker イメージ自体は基本 public なので docker pull できちゃう点には注意
    * 自動化周りはこちらの方が賢いので、自動ビルドがしたければ Docker Cloud がオススメ

---

## Docker イメージのビルドの自動化

* これも細かい手順は省略
* GitHub リポジトリに `Dockerfile` を置いて
* Docker Cloud でリポジトリと連携して、自動ビルドを有効にする
* `master` ブランチ更新のタイミングで build が行われるようになる

---

# 私が自作 Docker イメージでやってること

---

## 私の自作 Docker イメージ

* Infrastructure as Code 的なやつ
* AWS の IAM (権限管理) のリポジトリ管理
    * https://github.com/codenize-tools/miam (Ruby 製を使う)
* AWS の Route53 のドメインのリポジトリ管理
    * https://github.com/codenize-tools/roadworker (Ruby 製を使う)
* ユニットテストは CircleCI 提供のやつでだいたいなんとかしてるのだった 😇
* この辺のツールを使うための汎用的なイメージを作って見た
    * Ruby, awscli, circle-gh-tee (自作) などが入っている

---

![image.png](https://qiita-image-store.s3.amazonaws.com/0/208/cd0b92ab-d322-47b0-5024-08c61be0b183.png)

---

![image.png](https://qiita-image-store.s3.amazonaws.com/0/208/4bbc6213-03c7-d100-5407-c69e8aa00e7a.png)

---

![image.png](https://qiita-image-store.s3.amazonaws.com/0/208/20d83e99-5655-71ad-f506-0d9f579313a5.png)

---

## Dockerfile

```dockerfile
# 元となるイメージ
# Docker オフィシャルの Ruby イメージの軽量版
FROM ruby:2.5-slim

# awscli をインストールする
# Quipper 同僚の @mtsmfm さんの docker-ruby-awscli を丸パクリ！！！
# https://github.com/mtsmfm/docker-ruby-awscli
RUN apt-get update -qq && \
  apt-get install -y --no-install-recommends unzip python-dev curl git && \
  curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip" && \
  unzip awscli-bundle.zip && \
  ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws && \
  rm -rf ./awscli-bundle awscli-bundle.zip

# 自作の、CircleCI の実行結果を GitHub にコメントして投稿してくれるツール
COPY --from=yuyat/circle-gh-tee /usr/local/bin/circle-gh-tee /usr/local/bin
```

---

# 好きなツールを入れて自分だけの Docker イメージを作ろう (入れすぎには注意)

---

![image.png](https://qiita-image-store.s3.amazonaws.com/0/208/fa80c5d4-b0d6-fadc-a5d4-ba87bcca05a1.png)

https://www.quipper.com/career/Japan/