【Ruby on Rails】 Docker + Rails + Mysql 環境構築

こんにちは、株式会社Pentagonでアプリ開発をしている中原です。

この記事では、Docker+Rails+Mysqlの開発環境を構築する方法について説明します。Railsを開発する際には、環境構築が必要です。しかし、開発者によってOSやバージョンが異なり、環境構築に失敗する場合があります。Dockerは、環境をコンテナに分離することで、OSやバージョンに依存しない開発環境を構築することができます。これにより、開発者は同じ環境で開発を進めることができ、エラーや不具合を減らすことができます。

【こんな人に読んで欲しい】

  • Railsの環境構築に挫折した方
  • これからRailsを開発するエンジニア

【この記事を読むメリット】

  • Docker+Rails+Mysqlの開発環境を構築することができる。

【結論】

本記事を読み実装を行えれば、Docker+Rails+Mysqlを使用した開発環境を構築することができます。Doclerを起動後、http://localhost:3001/ にアクセスし、Railsページが表示されれば成功です。みなさん、Railsの開発ライフを楽しみましょう。

目次

環境構築を行う各バージョン

  • Ruby version: ruby 3.2.2
  • Rails version: 7.0.6
  • Mysql version 8.0

前提条件

  • Docker Desktopインストール済み
  • vscode インストール済み

環境構築手順

1.任意のディレクトリを作成

今回はdocker_rails7として作成します。

mkdir docker_rails7

2.各必要ファイルを作成、編集

各必要ファイルを作成、編集します。

  • Dockerfile Docker
  • docker-compose.yml
  • Gemfile
  • Gemfile.lock
  • entrypoint.sh
  • .env
touch {docker-compose.yml,Dockerfile,Gemfile,Gemfile.lock,entrypoint.sh,.env}

Dockerfile

Dockerfileはイメージをビルドするための手順が書かれたテキストファイルになります。Rubyのインストールに必要な情報を記述します。

# 最新のrubyイメージを取得
FROM ruby:3.2.2

# 環境変数
ENV APP_HOME /app
ENV TZ Asia/Tokyo
ENV PORT 3001
ENV HOST 0.0.0.0

# WORKDIR:作業ディレクトリ
WORKDIR ${APP_HOME}

# ローカルのGemfileをコンテナ内の/app/Gemfileに
COPY Gemfile ${APP_HOME}/Gemfile
COPY Gemfile.lock ${APP_HOME}/Gemfile.lock

# Rails7ではWebpackerが標準では組み込まれなくなったので、yarnやnodejsのインストールが不要
RUN apt-get update
RUN apt-get install -y \
        git

# Gemをアップデート
RUN bundle install

COPY . ${APP_HOME}

# コンテナ起動時に実行させるスクリプト
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE ${PORT}

# コンテナ実行時にRails サーバ起動
CMD ["bundle", "exec", "rails", "server", "-b", ${HOST}]

docker-compose.yml

アプリケーションを動かすための設定を記述します。webにはRailsDBにはMysqlについての設定を記述します。

version: '3'
services:
  # Railsの設定
  web:
    # build: .でdocker-compose.ymlと同じフォルダにDockerfileがあることを示す
    build: .
    # 事前に手元で/tmp/pids/server.pidを削除する
    command: /bin/sh -c "rm -f tmp/pids/server.pid && rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/app
    env_file:
      - .env
    ports:
      - ${RAILS_PORT}:3000 # 環境変数から参照
    # true を指定することでコンテナを起動させ続けることができる。
    tty: true
    # 標準入出力とエラー出力をコンテナに結びつける設定。
    stdin_open: true
    # 起動順を制御する
    depends_on:
      - db
    links:
      - db
  # Mysqlの設定
  db:
    image: mysql:8.0
    volumes:
      - db-data:/var/lib/mysql
    environment:
      MYSQL_DATABASE: ${MYSQL_DB}  # 環境変数から参照
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} # 環境変数から参照
      TZ: "Asia/Tokyo"
    ports:
      - "3307:3306"
    restart: always
volumes:
  db-data:

Gemfile

アプリケーションが依存する Ruby の Gem を指定するためのファイルになります。
はじめにRailsのgemを記述します。バージョン指定がない場合は、最新の安定版になります。
バージョンを指定したい場合はgem 'rails', '7.0.6'と記述します。

source 'https://rubygems.org'
gem 'rails'

Gemfile.lock

Gemfile.lockはアプリケーションが使用している Gem の正確なバージョンを保存するためのファイルになります。docker-compose exec web bundle installコマンドでgemをインストールした際にGemfile.lockが上書きされるので何も記載する必要がありません。

entrypoint.sh

初回起動時のみに処理したい内容を記述します。
server.pidファイルを消す内容を記述しています。

#!/bin/sh
set -e
rm -f /app/tmp/pids/server.pid
exec "$@"

.env

環境変数を記載します。

MYSQL_DB= docker_rails7
MYSQL_USER=root
MYSQL_ROOT_PASSWORD=password
RAILS_HOST=0.0.0.0
RAILS_PORT=3001

3.Railsプロジェクトの作成

今回のプロジェクトは、APIのみを作成します。データベースはMySQLを使用し、テストフレームワークはRSpecを使用します。以下のコマンドを実行して、Railsのプロジェクトを作成してください。

docker-compose run web bundle exec rails new . -f -d mysql -api -T -B
  • -f ファイルが存在する場合上書きして作成するためのコマンド。
  • -d mysql データベースをmysqlに変更。
  • -api APIのみのアプリケーションを生成
  • -T テストを作成しない。他のテストフレームワークを使用したい場合に指定。
  • -B bundle installしない

4.Dockerイメージ作成

docker-compose build

5.コンテナの立ち上げ

docker-compose up -d

6.環境変数.envを読み込ませるための設定

dotenv-railsのgemを追加

環境変数.envを読み込むために、dotenv-railsのgemを追加します。

------省略------

## 環境変数
gem 'dotenv-rails'

group :development, :test do
  # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
  gem "debug", platforms: %i[ mri mingw x64_mingw ]
end

------省略------

追加したgemのインストール

docker-compose exec web bundle install

7.DBの設定

databaseusernamepasswordは環境変数.envに設定した設定を指定します。
またhostにはdocker-compose.ymlで設定したDBのサービス名を指定します。

config/database.yml

------省略------

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  database: <%= ENV.fetch("MYSQL_DB") { '' } %> #.env 環境変数を参照
  username: <%= ENV.fetch("MYSQL_USER") { '' } %> #.env 環境変数を参照
  password: <%= ENV.fetch("MYSQL_ROOT_PASSWORD") { '' } %> #.env 環境変数を参照
  host: db #localhostからdocker-compose.ymlのDBのサービス名を指定

development:
  <<: *default
  database: <%= ENV.fetch("MYSQL_DB") { '' } %>_development #.env 環境変数を参照

test:
  <<: *default
  database: <%= ENV.fetch("MYSQL_DB") { '' } %>_test #.env 環境変数を参照

------省略------

8.DBの作成

データベースを以下のコマンドで作成します。

docker-compose exec web rails db:create

'docker_rails7_development'と'docker_rails7_test'のデータベースが作成されます。

Created database 'docker_rails7_development'
Created database 'docker_rails7_test'

9.ブラウザで確認

ブラウザで http://localhost:3001/ を開きます。
環境構築が出来ていれば、画像のページが表示されます。
Rails localhost3001.png

まとめ

本記事を読み、環境構築ができましたでしょうか。Dockerを使用することで簡単に環境構築を行うことができます。
次回はテストフレームワークであるRSpecを使用して単体テストについて実装します。
みなさん、Railsの開発ライフを楽しみましょう。

採用情報はこちら
目次