Ruby on Railsアプリの開発環境をDockerに移行する(Mac)

##はじめに
以下のAWS Cloud9で作成したRailsアプリをDockerに移行します。

本アプリはログイン、投稿、DM、フォロー、通知などの機能がついたもので、
すでにPostgreSQLのデータベースを導入し、Herokuにデプロイしております。

今回はこちらのデータベースにMySQLを導入し、
Dockerの開発環境に移行する流れとなります。


### Railsアプリの使用技術
######バックエンド
・Ruby(2.6.5)
・Rails(5.2.6)
###### フロントエンド
・HTML/CSS
・Javascript
###### 開発環境、インフラ
・Cloud9
・Puma
・pg(0.20.0)
テスト、静的コード解析
・Rspec
・Rubocop


https://infinite-beach-47596.herokuapp.com/

##Docker for Macをインストール
まずは以下の記事を参考にMacPCにDockerをインストールします。

https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81

##MySQLを導入
私はもともとアプリケーションの開発環境にSQLite3を導入しており、
その後Herokuデプロイ用にPostgreSQLを導入しました。

今回は以下の記事を参考にMySQLを導入します。

https://qiita.com/fuku_tech/items/a380ebb1fd156c14c25b

※私はここで以下のエラーが出ました。

```
ld: library not found for -lssl
```

うまくパスが通っていなかったようなので、以下の記事でパスを通して解決。

https://qiita.com/HrsUed/items/ca2e0aee6a2402571cf6

##実装
ここからは実装を進めていきます。

######実装の流れ
1 Dockerfile/docker-compose.ymlを作成

2 database.yml編集

3 コンテナをbuildする docker-compose build

4 Dockerコンテナ上でDB作成＆migrationを実行
　docker-compose run web bundle exec rake db:create / db:migrate

5 コンテナを起動する docker-compose up

###1 Dockerfile/docker-compose.ymlを作成

まずは以下のファイルをRailsアプリに追加します。

(1)Dockerfile
(2)docker-compose.yml

アプリのルートディレクトリにこれらのファイルを追加します。

```
boditore----|-- app
            |-- bin
            |-- config
            |-- db
            ・・・・・・
　　　　　　　・・・・・・
            |-- Gemfile
            |-- Gemfile.lock
            |-- package.json
            |-- Rakefile
            |-- README.md
            |-- Dockerfile  #ここに追加
            |-- docker-compose.yml　#ここに追加    
```

ファイルの中身は以下の通りです。

```ruby:Dockerfile
FROM ruby:2.6.5

RUN apt-get update -qq && \
    apt-get install -y build-essential \ 
                       libpq-dev \        
                       nodejs      

RUN mkdir /app_name 

ENV APP_ROOT /app_name 
WORKDIR $APP_ROOT

ADD ./Gemfile $APP_ROOT/Gemfile
ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock

RUN gem install bundler 
RUN bundle install
ADD . $APP_ROOT
```

```ruby:docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 'password'
    ports:
      - "4306:3306"

  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/app_name
    ports:
      - "3000:3000"
    depends_on:
      - db
```

###2 database.yml編集

configフォルダ内のdatabase.ymlも編集します。

```ruby:config/database.yml
〜省略〜

＃以下を追加
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  socket: /tmp/mysql.sock
  host: db
  
development:
  <<: *default
  database: boditore　＃自分のアプリのデータベース名

```

###3 コンテナをbuildする docker-compose build
ここまできたら、あとはビルドしてDB作って起動するのみです。

アプリのディレクトリで以下をターミナルに入力して実行します。

```
[boditore] $ docker-compose build 
```

※この作業は少し時間がかかるので、気長に待ちましょう。

###4 Dockerコンテナ上でDB作成＆migrationを実行
次はデータベースの作成とマイグレーションです。
ターミナルで以下のコマンドを実行します。

```
[boditore] $ docker-compose run web bundle exec rake db:create
Created database 'boditore'
Created database 'boditore_test'
```

```
[boditore] $ docker-compose run web bundle exec rake db:migrate

== CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0150s
== CreateUsers: migrated (0.0152s) =============================

```

上記のコマンドで、Dockerコンテナ上にデータベースの作成とマイグレートをします。

###5 コンテナを起動する docker-compose up
最後に*rails s*の感覚で、*docker-compose up*を実行します。

```
[boditore] $ docker-compose up 
Starting boditore_db_1 ... done
Recreating boditore_web_1 ... done
```

これでローカル環境でアプリが動かせるはずです。

http://localhost:3000/

##まとめ
いろいろな記事を参考にしながらDocker環境設定を行いました。

企業で当たり前のように使用されているようなので、
早く使い慣れることができるようこれからも研究していこうと思います。

さいごまでお読みいただき、ありがとうございました！

##参考記事
https://qiita.com/majorboy/items/9fbfc78fc7bbc1f35e77#7-%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B-docker-compose-up