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アプリケーションのローカル環境の完成です。
基本的なデータベース運用に向けて
長くなるので別記事へ…
コメント
コメントを投稿