今回はPostgreSQL+RailsのサンプルアプリケーションをDocker環境で動かすまでの手順についてまとめました。この記事では2022年1月6日現在の最新バージョンである、Ruby3.1.0/Rails7.0.1で構築作業を進めていきます。
MySQLでの環境構築方法は以下の記事を参考にしてください。

始めに
この記事の手順は以下のDockerクイックスタートガイドを参考に進めています。
↓ ↓ ↓
ゴール
Railsのデモ画面を表示することを今回の実装のゴールに設定します。

構築手順
Docker Desktop for Macのインストール
Dockerの環境構築としてDocker Desktop for Macをインストールする必要があります。以下の記事を元にインストールを進めましょう。

開発フォルダの作成
まずはRailsアプリケーションとDockerの設定ファイルを格納するディレクトリを作成します。今回はDesktop配下にdocker_demoというディレクトリを作成していますが、ディレクトリの配置場所やディレクトリ名は適宜変更してください。
~ % cd Desktop
Desktop % mkdir docker_demo
Dockerfileの作成
続いて、アプリケーションをビルドするために必要なDockerfileを作成します。
Desktop % cd docker_demo
docker_demo % touch Dockerfile
Dockerfileはアプリケーションのビルドに必要な設定が書かれたファイルです。ざっくり言うと、アプリケーションを動作させるサーバーなどの情報が記載されたファイルになります。
先ほど作成したDockerfileに以下の記述を追加します。今回はRuby3.1.0を使用するため、冒頭にFROM ruby:3.1.0
を記載します。
FROM ruby:3.1.0
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
WORKDIR /docker_demo
COPY Gemfile /docker_demo/Gemfile
COPY Gemfile.lock /docker_demo/Gemfile.lock
RUN bundle install
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0"]
・FROM ruby:3.1.0
Ruby3.1.0のイメージを指定
・RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
Railsアプリケーションに必要なNode.jsとPostgreSQLのインストール
・WORKDIR /docker_demo
作業ディレクトリ(今回はdocker_demoを指定)
・COPY Gemfile /docker_demo/Gemfile
ローカルのGemfileをdocker_demo配下にコピー
・COPY Gemfile.lock /docker_demo/Gemfile.lock
ローカルのGemfile.lockをdocker_demo配下にコピー
・RUN bundle install
上記でコピーしたGemfileをbundle install
・COPY entrypoint.sh /usr/bin/
ローカルのentrypount.shを/usr/bin配下にコピー
・RUN chmod +x /usr/bin/entrypoint.sh
実行権限をの付与
・ENTRYPOINT ["entrypoint.sh"]
最初の実行コマンド(今回はentrypoint.shを実行)
・EXPOSE 3000
port番号
・CMD ["rails", "server", "-b", "0.0.0.0"]
Railsの実行
Gemfileの作成
次にRailsの読み込み専用Gemfileを作成します。
今回はRails7.0.1のアプリケーションを使用するため、作成したGemfileにはgem 'rails', '7.1.0'
を記載します。
docker_demo % touch Gemfile
# Gemfile
source 'https://rubygems.org'
gem "rails", '7.0.1'
2021年12月15日にリリースされたRails7.0.0ではRuby3.1.0に対応しておらず、% rails new
の段階でエラーが吐き出されてしまいます。2022年1月6日にリリースされたRails7.0.1(もしくはそれ以降のバージョン)を指定するようにしましょう。
Ruby3.1.0非対応: Rails 7.0: Fulfilling a vision
Ruby3.1.0対応: Rails 7.0.1 has been released
Gemfile.lockの作成
Dockerfileをビルドするため、空のGemfile.lockを作成します。
docker_demo % touch Gemfile.lock
entrypoint.shの作成
Rails特有の問題「既にserver.pidファイルが存在してしまうことで、サーバーを再起動できない問題」を解決するファイルであるentrypoint.sh
を作成します。
docker_demo % touch entrypoint.sh
作成したentrypoint.sh
に以下の記述を追加しましょう。このスクリプトはコンテナを起動する度に実行されます。
#!/bin/bash
set -e
# Remove a potentially pre-existing server.pid for Rails.
rm -f /docker_demo/tmp/pids/server.pid
# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
・set -e
エラーが吐かれた場合は処理を中止
・rm -f /docker_demo/tmp/pids/server.pid
既にserver.pidファイルが存在している場合は削除
・exec "$@"
DockerfileのCMDコマンド(今回はRailsを実行)
docker-compose.ymlの作成
次にアプリケーションを構成するサービス一覧を記載し、それらを一括で実行してくれるdocker-compose.yml
を作成します。
docker_demo % touch docker-compose.yml
作成したdocker-compose.yml
にdbとwebの2つを記載します。今回dbではPostgreSQLを指定します。
version: "3.9"
services:
db:
image: postgres
volumes:
- ./tmp/db:/var/lib/postgresql/data
environment:
POSTGRES_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:
- .:/docker_demo
ports:
- "3000:3000"
depends_on:
- db
・version: "3.9"
docker-composeのバージョン
・services:
services配下にコンテナを定義(今回はwebとdbのみ)
・image: postgres
利用するイメージの指定(今回はPostgreSQL)
・volumes:
データを永続的に保存する場所を指定(コンテナ削除時にデータも削除されてしまうことを防ぐことができる)
・environment:
PostgreSQLに関する環境変数の設定(今回はパスワードを設定)
・build: .
Dockerfileがあるディレクトリを指定
・command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
Railsサーバーの起動(既にserver.pidファイルが存在していた場合は削除)
・volumes:
データを永続的に保存する場所を指定
・ports:
ポート番号
・depends_on:
コンテナの実行順序の指定(今回はdb起動→web起動)
Railsアプリケーションの作成
ここでRailsの新規アプリケーションを作成します。
docker_demo % docker-compose run --no-deps web rails new . --force --database=postgresql
・--
force
Gemfileの上書き
・--
no-
deps
リンクされたコンテナを起動させない
・--
database=
postgresql
DBの指定(今回はPostgreSQL)
・--
skip-
bundle
bundle installのスキップ
ビルド実行
rails new
で作成した新規アプリケーションのGemfileを更新するため、ビルドを実行します。% docker-compose build
でビルドが実行されます。
% docker-compose build
database.ymlの編集
デフォルトではRailsはlocalhost上でDBが動作してしまうため、先ほど記述したDBコンテナを動作先に指定しましょう。config/database.yml
のdefault部分を以下のように編集します。
default: &default
adapter: postgresql
encoding: unicode
# For details on connection pooling, see Rails configuration guide
# https://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
↓ 以下に変更
default: &default
adapter: postgresql
encoding: unicode
host: db
username: postgres
password: password
pool: 5
DBの作成
以下のコマンドでDBを立ち上げます。
% docker-compose run web rails db:create
Creating docker_demo_web_run ... done
Created database 'docker_demo_development'
Created database 'docker_demo_test'
アプリケーションの起動
ここまででDockerの設定を一通り終了しました。後はdocker-copmpose up
でアプリケーションを立ち上げましょう。
% docker-compose up
動作確認
これでDocker環境下でRailsを動かす手順が完了しました。あとはhttp://localhost:3000/にアクセスし、以下のようなデモ画面が表示されれば成功です。

構築手順ざっくりまとめ
- Docker Desktop for Macのインストール
- 開発フォルダの作成
- Dockerfileの作成
- Gemfileの作成
- Gemfile.lockの作成
- entrypoint.shの作成
- docker-compose.ymlの作成
- Railsアプリケーションの作成
- ビルド実行
- database.ymlの編集
- DBの作成
- アプリケーションの起動
- 動作確認
参考
今回はRuby3.1.0/Rails7.0.1のサンプルアプリケーションをDocker環境で動かすまでの手順についてまとめました。基本的にはチュートリアル通りですので、ご自身でも試しに取り組んでみてはいかがでしょうか。