Rails 8 × MySQL × Dockerで構築するTodo管理APIの開発環境(完全ガイド)
Rails 8(APIモード)と MySQL 8.0 を使用した開発環境「Todo管理API」をベースに、Dockerで構築する手順を自分なりに紹介します。
Ruby 3.2ベースの構成で、フロントエンドとAPIを分離した開発スタイルに最適なセットアップです。
✅ 環境構成
項目 | 内容 |
---|---|
Ruby | 3.2.0 |
Rails | 8.0.2(APIモード) |
MySQL | 8.0 |
ポート構成 | 3001(ホスト) → 3000(Rails API) |
DB名 | todo_app_development |
DBユーザー | root / password |
Dockerネットワーク | app-network |
✅ ディレクトリ構成
Todo-app
|
backend/
├── Dockerfile
├── docker-compose.yml
├── entrypoint.sh
├── Gemfile
├── Gemfile.lock
└── ...(rails new によって生成されるファイル群)
✅ 1. docker-compose.yml
以下は Rails API + MySQL 構成の心臓部です。コンテナ起動時のDB初期化、ポートフォワード、ボリューム永続化などを定義しています。
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: todo_app_development
command: --default-authentication-plugin=mysql_native_password
volumes:
- mysql-data:/var/lib/mysql
ports:
- "3306:3306"
container_name: todo_db
networks:
- app-network
api:
build:
context: .
dockerfile: Dockerfile
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/myapp
- bundle-data:/usr/local/bundle
environment:
TZ: Asia/Tokyo
RAILS_ENV: development
RAILS_MAX_THREADS: 5
ports:
- "3001:3000"
depends_on:
- db
container_name: todo_api
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
mysql-data:
bundle-data:
💡 depends_on により DB 起動後にAPIが立ち上がるように制御しています。
✅ 2. Dockerfile
Dockerコンテナ内でRails APIアプリを動かすための構成です。Gemfile の依存をビルドし、アプリケーションコードを配置します。
FROM ruby:3.2.0
# 必要なパッケージのインストール
RUN apt-get update -qq && \
apt-get install -y build-essential libpq-dev nodejs default-mysql-client
# アプリケーションディレクトリの作成
WORKDIR /myapp
# Gemfileのコピーとインストール
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
# アプリケーションのコピー
COPY . /myapp
# エントリーポイントの設定
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
# サーバーの起動
EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0"]
✅ 3. entrypoint.sh
Railsの開発環境でよく起こる server.pid の残留問題に対処します。
#!/bin/bash
set -e
# 既存のPIDファイルがあれば削除
rm -f /myapp/tmp/pids/server.pid
# コンテナ起動後にコマンド実行
exec "$@"
✅ 4. GemfileとGemfile.lock(空)
Gemfile
Rails 8.0.2 を使用します。
source 'https://rubygems.org'
gem 'rails', '~> 8.0.2'
Gemfile.lock(空)--作成のみ
初期状態では空でOKです。以下のコマンドで作成します:
touch Gemfile.lock
✅ 5. データベース設定(config/database.yml)
rails new によって生成された config/database.yml を以下のようにMySQL向けに編集します。
default: &default
adapter: mysql2
encoding: utf8mb4
host: db
username: root
password: <個人で設定>
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
<<: *default
database: todo_app_development
test:
<<: *default
database: todo_app_test
production:
<<: *default
database: todo_app_production
✅ 6. 実行手順
以下の手順で環境を立ち上げます。🚧
① コンテナのビルドと起動
docker compose up -d
② データベース作成
docker compose exec api bundle exec rails db:create
✅ 7. 現在の状態(確認)
✅ todo_db コンテナが起動中(MySQL)
✅ todo_api コンテナが起動中(Rails API)
✅ http://localhost:3001 にアクセスすると Rails API が応答
✅ データベース todo_app_development が作成済みという環境構築ができます!!
おわりに
これで Todoアプリ(仮)のRails API開発環境が Docker 上で完成しました!
今後は以下のようなステップに進めます:
・CORS設定を加えてフロントエンドとの連携
・todos リソースの scaffold を追加してCRUD構築
・本番環境向けのDockerfile(multi-stage build)への発展