この記事では、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
前提条件
作業開始前に、以下の環境が準備されていることを確認してください。
- WSL2とLinuxディストリビューション: WSL2が有効であり、Linuxディストリビューション (例: Ubuntu) がインストール済みであること。
- Docker Engine & Compose (v2) in WSL: Docker Desktopではなく、WSLディストリビューション内にDocker EngineとDocker Compose v2 Pluginがインストールされていること。
- Dockerデーモンの起動: WSL内でDockerデーモンが起動していること。
- 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 を使用した開発環境を構築する手順を示しました。
手順を実行する前に、各設定ファイルの内容やバージョン指定に誤りがないか、再度確認することをお勧めします。