【Rails】既存のRails6プロジェクトにDockerを導入してみる

## はじめに
既存のRailsプロジェクトをDockerに乗せていきます。
初学者による記事なので間違い等ございましたらご指摘いただけると幸いです。
※本記事は開発環境のみの導入を対象としています。

### 参考
Dockerが何なのか全く分からない！という方はまずは下記の記事を参考にDockerを触ってみてください。
[DockerをMacにインストールする](https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81)
こちらの記事も手っ取り早くDockerをふんわり理解するのにオススメです。
[Dockerについてなるべくわかりやすく説明する](https://qiita.com/rawHam/items/80ba13d2d2d56dba411e)

### 環境
- macOS Catalina 10.15.7
- Ruby 2.6.5
- Rails 6.0.3.3
- Docker 19.03.13
- docker-compose 1.27.4
- MySQL 5.6.47

## 目次
- 必要ファイルの作成
    - ファイル構成
- 作成したファイルの編集
- コンテナの起動

## 必要ファイルの作成
必要ファイルは以下の５つです。rails newをした際に自動生成されるファイルもあるので必要なもののみ作成していきましょう。

- Dockerfile
- docker-compose.yml
- Gemfile
- Gemfile.lock
- database.yml

### ファイル構成
```
既存のアプリケーション名
└── app
     ├── Dockerfile 　# 作成
     ├── docker-compose.yml 　# 作成
     ├── Gemfile
     ├── Gemfile.lock
     ├── config
          └──database.yml
```

## 作成したファイルの編集
### Dockerfile
```ruby:Dockerfile

FROM ruby:2.6.5   #自身のrubyバージョンを指定 (ruby -v)

RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
    curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

RUN apt-get update && apt-get install -y --no-install-recommends\
    nodejs \
    yarn \
    mariadb-client  \
    build-essential  \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /myproject

COPY Gemfile /myproject/Gemfile
COPY Gemfile.lock /myproject/Gemfile.lock

RUN gem install bundler
RUN bundle install
RUN yarn install --check-files

COPY . /myproject
```
Rails6でwebpackerが標準になったことでyarnのインストールが必要になってきます。
[Docker Hub](https://hub.docker.com/)で確認するとrubyのイメージはDebian系となっているので、[yarnの公式ドキュメント](https://classic.yarnpkg.com/en/docs/install#debian-stable)に記載されているOS毎のインストール方法を参考に記述していきます。
ちなみに、yarnの公式ドキュメントは日本語表示のままだとなぜかOSの選択肢の中にMacとWindowsしか表示してくれないので英語表示に切り替えて確認しましょう。

日本語表示
<img width="400" alt="Screen Shot 2020-12-08 at 19.48.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901009/48f672bd-c17e-0007-3e26-3377e41e44c7.png">
英語表示
<img width="400" alt="Screen Shot 2020-12-08 at 19.48.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901009/2cebd3b4-0c3c-f357-2c6e-5d1fb3dbd8a4.png">

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

services:
  db:   #データベースのコンテナ作成
    image: mysql:5.7   #自身のmysqlバージョンを指定 (mysql --version)
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    ports: 
      - '3306:3306'
    volumes:
      - mysql-data:/var/lib/mysql 
    environment:
      MYSQL_DATABASE: myapp_development   #プロジェクト名_development
      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: root
      MYSQL_PASSWORD: password

  web:   #アプリケーションのコンテナ作成
    build:
      context: .
      dockerfile: Dockerfile
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    tty: true 
    stdin_open: true
    depends_on:
      - db
    ports:
      - "3000:3000"
    volumes:
      - .:/myproject
volumes:      #dbを永続化するための記述
  mysql-data:
```

### Gemfile
```ruby:Gemfile
source 'https://rubygems.org'
gem 'rails', '~>6.0.0'
```
既存アプリケーションの場合この記述はすでにあるはずですが念のため確認しておきましょう。

### database.yml
```ruby:database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root   #docker-compose.ymlで指定したユーザー名
  password: password   #docker-compose.ymlで指定したパスワード

development:
  <<: *default
  database: myapp_development   #プロジェクト名_development
  host: db   #docker-compose.ymlでデータベースのコンテナ作成部分で指定したservice名

test:
  <<: *default
  database: myapp_test   #プロジェクト名_test
  host: db　　　#docker-compose.ymlでデータベースのコンテナ作成部分で指定したservice名
```
アプリケーションのコンテナからデータベースのコンテナに接続するための設定を記述していきます。
セキュリティ面を気にする場合はusernameとpasswordに環境変数を設定しましょう。今回は開発環境のみということもあり設定していません。

### コンテナの起動
```terminal:ターミナル
cd myapp
docker-compose build    #コンテナを建てる
docker-compose up -d   #コンテナ起動（-dオプションをつけることでバックグラウンドで実行）
```
これで localhost:3000 にアクセスするとページが表示されます◎

- エラーが発生した場合は

```terminal:ターミナル
docker-compose logs -f
```
でリアルタイムでログの確認ができるのでエラー原因を探して解決しましょう。

- サーバーを停止させたいときは以下のコマンドを実行してください。

```terminal:ターミナル
docker-compose down
```

## 最後に
実装に思いの外手間取ったので備忘録的に記事にしてみました。
どなたかの参考になれば幸いです。