既存のrailsプロジェクトをDockerで開発する手順

docker-composeを使用してrailsの開発環境を作成します。
dockerの各コマンドや、Dockerfile docker-composeについては細かく解説しないので、一通り理解している前提で書いてます。

## 環境

macOS Sierra

```bash:bash
$ docker -v
Docker version 1.12.5, build 7392c3b

$ docker-compose -v
docker-compose version 1.9.0, build 2585387
```
## docker for mac install
以前はmacでDockerを使うのにVagrantにdockerを入れて操作していましたが、mac純正の仮想環境xhyveを利用するようになったためVagrantはお役御免となり、だいぶ使いやすくなったようです。
https://docs.docker.com/docker-for-mac/

## Dockerfileとdocker-compose.ymlを追加
RailsのプロジェクトルートにDockerfileとdocker-compose.ymlを追加します。

### Dockerfile

railsの公式Docker imageは bundle config --global frozen 1 が指定してあり、Gemfileの変更ができなくなっています。
本番などの環境ではその運用方法の方が良いと思いますが、今回は開発環境で使用するため[公式のDockerfile](https://github.com/docker-library/rails/blob/9df9b5e6b1519faf22e1565c2caaebf7cc1c665b/onbuild/Dockerfile)を参考にカスタマイズします。

```Dockerfile:Dockerfile
FROM ruby:2.3.3
RUN apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y mysql-client --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /workdir
WORKDIR /workdir
ADD Gemfile /workdir/Gemfile
ADD Gemfile.lock /workdir/Gemfile.lock
RUN bundle install
ADD . /workdir
```

### docker-compose.yml

MySQLへ接続するためのユーザやパスワードは適宜変更してください。

```yml:docker-compose.yml
version: '2'
services:
  db:
    image: mysql:latest
    environment:
      MYSQL_DATABASE: docker_development
      MYSQL_ROOT_PASSWORD: fasjkdl29
      MYSQL_USER: hogehoge
      MYSQL_PASSWORD: fasjkdl29
    ports:
      - "3306:3306" # ホストからゲストへポートフォワード
  web:
    build:
      context: .
      dockerfile: Dockerfile
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    tty: true
    stdin_open: true
    depends_on:
      - db # DB側のコンテナが出来上がってからwebを実行する
    ports:
      - "3000:3000" # ホストからゲストへポートフォワード
    volumes:
      - .:/workdir # ソースコード変更したらDocker側も即反映されるように
```

## DBへの接続情報を修正

ユーザ名とパスワードはdocker-compose.ymlのenvironmentで指定した値と同じにする。
hostについてはdocker-compose.ymlのservicesのDBと同じ値にする。
分けたい場合などはlinksを修正すれば/etc/hostsに追加されるのでlinks属性で変更するようにすると良いかも。

```config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  host: db

development:
  <<: *default
  username: hogehoge
  password: fasjkdl29
  database: docker_development

production:
  <<: *default
  database: docker_production
  username: docker
  password: <%= ENV['DOCKER_DATABASE_PASSWORD'] %>
```

## 起動

MySQLの起動に少し時間がかかるため、logにmysql startedみたいなログが出るまで待たれよ。
公式のDockerfileを使用しているので、調べたらまた追記します。
起動したら http://localhost:3000 にてアクセス出来ます。

```
$ docker-compose up
```

## dockerでbinding.pryを使う

Railsの開発に欠かせないのがpry-byebug
これをDockerで使うようにするための設定は以下の通り

```docker-compose.yml
services:
  # 省略
  web:
    tty: true			# この二行が必要
    stdin_open: true	# この二行が必要
```

このあとソースコードにbinding.pryを追加し、該当の箇所で止まったらdockerのコンテナにattachするとpryにアタッチされる。

```bash
$ docker attach 88cdf2efe112
```

## gemを追加したい

gemを追加したり、DBのマイグレーションを行うためにコンテナ内でコマンドを実行したい場合は以下の通り。

```bash
$ docker exec 88cdf2efe112 bundle exec rake db:migrate
```

## ギフハブにソース置いておきますね
https://github.com/kkyouhei/docker-on-rails

## 参考
https://docs.docker.com/compose/rails/