1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【2025年版】WindowsでDocker + Rails 8 + MySQL 8 環境構築完全ガイド

Last updated at Posted at 2025-12-30

【2025年版】WindowsでDocker + Rails 8 + MySQL 8 環境構築完全ガイド

Windows (PowerShell) 環境で、最新の Rails 8 と MySQL 8 を Docker Compose を使って構築する手順の備忘録です。 rails new 時に Dockerfile が本番用に上書きされる問題や、Windows 特有の Git 改行コード問題への対処も含めています。

環境

  • OS: Windows 10 / 11
  • Shell: PowerShell
  • Docker: Docker Desktop for Windows
  • Ruby: 3.3
  • Rails: 8.0
  • MySQL: 8.0

1. プロジェクトディレクトリの作成

まずはプロジェクト用のディレクトリを作成し、移動します。

mkdir sample_app
cd sample_app

2. 設定ファイルの作成

以下の3つのファイルをプロジェクトルートに作成します。 WindowsのPowerShellでは touch コマンドがないため、New-Item (エイリアス ni) を使うか、エディタで作成します。

開発環境用にシンプルにした Dockerfile です。

FROM ruby:3.3
RUN apt-get update -qq && apt-get install -y build-essential default-libmysqlclient-dev nodejs

WORKDIR /myapp

COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock

RUN bundle install

COPY . /myapp

MySQL 8.0 を使用し、データを永続化する設定です。

docker-compose.yml
services:
    db:
        image: mysql:8.0
        environment:
            MYSQL_ROOT_PASSWORD: password
        ports:
            - "3306:3306"
        volumes:
            - ./db/mysql/volumes:/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
            - gem_data:/usr/local/bundle
        ports:
            - 3000:3000
        depends_on:
            - db 
        tty: true
        stdin_open: true

volumes:
  gem_data:

rails new を実行するための仮の Gemfile です。

source 'https://rubygems.org'
gem 'rails', '~> 8.0'
Gemfile.lock (空ファイル)

ビルドエラーを防ぐために空のファイルを作成しておきます。

ni Gemfile.lock

3. Rails アプリケーションの新規作成

初回ビルド
まずは仮の Gemfile を元にイメージをビルドします。

docker compose build

rails new の実行
コンテナ越しに rails new を実行してファイルを生成します。

--force: 既存のファイルを上書きします。
--database=mysql: DBをMySQLに指定します。
--skip-bundle: ここではbundle installをスキップします(後でコンテナ内でやるため)。

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

4. 設定の修正 (重要)

rails new を実行すると、いくつかのファイルが上書き・生成されるため、開発環境用に修正が必要です。

Dockerfile を元に戻す
Rails 8 の rails new は、本番環境向け(Kamal用)の複雑な Dockerfile を自動生成し、元のファイルを上書きしてしまいます。 開発環境では扱いづらいため、手順2で作成したシンプルな Dockerfile の内容にもう一度書き戻します。

config/database.yml の修正
生成された config/database.ymllocalhost を向いているため、Docker Compose のサービス名 db に書き換えます。また、パスワードも設定します。

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password  # docker-compose.ymlで設定したパスワード
  host: db            # サービス名に変更

5. 再ビルドと起動

Gemfile が更新されたため、イメージを再ビルドします。

docker compose build

コンテナを起動します。

docker compose up -d

データベースを作成します。

docker compose run --rm web rails db:create db:migrate

これで http://localhost:3000 (または http://127.0.0.1:3000) にアクセスすると、Railsのデフォルト画面が表示されます。

6. Git の設定 (Windows向け)

'Windows' で開発する場合、改行コードの問題や、Docker の DB ファイルを除外する設定が必要です。

.gitignore の追記
docker-compose.yml で指定した DB のボリューム保存先を Git 管理外にします。 .gitignore の末尾に以下を追記します。

.gitignore
# Docker database volume
/db/mysql/volumes

.gitattributes の作成
Windows (CRLF) と Linux コンテナ (LF) の改行コードの違いによる警告を防ぐため、.gitattributes ファイルを作成し、Git 上では LF に統一します。

ファイル名: .gitattributes

.gitattributes
* text=auto eol=lf

Git 初期化とコミット

git init
git add .
git commit -m "first commit"
git branch -M main
# リモートリポジトリがある場合
# git remote add origin https://github.com/USERNAME/REPO.git
# git push -u origin main

7. Scaffold で機能作成

動作確認として Scaffold で記事投稿機能を作成してみます。

# Scaffold 生成
docker compose run --rm web rails g scaffold Post title:string body:text

マイグレーション実行

docker compose run --rm web rails db:migrate

http://127.0.0.1:3000/posts にアクセスして、投稿機能が動けば構築完了です!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?