Ruby on Railsの勉強をするにあたりrenv等を使用しローカルに作るのではなく、Docker上でRubyの開発をしたい、、ということでDockerを使用してRuby+MariaDBの環境構築を行いました。
Rubyのバージョン確認
作成するにあたりRubyのバージョンを確認します。
以下のURLから探しましょう。
RubyのDockerイメージを見るとこの記事を書いた時点(2020/11/02)では2.7.2が使えそうなのでそちらを使用していきます。
Ruby on Railsの環境構築について
探していたところ以下のURLにQuickStartがあったのでそちらを参考に構築していきます。

環境構築
ファイル作成
まずは適当なフォルダを作りDockerやRuby on Railsに必要なファイルを作成していきます。
作成するファイルは以下の5つです。
- Dockerfile
- docker-compose.yml
- Gemfile
- Gemfile.lock
- entrypoint.sh
とりあえず全て空ファイルで作成します。

次に、それぞれのファイルの役割の確認と内容を記述していきます。
Dockerfile
コンテナを作成するためのベースとなるDockerイメージおよびそのベースイメージに対するタスクを記述したファイルです。
今回はRuby 2.7.2をベースに必要になるパッケージなどをインストールしていきます。
そいて後述のentrypoint.shをエントリーポイントとして起動します。
FROM ruby:2.7.2
RUN apt-get update -qq && apt-get install -y nodejs default-libmysqlclient-dev
# yarnのバージョンでエラーが出る対策
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update && apt-get install yarn
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp
# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]
docker-compose.yml
複数のコンテナをまとめて記述することができ、システム(コンテナ郡)を簡単に構築することができます。
今回は先ほど出てきたDockerfileを元にするwebサービスとMariaDbのdbサービスの二つを起動します。
version: '3'
services:
db:
image: mariadb:10.4.14
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=sample
- MYSQL_USER=user
- MYSQL_PASSWORD=password
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
Gemfile
gemを管理するファイルです。
初期状態ではRuby on Railsの6がインストールされるようになっています。
(このフォルダにインストールされるため、このGemfile自体はRailsのインストールで書き換わります。)
source 'https://rubygems.org'
gem 'rails', '~>6'
Gemfile.lock
gemをインストールした際のバージョンを固定するためのファイルです。
例えばGemfileで6以上となっていた場合に6.0も6.1も対象になるのですが、このGemfile.lockで6.1と固定されていれば、gemをインストールした際には6.1がインストールされるようになります。
今回は、初期状態では固定する必要がないので空ファイルのままで問題ありません。
entrypoint.sh
サーバを起動するためのシェルスクリプトです。
Dockerfileから受け取ったコマンドを実行します。(今回の場合はCMD [“rails”, “server”, “-b”, “0.0.0.0”]→$@となる)
#!/bin/bash
set -e
# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid
# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
Ruby on Railsプロジェクトの作成
ファイルの作成が完了次第、Ruby on Railsのプロジェクトを作成していきます。
ターミナル等で以下コマンドを実行していきます。
docker-compose run --no-deps web rails new . --force --database=mysql
完了するとRuby on Railsプロジェクトのファイルがたくさん作成されます。

Dockerイメージの再ビルド
Gemfileが書き換わっているので、Dcokerを再ビルドします。
(別途コマンド叩くでもいける気がしますが、手順書通りに。。)
docker-compose build
DB接続情報の修正
config/database.ymlを書き換えます。
書き換え箇所としては、とりあえずdefaultのusernameとpassword、hostを変更します。
また、develop、testデータベース名もとりあえず修正しておきます。
(必要であればproductionも変更してください。また、必要に応じてrootではなくuserを使用してください。)
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: root
host: db
development:
<<: *default
database: sample_development
test:
<<: *default
database: sample_test
webpackerインストール
Ruby on Railsの6からwebpackerが必要らしいのでインストールします。
以下のコマンドを実行します。
docker-compose run web bundle exec rails webpacker:install
Dockerイメージ起動
ここまでで準備は完了なのでDockerを立ち上げます。
以下のコマンドで立ち上げることができます。
docker-compose up
DB作成
Dockerイメージ作成時にsampleデータベースは作成されているはずですが、テストのデータベースはないので、Railsから作成します。
docker-compose run web rake db:create
これで環境構築は完了です。
動作確認
「http://localhost:3000」にアクセスをして問題なくRuby on Railsの起動画面が表示されていれば完了です。

これで思う存分Rubyを勉強できます。
コメント