DockerでRails+MySQLの環境を構築してみる

以前、DockerでRails + PostgreSQLの環境を作る記事を投稿したのですが、別のPCで環境を作ろうとしたらエラーが出てしまったので、PostgreSQLをMySQLに変えて再度、環境構築手順を整理しました。

基本的に下記のQiitaの記事を参考にしています。

Dockerを用いてRuby on Railsの環境構築をする方法( Docker初学者向け )

当記事はRailsが動く環境を作ることが目的の記事になります。

そのため、DockerファイルやYAMLファイルなどの設定値の解説は省略し、手順の一部簡略化を行っています。

開発環境

  • OS:Windows11
  • Docker Desktopインストール済み
  • VSCodeインストール済み

Dockerファイル作成

type nul > Dockerfile

下記の内容でDockerファイルを編集。

# syntax=docker/dockerfile:1

ARG RUBY_VERSION=3.3.11
FROM ruby:${RUBY_VERSION}-slim

WORKDIR /app

RUN apt-get update -qq && \
    apt-get install -y \
      build-essential \
      default-libmysqlclient-dev \
      default-mysql-client \
      libyaml-dev \
      pkg-config \
      git && \
    rm -rf /var/lib/apt/lists/*

COPY Gemfile Gemfile.lock ./

RUN bundle install

COPY . .

EXPOSE 3000

CMD ["bash", "-c", "rm -f tmp/pids/server.pid && bundle exec rails server -b 0.0.0.0"]

Gemfile作成

type nul > Gemfile

下記の内容でGemfileを編集。

source "https://rubygems.org"

gem "rails", "~> 8.0"
gem "mysql2"

Gemfile.lock作成

type nul > Gemfile.lock

YAMLファイル作成

type nul > docker-compose.yml

下記の内容でYAMLファイルを編集。

services:
  app:
    build: .
    ports:
      - "3000:3000"
    volumes:
      - .:/app
    depends_on:
      db:
        condition: service_healthy
    environment:
      RAILS_ENV: development
      DB_HOST: db
      DB_NAME: odaneko
      DB_USER: odaneko
      DB_PASSWORD: odaneko
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails server -b 0.0.0.0"

  db:
    image: mysql:8.4
    environment:
      MYSQL_ROOT_PASSWORD: odaneko
      MYSQL_DATABASE: odaneko
      MYSQL_USER: odaneko
      MYSQL_PASSWORD: odaneko
    ports:
      - "3306:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-podaneko"]
      interval: 5s
      timeout: 5s
      retries: 50

volumes:
  mysql_data:

Railsプロジェクト作成

コンテナをビルド。

docker compose build --no-cache

bundleインストール。

docker compose run --rm rails bundle install

Railsプロジェクトを作成。
成功すると、Rails関連のフォルダ・ファイルが生成される。

docker compose run --rm app rails new . --database=mysql --force --skip-bundle

プラットフォーム情報を追加。

docker compose run --rm app bundle lock --add-platform x86_64-linux

ホットリロード設定

プロジェクト作成の過程で中身が変わってしまったDockerfileを再度編集。
先ほどと同じ内容です。

# syntax=docker/dockerfile:1

ARG RUBY_VERSION=3.3.11
FROM ruby:${RUBY_VERSION}-slim

WORKDIR /app

RUN apt-get update -qq && \
    apt-get install -y \
      build-essential \
      default-libmysqlclient-dev \
      default-mysql-client \
      libyaml-dev \
      pkg-config \
      git && \
    rm -rf /var/lib/apt/lists/*

COPY Gemfile Gemfile.lock ./

RUN bundle install

COPY . .

EXPOSE 3000

CMD ["bash", "-c", "rm -f tmp/pids/server.pid && bundle exec rails server -b 0.0.0.0"]

database.yml編集

config/database.ymlの12~22行目付近にあるDBの設定を編集。

default: &default
  adapter: mysql2
  encoding: utf8mb4
  host: <%= ENV["DB_HOST"] %>
  username: <%= ENV["DB_USER"] %>
  password: <%= ENV["DB_PASSWORD"] %>
  pool: 5

development:
  <<: *default
  database: <%= ENV["DB_NAME"] %>

コンテナ起動

コンテナビルド。

docker compose build --no-cache

コンテナ起動。

docker compose up -d

環境が構築できたか確認

下記のURLを開きます。

http://localhost:3000/

問題なく表示されれば、RailsMySQLのインストールが無事完了しています。

DB疎通確認

ルーティング

Rails.application.routes.draw do
  get "/db-test", to: "hello#db"
end

API(コントローラー)作成

コントローラー作成。

type null > app\controllers\hello_controller.rb

DB検索して1を返すだけのAPIを作成。

class HelloController < ApplicationController
  def db
    result = ActiveRecord::Base.connection.execute("SELECT 1")

    render json: result.to_a
  end
end

下記にアクセス。

http://localhost:3000/db-test

1が返ってくればOK。

以上になります。
お読み頂き、ありがとうございました。