DockerでRails7+MongoDBの環境構築をする
はじめに
MongoDB の学習にあたり、Docker で Rails と MongoDB の環境を構築してみました。
一部詰まってしまった部分もあったため備忘として手順を残したいと思います。
対象とする読者
- MongoDB を初めて触る初学者の方
バージョン
バージョン指定はせずに本日時点(2023/7/12)最新の安定バージョンでの環境を構築しました。
- Rails 7.0.6
- MongoDB 8.1
環境構築
初期ファイル準備
最初に任意のディレクトリで 3 つのファイルを作成します。
FROM ruby:3.2.0
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
version: "3"
services:
mongodb:
image: mongo
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: root
ports:
- "27017:27017"
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- mongodb
source 'https://rubygems.org'
gem 'rails'
Rails プロジェクト作成
上記ファイルが作成できたら、Rails のプロジェクトを作成します。
docker run web rails new . --skip-active-record --force
Mongodb を使うためアクティブレコードは使用しません。
コマンドを実行すると、見慣れた Rails のファイル群が作成されるので、完了後 Gemfile に下記内容を追加します。
gem 'mongoid'
mongoid はアクティブレコードの代わりに使用する MongoDB 用の ORM です。
gem ファイルを編集後コンテナのビルドを行います。
docker compose build
MongoDB 設定ファイル追加
MongoDB の設定ファイルを追加するために下記コマンドを実行します。
docker compose run web bin/rails g mongoid:config
コマンドを実行すると、mongoid.yml というファイルが生成されます。
接続情報を docker-compose.yml で記述した内容と合わせます。
※コメントアウトされている内容は省略しています。
実はこの内容だけだとエラーが発生してしまうのですが、その点は後述します。
development:
clients:
default:
database: mongodb
hosts:
- mongodb:27017
options:
user: "root"
password: "root"
server_selection_timeout: 1
options:
test:
clients:
default:
database: myapp_test
hosts:
- localhost:27017
options:
read:
mode: :primary
max_pool_size: 1
コンテナ起動
コンテナを起動し rails サーバーにアクセスします。
docker compose up
下記アドレスにアクセスすると Rails の初期画面が表示されると思います。
localhost:3000
Post モデル追加
次に DB を使用するために Post モデルを追加します。
この内容は MongoDB の公式ドキュメントのチュートリアルに則っています。
Post モデル追加
docker exec -it rails-mongodb-sample-web-1 rails g scaffold Post title:string body:text
※コンテナ名はご自身の環境に合わせて変更してください。
scaffold コマンドを使ってルーターとコントローラーとビューを一度に生成します。
なおこの時点で下記 URL にアクセスするとエラーが発生しました。
/localhost:3000/posts
エラー内容
User root (mechanism: scram) is not authorized to access mongodb (auth source: mongodb, used mechanism: SCRAM-SHA-1, used server: mongodb:27017 (STANDALONE)): [18:AuthenticationFailed]: Authentication failed. (modern retry, attempt 1)
どうやら認証ソースを記述する必要があるようです。
mongoid.yml に下記の内容を追記しました。
development:
clients:
default:
database: mongodb
hosts:
- mongodb:27017
options:
user: "root"
password: "root"
server_selection_timeout: 1
+ auth_source: admin
+ auth_mech: :scram
options:
test:
clients:
default:
database: myapp_test
hosts:
- localhost:27017
options:
read:
mode: :primary
max_pool_size: 1
設定ファイルの編集が完了したらコンテナを再起動します。
再起動後、/localhost:3000/postsにアクセスすることで正常に表示することができると思います。
投稿も成功しました。
さいごに
以上で Docker での環境構築は完了です。
MongoDB 自体の学習はこれからになりますが、mongoid を使うことでアクティブレコードとほぼ同じような記述ができるようです。
また公式のチュートリアルでは Post モデルだけでなく Post モデルに紐づいた Comment モデルも追加するところまで行っているため、興味のある方は参照してみてください。
Discussion