🥬

DockerでRails7+MongoDBの環境構築をする

2023/07/12に公開

はじめに

MongoDB の学習にあたり、Docker で Rails と MongoDB の環境を構築してみました。
一部詰まってしまった部分もあったため備忘として手順を残したいと思います。

対象とする読者

  • MongoDB を初めて触る初学者の方

バージョン

バージョン指定はせずに本日時点(2023/7/12)最新の安定バージョンでの環境を構築しました。

  • Rails 7.0.6
  • MongoDB 8.1

環境構築

初期ファイル準備

最初に任意のディレクトリで 3 つのファイルを作成します。

Dockerfile
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
docker-compose.yml
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
Gemfile
source 'https://rubygems.org'
gem 'rails'

Rails プロジェクト作成

上記ファイルが作成できたら、Rails のプロジェクトを作成します。

docker run web rails new . --skip-active-record --force

Mongodb を使うためアクティブレコードは使用しません。
コマンドを実行すると、見慣れた Rails のファイル群が作成されるので、完了後 Gemfile に下記内容を追加します。

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 で記述した内容と合わせます。
※コメントアウトされている内容は省略しています。
実はこの内容だけだとエラーが発生してしまうのですが、その点は後述します。

mongoid.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 の公式ドキュメントのチュートリアルに則っています。
https://www.mongodb.com/docs/mongoid/current/tutorials/getting-started-rails7/
Post モデル追加

docker exec -it rails-mongodb-sample-web-1 rails g scaffold Post title:string body:text

※コンテナ名はご自身の環境に合わせて変更してください。

scaffold コマンドを使ってルーターとコントローラーとビューを一度に生成します。
なおこの時点で下記 URL にアクセスするとエラーが発生しました。

URL
/localhost:3000/posts

エラー内容

error
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 に下記の内容を追記しました。

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