【Rails】開発中プロジェクトへDocker導入・環境構築方法


# はじめに

開発中の Rails プロジェクトに対して Dokcer を導入する方法をまとめました。
具体的には、WEBコンテナ（Railsアプリ）とDBコンテナ（MySQL）を別々に作成して、docker-compose で一括して管理する方法を用いています。

既に同様の記事が多々ありますが、うまくいかなかったところの記述を変更してまとめています。
一例としてこのような書き方でも導入できるんだなぁと思っていただければと思います。

# この記事の対象

* Rails についてある程度の知識がある方
* Docker、docker-compose についてある程度の知識がある方
* 他の記事を見て導入できなくて、別の一例を見てみたい方


# Dockerfile, docker-compose.yml 作成

まずは、開発中のRailsプロジェクトに```Dockerfile```と```docker-compose.yml```を作成します。

```
$ touch Dockerfile
$ touch docker-compose.yml
```

# Dockerfile 内容

WEB コンテナ（Rails アプリケーション）の環境を構築するためのファイルです。

基本的な形は以下になるかなと思います。
プロジェクトで必要なライブラリやツールがあれば追加でインストールしてください。

```dockerfile:Dockerfile
# ruby バージョン指定
FROM ruby:2.6.5

RUN mkdir /app
WORKDIR /app

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 mariadb-client --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

ADD Gemfile /app/Gemfile
ADD Gemfile.lock /app/Gemfile.lock

# bundler バージョン指定
ENV BUNDLER_VERSION 2.1.4
RUN gem install bundler
RUN bundle install

ADD . /app
```


# docker-compose.yml 内容

WEB コンテナ と DB コンテナ をそれぞれ作成して、一括で管理するための設定となります。
参考にさせていただいたサイトのまま実行しても自分の環境ではうまくいかないことがあったので、中身を変えております。

```yml:docker-compose.yml
version: '3'
services:
  # database.yml の host で指定した名前と一致させること
  db:
    image: mysql:5.7
    volumes:
      # dbコンテナが停止しても、データを保持するようにする
      - ./tmp/volumes/db:/var/lib/mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: password

  # Dockerfile で構築するイメージを web という名前で扱う
  web:
    build:
      context: .
      dockerfile: Dockerfile
    # 一度サーバーが起動すると起動し続けるので、rm -f /app/tmp/pids/server.pidで、dockerが起動する度に一旦停止させる
    command: /bin/sh -c "rm -f /app/tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    tty: true
    stdin_open: true
    depends_on:
      # 依存関係 - dbコンテナ作成後、web実行
      - db
    ports:
      - "3000:3000"
    volumes:
      # ソースコード変更したらDocker側も即反映されるように
      - .:/app 
```

# database.yml

上記で作成した```docker-compose.yml``` の DB コンテナの設定に合わせて、```database.yml```を修正していきます。

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

development:
  <<: *default
  database: docker_development
  username: root
  password: password
  host: db
  port: 3306

test:
  <<: *default
  database: docker_test
  username: root
  password: password
  host: db
  port: 3306

# 本番環境はご自身の設定に合わせてください
production:
  <<: *default
```


# 実行

上記でコードの準備はできたので、以下のコードで実行していきます。

```bash
# Docker image 作成
$ docker-compose build

# DB 作成・マイグレーション
$ docker-compose run web rails db:create
$ docker-compose run web rails db:migrate

# docker-compose.yml に記述したコンテナを起動 （今回は WEB と DB）
$ docker-compose up
```


# まとめ

ほぼ自分用の記事になってしまいましたが、少しでも他の方の役に立てばなと思います。
それにしても docker 便利すぎる。。


# 参考

以下のサイトを参考にさせていただきました。ありがとうございました。

* 【Docker】作成中Railsプロジェクトで開発環境構築
    * https://qiita.com/AK4747471/items/39ddacfde6a235103277
* 既存のRailsアプリにDockerを導入する手順
    * https://qiita.com/kenz-dev/items/b9e716204e0cd0cea447

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/