Rails

【MySQL】RailsアプリケーションをDocker環境下で動かすまでの手順を解説

Rails



 

今回はMySQL+RailsのサンプルアプリケーションをDocker環境で動かすまでの手順についてまとめました。この記事では2022年9月19日現在の最新バージョンである、Ruby3.1.2/Rails7.0.4で構築作業を進めていきます。

PostgreSQLでの環境構築手順は以下を参考にしてください。

Rails
【PostgreSQL】RailsアプリケーションをDocker環境下で動かすまでの手順を解説PostgreSQL+RailsのサンプルアプリケーションをDocker環境で動かすまでの手順についてまとめています。この記事では、2022年1月6日の最新バージョンであるRuby3.1.0/Rails7.0.1で構築作業を進めています。...

始めに

この記事の手順は以下のDockerクイックスタートガイドを参考に進めています。

↓ ↓ ↓

ゴール

Railsのデモ画面を表示することを今回の実装のゴールに設定します。

Railsデモ画面

構築手順

Docker Desktop for Macのインストール

Dockerの環境構築としてDocker Desktop for Macをインストールする必要があります。以下の記事を元にインストールを進めましょう。

Docker
【1分完結】Docker Desktop for Macのインストール手順Docker Desktop for Macのインストール手順についてまとめています。インストールのみで完了する作業ですので、ダウンロード時間を除くと1分前後で設定することができます。...

開発フォルダの作成

まずはRailsアプリケーションとDockerの設定ファイルを格納するディレクトリを作成します。今回はDesktop配下にdocker_demoというディレクトリを作成していますが、ディレクトリの配置場所やディレクトリ名は適宜変更してください。

~ % cd Desktop
Desktop % mkdir docker_demo
ディレクトリ名を変更した場合は、以降に登場するディレクトリ名も忘れずに変更してください。

Dockerfileの作成

続いて、アプリケーションをビルドするために必要なDockerfileを作成します。

Desktop % cd docker_demo
docker_demo % touch Dockerfile

Dockerfileはアプリケーションのビルドに必要な設定が書かれたファイルです。ざっくり言うと、アプリケーションを動作させるサーバーなどの情報が記載されたファイルになります。

 

先ほど作成したDockerfileに以下の記述を追加します。今回はRuby3.1.2を使用するため、冒頭にFROM ruby:3.1.2を記載します。

FROM ruby:3.1.2

RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

FROM ruby:3.1.2
Ruby3.1.2のイメージを指定

COPY entrypoint.sh /usr/bin/
ローカルのentrypount.shを/usr/bin配下にコピー

RUN chmod +x /usr/bin/entrypoint.sh
実行権限をの付与

ENTRYPOINT ["entrypoint.sh"]
最初の実行コマンド(今回はentrypoint.shを実行)

EXPOSE 3000
port番号

CMD ["rails", "server", "-b", "0.0.0.0"]
Railsの実行

Gemfileの作成

次にRailsの読み込み専用Gemfileを作成します。

今回はRails7.0.4のアプリケーションを使用するため、作成したGemfileにはgem 'rails', '7.0.4'を記載します。

docker_demo % touch Gemfile
# Gemfile

source 'https://rubygems.org'
gem "rails", '7.0.4'
作成したGemfileは、この後のrails newによって上書きされます。

Gemfile.lockの作成

Dockerfileをビルドするため、空のGemfile.lockを作成します。

docker_demo % touch Gemfile.lock

entrypoint.shの作成

Rails特有の問題「既にserver.pidファイルが存在してしまうことで、サーバーを再起動できない問題」を解決するファイルであるentrypoint.shを作成します。

docker_demo % touch entrypoint.sh

 

作成したentrypoint.shに以下の記述を追加しましょう。このスクリプトはコンテナを起動する度に実行されます。

#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /docker_demo/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

set -e
エラーが吐かれた場合は処理を中止

rm -f /docker_demo/tmp/pids/server.pid
既にserver.pidファイルが存在している場合は削除

exec "$@"
DockerfileのCMDコマンド(今回はRailsを実行)

docker-compose.ymlの作成

次にアプリケーションを構成するサービス一覧を記載し、それらを一括で実行してくれるdocker-compose.ymlを作成します。

docker_demo % touch docker-compose.yml
拡張子は.yamlでも問題ありません。

 

作成したdocker-compose.ymlにdbとwebの2つを記載します。

dbではMySQLを指定します。

version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: root
    ports:
      - "3306:3306"
    volumes:
      - ./tmp/db:/var/lib/mysql

  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
db/web以外の名称でも構いませんが、基本的にデータベース情報はdb、ウェブアプリケーションはwebと記載します。

version: "3"
docker-composeのバージョン

services:
services配下にコンテナを定義(今回はwebとdbのみ)

image: mysql:5.7
利用するイメージとバージョンの指定(今回はMySQL)

environment:
MySQLに関する環境変数の設定

ports:
ポート番号

volumes:
データを永続的に保存する場所を指定(コンテナ削除時にデータも削除されてしまうことを防ぐことができる)

build: .
Dockerfileがあるディレクトリを指定

command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
Railsサーバーの起動(既にserver.pidファイルが存在していた場合は削除)

volumes:
データを永続的に保存する場所を指定

depends_on:
コンテナの実行順序の指定(今回はdb起動→web起動)

Railsアプリケーションの作成

ここでRailsの新規アプリケーションを作成します。

docker_demo % docker-compose run --no-deps web rails new . --force --database=mysql

--force
Gemfileの上書き

--no-deps
リンクされたコンテナを起動させない

--database=mysql
DBの指定(今回はMySQL)

--skip-bundle
bundle installのスキップ

ビルド実行

rails newで作成した新規アプリケーションのGemfileを更新するため、ビルドを実行します。% docker-compose buildを打ち込むことでビルドが実行されます。

% docker-compose build

database.ymlの編集

デフォルトではRailsはlocalhost上でDBが動作してしまうため、先ほど記述したDBコンテナを動作先に指定しましょう。config/database.ymlのdefault部分を以下のように編集します。

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  host: localhost

development:
  <<: *default
  database: myapp_development
  host: db
  username: root
  password: password

test:
  <<: *default
  database: myapp_test
  host: db
  username: root
  password: password

production:
  <<: *default
  database: myapp_production
  username: myapp
  password: <%= ENV["MYAPP_DATABASE_PASSWORD"] %>

DBの作成

以下のコマンドでDBを立ち上げます。

% docker-compose run web rails db:create
Creating docker_demo_web_run ... done
Created database 'docker_demo_development'
Created database 'docker_demo_test'

アプリケーションの起動

ここまででDockerの設定を一通り終了しました。後はdocker-copmpose upでアプリケーションを立ち上げましょう。

% docker-compose up

動作確認

これでDocker環境下でRailsを動かす手順が完了しました。あとはhttp://localhost:3000/にアクセスし、以下のようなデモ画面が表示されれば成功です。

Railsデモ画面

構築手順ざっくりまとめ

  • Docker Desktop for Macのインストール
  • 開発フォルダの作成
  • Dockerfileの作成
  • Gemfileの作成
  • Gemfile.lockの作成
  • entrypoint.shの作成
  • docker-compose.ymlの作成
  • Railsアプリケーションの作成
  • ビルド実行
  • database.ymlの編集
  • DBの作成
  • アプリケーションの起動
  • 動作確認

参考

 

 

今回はRuby3.1.2/Rails7.0.4のサンプルアプリケーションをDocker環境で動かすまでの手順についてまとめました。基本的にはチュートリアル通りですので、ご自身でも試しに取り組んでみてはいかがでしょうか。