WSL2(Ubuntu)にDocker+Ruby on Rails開発環境の構築

Windows上のWSLにDocker+Ruby on Railsの開発環境を構築する手順のまとめです。

事前準備

各環境のバージョン情報

OS Windows11 Pro
WSL 2.4.12.0
WSL OS Ubuntu 24.04.2 LTS
Docker Docker version 28.0.4, build b8034c0
Docker-Compose Docker Compose version v2.34.0-desktop.1

環境構築手順

アプリケーションディレクトリ作成

任意のプロジェクト名でディレクトリを作成し、移動します。

mkdir ruby-test
cd ruby-test/

Docker関連ファイル作成

ruby-test/
├── Dockerfile
├── Gemfile
├── Gemfile.lock
└── docker-compose.yml

Dockerfile

echo "# ベースイメージ
FROM ruby:3.2.3

# パッケージインストール
RUN apt-get update -qq && apt-get install -y nodejs yarn default-mysql-client

# 作業ディレクトリ
WORKDIR /myapp

# Gemfile, Gemfile.lock
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock

# Bundler
RUN gem install bundler
RUN bundle install

# アプリケーションコード
COPY . /myapp

# ポート(3000)
EXPOSE 3000

# サーバー起動
CMD [\"rails\", \"server\", \"-b\", \"0.0.0.0\"]" > Dockerfile

ベースイメージのRubyバージョンを3.2.3としていますが、後述のUbuntuにセットアップするRubyバージョンと合わせています。2025年現在のRubyは3.3.0ですが、Ubuntuのリポジトリ上では3.2.3が最新となっているためです。

必須ではありませんが、開発を進めていくうえでDB運用などする際にコンテナのバージョンと合わせておかないと、運用コマンドが使えないためです。

追記:bundle exec railsコマンドでバージョン差分を吸収できることを後から知りました。この方法を使えばこうしたバージョン差分を吸収できるようなので、いつか検証してまとめたいと思います。

docker-compose.yml

echo "services:
  db:
    image: mysql:8.0
    volumes:
      - mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - 3306:3306
  web:
    build: .
    command: bash -c \"rm -f tmp/pids/server.pid && rails server -b 0.0.0.0\"
    volumes:
      - .:/myapp
    ports:
      - '3000:3000'
    depends_on:
      - db
volumes:
  mysql_data:" > docker-compose.yml

Gemfile

Gemfileは、Rubyのプロジェクトで使用するGem(ライブラリ)を管理するためのファイルです。

echo "source 'https://rubygems.org'
gem 'rails', '8.0.2'" > Gemfile

Gemfile.lock

Gemfile.lockは、Rubyのプロジェクトで使用するGemのバージョンを固定し、依存関係を管理するためのファイルです。Gemfileに記載されたGemをインストールすると、自動的に生成されるので空の状態でOKです。

touch Gemfile.lock

Railsアプリケーションセットアップ

アプリケーション作成

docker compose run --rm web rails new . --force --no-deps --database=mysql

Rubyアプリケーションがセットアップされます。

Dockerfile
Gemfile
Gemfile.lock
README.md
Rakefile
app/
bin/
config/
config.ru
db/
docker-compose.yml
lib/
log/
public/
script/
storage/
test/
tmp/
vendor/

Dockerfile再更新

アプリケーションをセットアップした段階でDockerfileが上書きされてしまうので、再度「Docker関連ファイル作成」でDockerfileを更新します。Gemfileも同様に更新されますが、こちらはアプリケーションに必要なライブラリが記述されるのでそのままでOKです。

イメージビルド

Dockerfileの内容を元に、新しいイメージを構築します。以降、Dockerfileを変更した際には、再度buildコマンドを実行してやらないと変更が反映されません。

docker compose build

コンテナの作成(初回) & 起動

作成したイメージを使ってコンテナを作成し、起動します。

docker compose up -d

確認

docker compose ps

以下のようにDBとWEBのコンテナが2つ起動されていればOKです。

$ docker compose ps
NAME              IMAGE           COMMAND                  SERVICE   CREATED          STATUS         PORTS
ruby-test-db-1    mysql:8.0       "docker-entrypoint.s…"   db        40 minutes ago   Up 4 minutes   0.0.0.0:3306->3306/tcp, 33060/tcp
ruby-test-web-1   ruby-test-web   "bash -c 'rm -f tmp/…"   web       9 seconds ago    Up 6 seconds   0.0.0.0:3000->3000/tcp

http://localhost:3000/ へアクセスし、以下のように表示されればひとまずOKです。DBの接続エラーですが、これから設定していきます。

上手くいかないとき

以下コマンドでコンテナ起動時のログを確認し、エラー等を確認できます。

docker compose logs {web pr db}

コンテナの終了

docker compose kill

データベースセットアップ

config/database.yml

default設定の、username、passwordを自環境に合わせて、hostを"db"に変更します。

sudo vim config/database.yml

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

DB作成

docker compose exec web rake db:create

確認

http://localhost:3000/ へアクセスし、以下のように表示されればRuby on Railsアプリケーションのローカル環境の完成です。

基本的なデータベース運用に向けて

長くなるので別記事へ…

コメント

このブログの人気の投稿

docker-compose up で proxyconnect tcp: dial tcp: lookup proxy.example.com: no such host

【Android】Fragmentを使う② - ActivityとFragmentの相互呼び出し -

【Java】ObjectMapperでJSONデータを変数に取り込む