Docker for MacでRailsの環境構築手順

## Docker for Macインストール

以下の公式サイトからDocker for Macをダウンロードしてインストール。
https://docs.docker.com/docker-for-mac/install

![Docker for MacインストールHP](https://qiita-image-store.s3.amazonaws.com/0/54809/0b543377-1631-1cae-4456-e5e9737f40a5.png)

![Docker for Macインストール](https://qiita-image-store.s3.amazonaws.com/0/54809/863bf71b-c8e8-fffb-0fa7-df8b8f44a589.png)


## アプリケーションディレクトリを作成

```
mkdir app_name
cd app_name
mkdir docker
cd docker
mkdir rails
mkdir mysql
```

※dockerフォルダを作り、dockerに関するファイル類を整理してますが管理の仕方はお任せします。


## Dockerfileの作成

```
cd rails
vi Dockerfile
```

```Dockerfile:./docker/rails/Dockerfile
FROM ruby:2.4.0
ENV LANG C.UTF-8
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN gem install bundler
WORKDIR /tmp
ADD Gemfile Gemfile
ADD Gemfile.lock Gemfile.lock
RUN bundle install
ENV APP_HOME /app_name
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME
ADD . $APP_HOME
```

Dockerfileの書き方に関しては、以下のサイトを参考にしてください。
[Dockerfile リファレンス](http://docs.docker.jp/engine/reference/builder.html)

※ruby:2.4.0とイメージを指定していますが、イメージはあらかじめpullしておいてもしていなくても大丈夫です。
インストールしていない場合は、docker composeを実行した際に勝手にpullされます。
あらかじめpullする場合は、`docker pull ruby:2.4.0`

```
cd mysql
vi Dockerfile
```

```Dockerfile:./docker/mysql/Dockerfile
FROM mysql:5.7
ENV LANG C.UTF-8
RUN apt-get update -qq && apt-get install -y vim
```

※mysqlのmy.cnf等ファイルを覗くために、vimが必要だったので私の環境ではインストールしてます。

Dockerfileの書き方に関しては、以下のサイトを参考にしてください。
[Dockerfile リファレンス](http://docs.docker.jp/engine/reference/builder.html)

※mysql:5.7とイメージを指定していますが、イメージはあらかじめpullしておいてもしていなくても大丈夫です。
インストールしていない場合は、docker composeを実行した際に勝手にpullされます。
あらかじめpullする場合は、`docker pull mysql:5.7`

## Gemfileの作成

```linux:./
vi Gemfile
```


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

## Gemfile.lockの作成

```linux:./
touch Gemfile.lock
```

## docker-compose.ymlの作成

```linux:./
vi docker-compose.yml
```

```yml:./docker-compose.yml
version: '2'
services:
  db:
    build:
      context: .
      dockerfile: ./docker/mysql/Dockerfile
    volumes:
      - ./docker/mysql/volumes:/var/lib/mysql
    extends:
      file: ./docker/mysql/password.yml
      service: password
  web:
    build:
      context: .
      dockerfile: ./docker/rails/Dockerfile
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    ports:
      - "3000:3000"
    volumes:
      - .:/app_name
    environment:
      RAILS_ENV: development
    extends:
      file: ./docker/mysql/password.yml
      service: password
    depends_on:
      - db
```

docker-compose.ymlファイルの書き方に関しては、以下のサイトを参考にしてください。
[Compose ファイル・リファレンス](http://docs.docker.jp/compose/compose-file.html)

## password.ymlを作成

```yml:./docker/mysql/password.yml
version: '2'
services:
  password:
    environment:
      MYSQL_ROOT_PASSWORD: password
```


## プロジェクトの作成

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

## Gemfileの変更
therubyracer の行のコメントを外す

```Gemfile:./Gemfile
gem 'therubyracer', platforms: :ruby
```

Gemfileの変更を適用するためには以下のコマンドを実行

```
docker-compose build
```


## database.ymlの修正

```yml:database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: <%= ENV['MYSQL_ROOT_PASSWORD'] %>
  host: db

development:
  <<: *default
  database: app_name_development

test:
  <<: *default
  database: app_name_test
```

## データベース作成

```
docker-compose run --rm web rake db:create
```

## railsサーバー/データベース起動

```
docker-compose up
```

http://localhost:3000へアクセス

※デーモンで立てる場合は`-d`オプションを使う。こちらのほうがおすすめです。

```
docker-compose up -d
```

## railsサーバー/データベース停止

```
docker-compose down
```

## その他コマンド一覧

- マイグレート実行

```
docker-compose run --rm web rake db:migrate
```

- seed実行

```
docker-compose run --rm web rake db:seed
```

- コントローラー作成

```
docker-compose run --rm web rails g controller controller_name
```

- モデル作成

```
docker-compose run --rm web rails g model model_name model_name:string
```

- ルーティング確認

```
docker-compose run --rm web rake routes
```

- railsコンソール

```
docker-compose run --rm web rails c
# sandboxオプション
docker-compose run --rm web rails c ----sandbox
```