WSL2 Dockerで作る Rails 8.0.2 + Ruby 3.4.2 + MySQL 開発環境構築ガイド

この記事では、Docker Desktopを使用せず、WSL2 (Windows Subsystem for Linux 2) ディストリビューション内に直接インストールしたDocker EngineとDocker Compose v2 を利用して、Ruby 3.4.2 + Rails 8.0.2 + MySQL 8.0 のWebアプリケーション開発環境を構築する手順を解説します。

リソース効率、ライセンス、Linux環境との親和性などを考慮してDocker Desktop以外の選択肢を探している開発者を対象としています。

目次

構築環境概要

  • ホストOS: Windows + WSL2 (例: Ubuntu 22.04 LTS)
  • コンテナエンジン: Docker Engine (WSL2内にインストール)
  • オーケストレーション: Docker Compose (v2 Plugin)
  • アプリケーションコンテナ (app): Ruby 3.4.2, Rails 8.0.2 (Puma)
  • データベースコンテナ (db): MySQL 8.0

前提条件

作業開始前に、以下の環境が準備されていることを確認してください。

  1. WSL2とLinuxディストリビューション: WSL2が有効であり、Linuxディストリビューション (例: Ubuntu) がインストール済みであること。
  2. Docker Engine & Compose (v2) in WSL: Docker Desktopではなく、WSLディストリビューション内にDocker EngineとDocker Compose v2 Pluginがインストールされていること。
  3. Dockerデーモンの起動: WSL内でDockerデーモンが起動していること。
  4. Dockerグループへのユーザー追加 (推奨): sudoなしでdockerコマンドを実行するために設定。

環境構築手順

Docked Rails CLI という、Ruby on Railsの開発環境をDockerを利用して簡単かつ迅速に構築するための公式ツールを利用して環境構築していきます。

事前準備

プロジェクトの親ディレクトリに移動します。

cd ~/myapp_project

1.Bundlerキャッシュ用ボリュームの作成 (初回のみ)

Railsアプリケーションの依存関係をキャッシュするためのボリュームを作成します。

docker volume create ruby-bundle-cache

2.カスタムDockerfileの準備

MySQLの依存ライブラリを含んだDockerfileを作成します。

FROM ghcr.io/rails/cli:latest

RUN apt-get update -qq && \
    apt-get install --no-install-recommends -y \
      build-essential \
      default-mysql-client \
      default-libmysqlclient-dev

3.カスタムDockerイメージのビルド

Dockerfile があるディレクトリで、以下のコマンドを実行してイメージをビルドします。(イメージ名は my-rails-cli としていますが、任意の名前に変更可能です)

docker build -t my-rails-cli .

4.docked エイリアスの設定

Dockerコンテナを簡単に起動するためのエイリアスを設定します。
重要なのは、ビルドしたカスタムイメージ名 (my-rails-cli) を使う点です。

alias docked='docker run --rm -it -v ${PWD}:/rails -u $(id -u):$(id -g) -v ruby-bundle-cache:/bundle -p 3000:3000 my-rails-cli'

5.新しいRailsアプリケーションの作成

databaseはMySQL、rspecを利用するのでtestはスキップします。

docked rails new myapp --database=mysql --skip-test

作成されたディレクトリに移動します。

cd myapp

環境変数を設定する.envファイルを作成します。

echo "# DB settings (for MySQL container initialization)
MYSQL_ROOT_PASSWORD=password

# DB settings (for Rails application - referenced in database.yml)
DB_HOST=db
DB_USER=root" >> .env

Dockerfile.dev 作成

自動生成されたDockerfileは本番環境用なのでリネームします。

mv Dockerfile Dockerfile.prod

開発環境用のDockerfileとして、Dockerfile.devを作成します。

# syntax=docker/dockerfile:1
# check=error=true

ARG RUBY_VERSION=3.4.2
FROM docker.io/library/ruby:$RUBY_VERSION-slim

ARG UID=1000
ARG GID=1000
ARG USER_NAME=rails

WORKDIR /rails

RUN apt-get update -qq && \
    apt-get install --no-install-recommends -y \
      build-essential \
      curl \
      git \
      default-mysql-client \
      default-libmysqlclient-dev \
      libjemalloc2 \
      libvips \
      libyaml-dev \
      pkg-config \
      nodejs \
      npm \
      watchman && \
    npm install -g yarn && \
    rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*

ENV RAILS_ENV="development" \
    RAILS_LOG_TO_STDOUT="true" \
    BUNDLE_PATH="/usr/local/bundle" \
    BUNDLE_APP_CONFIG="/usr/local/bundle" \
    BUNDLE_JOBS=4

RUN groupadd -g $GID -o $USER_NAME || true && \
    useradd -m -s /bin/bash -u $UID -g $GID -o $USER_NAME || true

COPY Gemfile Gemfile.lock ./
RUN bundle install

COPY . .

RUN chown $UID:$GID /rails && \
    chown -R $UID:$GID ${BUNDLE_PATH}

USER $USER_NAME

ENTRYPOINT [ "bin/docker-entrypoint" ]

bin/docker-entrypointを修正

server.pidが存在していたら削除する設定を追加します。

# If running the rails server then create or migrate existing database
if [ "${@: -2:1}" == "./bin/rails" ] && [ "${@: -1:1}" == "server" ]; then
  rm -f tmp/pids/server.pid
  ./bin/rails db:prepare
fi

compose.yaml を作成

アプリケーション (app) とデータベース (db) のコンテナ構成を定義する compose.yaml を作成します。

services:
  db:
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    volumes:
      - mysql-data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 3

  app:
    build:
      context: .
      dockerfile: Dockerfile.dev
    volumes:
      - .:/rails
      - bundle_cache:/usr/local/bundle
    ports:
      - "3000:3000"
    depends_on:
      db:
        condition: service_healthy
    environment:
      DB_HOST: ${DB_HOST}
      DB_USER: ${DB_USER}
      DB_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      RAILS_ENV: development
      RAILS_LOG_TO_STDOUT: "true"
    stdin_open: true
    tty: true

volumes:
  mysql-data:
  bundle_cache:

config/database.yml 修正

config/database.yml を開き、 環境変数 (MYSQL_HOST, MYSQL_DB_USER, MYSQL_ROOT_PASSWORD) を参照するように、セクションを修正します。

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

データベース作成 (db:create)

Railsからデータベースを作成(または確認)します。

docker compose run --rm app bundle exec rails db:create

コンテナ起動

コンテナをバックグラウンドで起動します。

docker compose up

動作確認

  • ブラウザ: http://localhost:3000 にアクセス。表示されない場合は ip addr show eth0 でWSLのIPを確認し http://<WSL-IP>:3000 で試行。
  • ログ: docker compose logs -f app
  • 状態: docker compose ps

コンテナ停止

開発終了後、コンテナを停止・削除します。

docker compose down
# ボリューム削除は -v オプション (データが消える点に注意)
# docker compose down -v

Docker Desktopなしの場合の留意点

  • デーモン管理: Dockerデーモンの起動・停止は手動(または自動起動設定)。
  • リソース: WSLのリソース設定 (.wslconfig) が影響。
  • ファイルシステム: プロジェクトはWSLファイルシステム内に配置推奨。

まとめ

このガイドでは、WSL2ネイティブDocker環境で、Ruby 3.4.2 + Rails 8.0.2 + MySQL 8.0 を使用した開発環境を構築する手順を示しました。

手順を実行する前に、各設定ファイルの内容やバージョン指定に誤りがないか、再度確認することをお勧めします。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次