Docker × Rails 8 API × MySQL 環境構築手順まとめ

## 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初期化、ポートフォワード、ボリューム永続化などを定義しています。
```yaml
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 の依存をビルドし、アプリケーションコードを配置します。
```Dockerfile
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 の残留問題に対処します。
```sh
#!/bin/bash
set -e

# 既存のPIDファイルがあれば削除
rm -f /myapp/tmp/pids/server.pid

# コンテナ起動後にコマンド実行
exec "$@"
```

## ✅ 4. GemfileとGemfile.lock(空)
### Gemfile
Rails 8.0.2 を使用します。
```ruby
source 'https://rubygems.org'
gem 'rails', '~> 8.0.2'
```

### Gemfile.lock(空)--作成のみ
初期状態では空でOKです。以下のコマンドで作成します：
```bash
touch Gemfile.lock
```

## ✅ 5. データベース設定（config/database.yml）
rails new によって生成された config/database.yml を以下のようにMySQL向けに編集します。
```yaml
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. 実行手順
以下の手順で環境を立ち上げます。🚧
### ① コンテナのビルドと起動

```bash
docker compose up -d
```
### ② データベース作成

```bash
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）への発展