Rails の開発環境を docker（docker-compose） で構築したい

* ruby 2.3.1p112
* Rails 5.0.0.1
* Docker version 1.12.0
* docker-compose version 1.8.0

Rails の開発環境を docker で作成することがあったので、やり方をまとめました。
本番環境も docker で構築する予定なので、Dockerfile などは development 用のものを作成してます。


# プロジェクトの作成
新規プロジェクトを適当に作成します。

```
$ rails new --skip-bundle --database=mysql demo
$ cd demo
```


# docker-compose.yml

docker-compose を使用する際に必要な設定ファイル docker-compose.yml を用意します。
docker run で叩くコマンドを設定ファイルに記述するようなイメージです。

今回は本番環境も docker で構築するケースを想定しているので、開発環境用のファイル（`docker-compose.development.yml`）を作成しています。


```docker-compose.development.yml
version: '2'
services:
  datastore:
    image: busybox
    volumes:
      - mysql-data:/var/lib/mysql

  db:
    image: mysql:5.7.16
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - '3306:3306'
    volumes_from:
      - datastore

  web:
    build:
      context: .
      dockerfile: Dockerfile.development
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    ports:
      - '3000:3000'
    volumes:
      - .:/demo
    volumes_from:
      - datastore
    depends_on:
      - db

volumes:
  mysql-data:
    driver: local
```
mysql のデータを永続化するため、`datastore` で `/var/lib/mysql` を作成して mysql コンテナにマウントしてます。

書き方はリファレンス見ればだいたいわかります。
http://docs.docker.jp/compose/compose-file.html

# Dockerfile

こちらも開発環境用のファイル（`Dockerfile.development`）を作成。

```Dockerfile.development
FROM ruby:2.3.1

RUN apt-get update
RUN apt-get install -y build-essential libpq-dev nodejs

RUN mkdir /demo
WORKDIR /demo
ADD Gemfile /demo/Gemfile
ADD Gemfile.lock /demo/Gemfile.lock
RUN bundle install
ADD . /demo
```

こちらも書き方とかはリファレンス見ればだいたいわかります。
http://docs.docker.jp/engine/reference/builder.html

また、Dockerfile の構築に `Gemfile.lock` が必要なので作成しておきます

```
$ touch Gemfile.lock
```

# database.yml

```database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: password
  host: db
  socket: /tmp/mysql.sock

development:
  <<: *default
  database: demo_development

test:
  <<: *default
  database: demo_test

production:
  <<: *default
  database: demo_production
  username: demo
  password: <%= ENV['DEMO_DATABASE_PASSWORD'] %>
```

host に `db`（mysql コンテナの alias） を指定しておきます。
docker-compose.yml の `depends_on` 設定のおかげで、web コンテナ内から mysql コンテナを `db` で指定できます。


# build
コンテナを立ち上げます。

```
$ docker-compose -f docker-compose.development.yml build # image の作成
$ docker-compose -f docker-compose.development.yml run --rm web rake db:create # rake db:create
$ docker-compose -f docker-compose.development.yml up -d # コンテナの起動
```

# 検証
今回は mac の docker-machine 上で構築してるので docker-machine の IP アドレスにアクセスして確認する。

```
$ docker-machine ip
192.168.99.100
```

ブラウザで 192.168.99.100:3000 にアクセス。
![Ruby_on_Rails.png](https://qiita-image-store.s3.amazonaws.com/0/151309/9629effd-51ed-7370-dd3f-1de5cee3c3fa.png)
:grinning: :grinning: :grinning:

# rails console
rails console を使いたいときは `docker-compose exec` コマンドを使用し、起動中の web コンテナ内で実行します。

```
$ docker-compose -f docker-compose.development.yml exec web rails console 
Loading development environment (Rails 5.0.0.1)
irb(main):001:0> 
```

# その他
docker-compose コマンドにいちいち -f docker-compose.development.yml でファイル指定したくねーって方は環境変数 `COMPOSE_FILE` にファイルを指定してやればいいそうです。

```
$ export COMPOSE_FILE=docker-compose.development.yml
$ docker-compose exec web rails console             
Loading development environment (Rails 5.0.0.1)
irb(main):001:0> 
```
プロジェクト毎に docker-compose.yml が異なると思うので、環境変数を .env で管理するのもありかも

# 参考
* https://docs.docker.com/compose/rails
* http://docs.docker.jp/compose/compose-file.html
* http://docs.docker.jp/engine/reference/builder.html
* http://qiita.com/joker1007/items/9f54e763ae640f757cfb
* http://tech.degica.com/ja/2016/06/14/dockerized-rails-development
* https://suin.io/535