Docker & Rails & Mysql 環境構築

## はじめに
Rails環境をdockerで構築するための記事はすでにたくさんありますが、自分で実際に手を動かしてメモとして残すと定着度が高いので、他の記事と内容はほとんど同じですが書きたいと思います。

## 前提
Dockerはインストールしておいてください。
https://docs.docker.com/docker-for-mac/install/

## 1. Railsプロジェクト用のディレクトリを作成
```
$ mkdir ~/myapp
$ cd myapp
```
Dockerfileで`RUN mkdir /myapp`を記述して`rails new`できると思ったら、`Building web`から進まなくエラーになるので、あらかじめディレクトリは作成する流れにします。
[参考：https://github.com/moby/moby/issues/32543](https://github.com/moby/moby/issues/32543)


```
$ docker-compose run web rails new . --force --database=mysql
Building web
Traceback (most recent call last):
  File "<string>", line 3, in <module>
  File "compose/cli/main.py", line 65, in main
  File "compose/cli/main.py", line 117, in perform_command
  File "compose/cli/main.py", line 712, in run

.
.
.

OSError: [Errno 2] No such file or directory: `/Users/user/Library/Caches/Google/Chrome/Default/Cache/f_0004c2`
docker-compose returned -1
```

## 2. Dockerfile作成

```bash:Dockerfile
FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
WORKDIR /tmp
COPY Gemfile Gemfile
COPY Gemfile.lock Gemfile.lock
RUN bundle install
ENV APP_HOME /myapp
RUN mkdir -p $APP_HOME
COPY . /myapp
```

## 3. Gemfile作成

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

## 4. Gemfile.lock作成

```
$ touch Gemfile.lock
```
touch: 存在しないファイルを中身のない状態で新規作成

## 5. docker-compose.yml作成

```bash:docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: password
    ports:
      - '3316:3306'
    volumes:
      - ./db/mysql/volumes:/var/lib/mysql


  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
```

## 6. `rails new` でDockerコンテナにプロジェクト作成  

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

## 7. 再ビルド
`rails new`でGemfileにgemが追加されたので再度ビルドが必要。

```
$ docker-compose build
```

## 8. database.yml設定

```config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db
```
docker-compose.ymlの`MYSQL_ROOT_PASSWORD`と同じパスワードにする。また、host名はdocker-composeで定義したサービス名(db)にする。

## 9. サービス起動
```
$ docker-compose up
```

`-d` を付けるとバックグランドで実行されます。 

【補足】
`run`,`build`,`up`などの使い分け

| コマンド          |    内容             |
|:-----------------|:------------------:|
| docker-compose run   |サービスを起動    |
| docker-compose build | サービスのimageをビルド |
| docker-compose up    | サービスのimageをビルド＆起動|

## 10. DB作成  
```
$ docker-compose run web rake db:create
```

## 11. アクセス
http://localhost:3000

これが表示されたら完了！
![スクリーンショット 2018-07-03 14.48.15.png](https://qiita-image-store.s3.amazonaws.com/0/239829/9c828f49-fc24-f325-64ab-454bc0c51e17.png)

## 【補足】開発コマンド
| ローカル開発          |    DockerCompose            |
|:-----------------   |:------------------:   |
| rails g model User  |docker-compose run web rails g model User    |
| rake db:migrate    |docker-compose run web rake db:migrate |

## おわりに
Dockerのおかげで新規プロジェクトの環境構築が5分もかからずにできてしまうので、Docker様様ですね。次はproduction環境用の設定を記載できればいいなと思ってます。