【Rails環境構築】Docker ＋ Rails ＋ Mysql

#本記事の目的

**DockerでRuby on Railsの環境構築（Mysql）**を行うことです。
DBにMysqlを使ったDockerの構築記事が少なかったため、備忘録も兼ねて投稿します。

#参考記事
https://qiita.com/kodai_0122/items/795438d738386c2c1966

#1. 開発用フォルダを用意する。

まず、ローカルでアプリ開発用のフォルダを作成します。
私の場合は *desktop/Docker/test_app* で作りました。フォルダ名はなんでもOKです。

cdコマンドで、作業フォルダへ移動します。

```
$ cd test_app
```

#2. 必要なファイルを用意する。
1で作成したフォルダ内に以下のファイルを作成します。

```
$ touch Dockerfile
$ touch Gemfile
$ touch Gemfile.lock
$ touch entrypoint.sh 
$ touch docker-compose.yml 
```

では、ファイルにコードをコピペしていきましょう。

##2.1 Dockerfile

```Docker:Dockerfile
FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

RUN mkdir /myapp
WORKDIR /myapp

COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock

RUN bundle install
COPY . /myapp
```

##2.2 Gemfile
```Ruby:Gemfile
source 'https://rubygems.org'
ruby 2.6.6
```

##2.3 Gemfile.lock
記入の必要なし

##2.4 entrypoint.sh 
```ruby:entrypoint.sh

set -e

rm -f /myapp/tmp/pids/server.pid

exec "$@"
```

##2.5 docker-compose.yml
```ruby:docker-compose.yml
version: '3'

services:
    db:
        image: mysql:5.7
        environment:
            MYSQL_USER: root
            MYSQL_ROOT_PASSWORD: password
        ports:
            - "3306:3306"
        volumes:
            - ./db/mysql/volumes:/var/lib/mysql

    web:
        build: .
        command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
        volumes:
            - .:/myapp
            - gem_data:/usr/local/bundle
        ports:
            - 3000:3000
        depends_on:
            - db 
        tty: true
        stdin_open: true

volumes:
  gem_data:
```

#3. Railsアプリを作成する


以下のコマンドでアプリを生成します。

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

##3.1 database.ymlの記述を一部変更

passwordとhostを追記＆変更する。

＜変更前＞

```ruby:database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: 
  host: localhost
```
＜変更後＞

```ruby:database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db
```

passwordの'password'は```docker-compose.yml```のpasswordから引っ張ってきます。

##3.2 
rails newによってGemfileが更新されたので、buildを実行します。

```
$ docker-compose build
```

#4 コンテナを起動する

以下のコマンドでコンテナを起動します。

```
$ docker-compose up
```
エラーが出ていなければOK。

ちなみに、私の場合はこちらのエラーが発生しました。
```Could not find gem 'mysql2 (>= 0.4.4, < 0.6.0)' in any of the gem sources listed in your Gemfile. ```

以下の記事を参考に解決しました。
https://qiita.com/satto0303/items/c135c2279a1646921fc2

#5 データベースを作成

別のターミナルを開いて、

```
$ docker-compose run web rails db:create
```

http://localhost:3000/ にアクセスでとりあえず構築完了！！！！


#その他備忘録

##動いているコンテナの確認

```
$ docker ps -a
```

```
CONTAINER ID   IMAGE           COMMAND                  CREATED        STATUS                          PORTS     NAMES
80e7c7569b8a   portfolio_web   "rails db:create"        3 hours ago    Exited (0) 3 hours ago                    portfolio_web_run_578a8e6c5926
8687f77540da   portfolio_web   "bundle install"         3 hours ago    Exited (0) 3 hours ago                    portfolio_web_run_32dae7dd2ba0
f77a6d0dafc9   portfolio_web   "bash -c 'rm -f tmp/…"   3 hours ago    Exited (1) About a minute ago             portfolio_web_1
07b862208052   6b4fc0257a56    "rails new . --force…"   4 hours ago    Exited (0) 4 hours ago                    portfolio_web_run_2b7494c2bb36
e4640ddc3fd9   mysql:5.7       "docker-entrypoint.s…"   4 hours ago    Exited (0) About a minute ago             portfolio_db_1
2f526f183e02   112d1629d727    "/bin/sh -c 'bundle …"   4 hours ago    Exited (4) 4 hours ago                    hardcore_jepsen
63feb99baec8   112d1629d727    "/bin/sh -c 'bundle …"   4 hours ago    Exited (4) 4 hours ago                    intelligent_satoshi
319da14a6566   ccd1a9b10055    "/bin/sh -c 'bundle …"   4 hours ago    Exited (4) 4 hours ago                    hardcore_lumiere
2ac3e9c8d7bf   ad0d1e7dc37d    "/bin/sh -c 'bundle …"   4 hours ago    Exited (4) 4 hours ago                    sweet_bhaskara
376ba7740aa6   postgres        "docker-entrypoint.s…"   22 hours ago   Exited (0) 12 hours ago                   myapp_db_1
```

##コンテナの削除

docker rm [コンテナID]

```
$ docker rm 376ba7740aa6
```