【Docker】作成中Railsプロジェクトで開発環境構築

以前技術書を参考にアプリ開発をした時にDockerを少し触ったんだけど、今回は自分で作ったアプリケーションに導入してみたので簡単にまとめようかなと思います。

## バージョン
* Ruby（2.5.1）
* Ruby on Rails（5.2.3）
* MySQL（5.6）
* Docker(19.03.4)
* docker-compose(1.24.1)

## 参考にした記事、サイト
[入門 Docker](https://y-ohgi.com/introduction-docker/)
[既存のRailsアプリにDockerを導入する手順](https://qiita.com/kenzoukenzou104809/items/b9e716204e0cd0cea447
)
[DockerでRuby on Railsの開発をしよう](https://qiita.com/saitoeku3/items/b1aa2ae143624e551aea)

先人の方々には感謝しかないね・・・

## 手順
* Dockerfileの作成(ruby及びrailsの環境を構築)
* docker-compose.ymlの作成(mysqlとDockerfileで構築したrailsを連携させる)
* database.ymlの編集(docker-composeと併せて編集が必要)

## 最終的なディレクトリ構造
みにくいかな？
Dockerfile及びdocker-composeはアプリケーションのルートディレクトリに配置。
database.ymlは初期位置です。(config/database.yml)

<img width="1440" alt="191028.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434850/1c0ece9f-901c-cb79-4d5f-1071a9c88a0b.png">

## Dockerfileの作成
[こちらの記事](https://qiita.com/kenzoukenzou104809/items/b9e716204e0cd0cea447)を参考に作りましたが、オリジナルは公式に載っているようです。

簡単な説明はコメントアウトにかいておきます。

```Dockerfile:Dockerfile
# rubyのバージョンを指定(もともと2.5.1で開発していたのでこのバージョン)
FROM ruby:2.5.1

RUN apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y mysql-client --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

# Docker内部でworkdirをどこに置くか、どういう名前にするかを決める記述
RUN mkdir /workdir
WORKDIR /workdir

# Docker内部でGemfile、Gemfile.lockをどこに配置するかを決める記述
ADD Gemfile /workdir/Gemfile
ADD Gemfile.lock /workdir/Gemfile.lock

# 注意！！ Gemfile.lockにかいてあるbundlerバージョンが2.0.1以降だとエラーが出ます！
# 僕の場合はここで環境設定してあげれば通りました。
ENV BUNDLER_VERSION 2.0.2
RUN gem install bundler
RUN bundle install

ADD . /workdir

```
コメントアウトにも少しかいてますが、gemfileとバージョンを揃える必要があります。
また、bundlerは2.0.1以降だとエラーが出るようです。
僕の場合はENV BUNDLER_VERSION 2.0.2と記述してあげればエラーがなくなりました。
gem install bundlerとbundle installの前に書いてね！

## docker-compose.ymlの作成
こちらも簡単な説明はコメントアウトをご覧ください。

```yml:docker-compose.yml
version: '3'
services:
  db: # database.ymlと対応したものを読み込みます
    image: mysql:5.6 # もともと5.6で動かしていたので
    environment:
      MYSQL_DATABASE: docker_development
      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: root
      MYSQL_PASSWORD: password
    volumes:
      - ./mysql/mysql_data:/var/lib/mysql # データの永続化
    ports:
      - "4306:3306" # ホストからゲストへポートフォワード。sequelProと繋ぎたいので、3306ではなく4306をポートに指定
  web: # さっき書いたDockerfileをwebって名前で扱うよ、って感じです
    build:
      context: .
      dockerfile: Dockerfile
    # 一度サーバーが起動すると起動し続けるので、rm -f /workdir/tmp/pids/server.pidで、dockerが起動する度に一旦停止させる
    command: /bin/sh -c "rm -f /workdir/tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    tty: true
    stdin_open: true
    depends_on:
      - db # DB側のコンテナが出来上がってからwebを実行する
    ports:
      - "3000:3000" # ホストからゲストへポートフォワード
    volumes:
      - .:/workdir # ソースコード変更したらDocker側も即反映されるように
```

## config/database.ymlの編集

ちなみに今回は本番環境でDockerを使わない設定です。
おそらく、本番環境でDockerを使用したい場合はdefaultブロック、productionブロックあたりを編集しないといけないのですが、developmentブロックだけ編集しています。

ちなみに最初defaultブロックにhost: dbと書いていたのですが、本番環境デプロイ時にエラーがでました・・・:frowning2:

```yml:config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: 
  socket: /tmp/mysql.sock

# development環境だけ書き換えてます。
development:
  <<: *default
  database: my_new_gear_development
# ここから下はdocker-compose.ymlと対応させてください。
  username: root　
  password: password
  database: docker_development
  host: db

test:
  <<: *default
  database: my_new_gear_test

production:
  <<: *default
  database: my_new_gear_production
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock
```

## セッティングおしまい！

動かしてみましょう！

```bash:bash
# Dockerのimageを作成する
docker-compose build

#DB create
docker-compose run web rake db:create

#DB migrate
docker-compose run web rails db:migrate

#rails server
docker-compose up
```

これでいつも通りURLにlocalhost:3000を打ち込むと、アプリケーションが立ち上がるはず・・です

## 続編
[Dockerで構築したrailsイメージの軽量化](https://qiita.com/AK4747471/items/c07dc26dc63a1e21559f)