DockerでRuby On Rails + Nginx + Unicorn + MySQLの環境を作る

#この記事のゴール
docker-composeでweb用、db用の2つのコンテナーを作成して一括管理できる状態をゴールとします。
ホストPCにはRailsもNginxなど何もインストールしないで開発可能となります。

#前提環境
・mac OS X 10.9.5
・docker-compose を使える。
・プロジェクトのルートは「/Users/user/develop/docker_rails」とします。
以下、適宜読み替えて下さい。

#構築手順
#####1.下記５つのファイルを準備

```:Gemfile
source 'https://rubygems.org'
gem 'rails'
```

```:Gemfile.lock
(空でOK)
```


```:Dockerfile
FROM rails:4.2.6
ENV LANG C.UTF-8

# nginx,vim をインストール
RUN apt-get update && apt-get install -y build-essential libpq-dev nodejs vim nginx

# nginx に unicornの設定ファイルをコピー
ADD ./container/nginx/unicorn.conf /etc/nginx/conf.d/unicorn.conf

# Gemfile bundle install
WORKDIR /tmp
ADD Gemfile Gemfile
ADD Gemfile.lock Gemfile.lock
RUN bundle install

ENV APP_HOME /var/www/docker_rails
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME
ADD . $APP_HOME
```

```:docker-compose.yml
version: '2'
services:
  db:
    image: mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: password
    privileged: true
  web:
    build: .
    command: /bin/bash -c "nginx && bundle exec unicorn -c config/unicorn.rb -D && while true; tail -f /dev/null"
    volumes:
      - .:/var/www/docker_rails
    ports:
      - "80:80"
    depends_on:
      - db
    privileged: true
```

```:container/nginx/unicorn.conf
upstream unicorn {
  server unix:/var/www/unicorn.sock fail_timeout=0;
}

server {
  listen 80;
  server_name 192.168.99.100;

  root /var/www/docker_rails/public;

  try_files $uri @unicorn;

  location @unicorn {
    proxy_set_header Host $http_host;
    proxy_pass http://unicorn;
  }
}
```



#####2.rails new してファイルを作成。

```Bash
$ docker-compose run web rails new . --force --database=mysql --skip-bundle
```

dockerコンテナー内にRailsファイルが作成されホストPCにコピーされている事を確認する。

####3.docker-compose run で作ったコンテナー/イメージを削除
3でdocker-compose run を行ったのはホストPCにrails newしたファイルをコピーする事が目的だったので、製造されたimageとcontainerは削除します。

####4.ファイルを修正


```:Gemfile
#一番下の下記2行を追記
gem 'unicorn'
gem 'therubyracer', platforms: :ruby
```

```:config/database.yml
#password,hostを修正

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: password
  host: db

development:
  <<: *default
  database: docker_rails_development

test:
  <<: *default
  database: docker_rails_test

production:
  <<: *default
  database: docker_rails_production
  username: docker_rails
  password: <%= ENV['DOCKER_RAILS_DATABASE_PASSWORD'] %>
```

```:config/unicorn.rb
#下記内容で作成

pid '/var/www/docker_rails/tmp/unicorn.pid'
listen '/var/www/unicorn.sock'
stderr_path '/var/www/docker_rails/log/unicorn.log'
stdout_path '/var/www/docker_rails/log/unicorn.log'
worker_processes 2
timeout 30
```

####5.下記コマンドでimageを作成
```
$ docker-compose build
```

web用、db用2つのimageが作成されたか確認

```
$ docker images
```

####6.下記コマンドでimageからcontainerを作成

```
docker-compose up
```

※webコンテナーが立ち上がらない時は/tmp/unicorn.pid を削除する

####7.docker-compose up が途中で止まるのでターミナルの別タブからDBを作成
web用、db用2つのcontainerが動いているか確認

```
$ docker ps
```

動いていない場合はcontainer IDを調べる

```
$ docker ps　-a
```

containerを起動する。

```
$ docker start　{container ID}
```

webのcontainerにログイン

```
docker exec -it {webのcontainer ID} /bin/bash
```

ログイン後、下記コマンドでDBを作成


```
rake db:create
```

####8.ブラウザからアクセス
ホストPCのコンソールから下記でIPを確認

```
＄ docker-machine ip
```

下記URLでブラウザからアクセス
http://{ip}

RAILSのhomeが表示されれば完了です。