こんにちは、ケースケ(@keisuke555_eng)です!
フリーランスのWebエンジニアとして活動しています。
今回は、「Dockerで爆速構築」シリーズの第3弾としてRails開発環境をローカルに構築する手順をご紹介します。
ちなみに過去のシリーズはこちら↓
前置きはこのくらいにして、さっそく手順を見ていきましょう!
DockerでRails環境を構築する手順
ローカルにRails開発環境を構築する手順は以下のとおりです。
- ディレクトリ作成
- Dockerfile作成
- Gemfile作成
- Gemfile.lock作成
- docker-compose.yml作成
- Railsプロジェクト作成
- Gemfile修正
- 修正したGemfileで再ビルド
- データベース接続情報を修正
- dockerコンテナ起動
- rakeコマンドでDB作成
- 動作確認
今回も基本的な手順については、Docker-docs-jaのクイックスタート: Compose と Railsを参考にしています。
ただ、上記手順だけだとコンテナを終了した際にDBデータを保持できなかったり、ソースファイルをホストPC⇄仮想環境でバインド(共有)できていなかったりするようです。
そこで今回は、その辺を修正して開発を進める上で最低限困らないようにしてみました。
手順1:ディレクトリ作成
まずは今回のプロジェクト用に、空のディレクトリ(フォルダ)を作成してください。
僕は今回「rails」というディレクトリを作成しました。

手順2:Dockerfile作成
今回使用するイメージと、仮想環境で実行するコマンドを定義するDockerfileを作成します。
記述内容はこんな感じ↓
FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

手順3:Gemfile作成
インストールするRailsのバージョンを宣言するためにGemfileを作成します。
記述内容はこんな感じ↓
source 'https://rubygems.org'
gem 'rails', '5.0.0.1'

手順4:Gemfile.lock作成
Gemfileのロック状態を管理するためにGemfile.lockというファイルを作成します。
このファイルは中身の記述は不要なので、からっぽのファイルで構いません。

手順5:docker-compose.yml作成
docker-composeコマンドで参照する各サービスの設定内容を記述したdocker-compose.ymlを作成します。
記述内容はこんな感じ↓
version: '3'
services:
db:
image: postgres
ports:
- "5432:5432"
volumes:
- ./db_data:/var/lib/postgresql/data
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db

手順6:Railsプロジェクト作成
ターミナルを起動し、cdコマンドで対象ディレクトリに移動します。
続いて次のコマンドを実行して、Railsプロジェクトを作成します。
docker-compose run web rails new . --force --database=postgresql
実行すると、ターミナル上にずらっと文字が流れていき、必要なパッケージ等がインストールされます。

手順7:Gemfile修正
手順6のコマンド実行でGemfileが上書きされたので、Rails⇄PostgreSQLの接続に使用するpgのバージョンを修正します。
Gemfileを開き、以下の箇所を修正してください。
修正前↓
gem 'pg', '~> 0.18'
修正後↓
gem 'pg', '~> 0.20.0'

手順8:修正したGemfileで再ビルド
Gemfileの修正内容を反映するために、以下のコマンドを実行します。
docker-compose build

手順9:データベース接続情報を修正
自動生成されたdatabase.ymlというファイルの中身を修正します。
database.ymlはconfigフォルダに格納されているはずです。
default: &default
adapter: postgresql
encoding: unicode
上記の記述に続けて、以下の内容を追記してください。
host: db
username: postgres
password: postgres

手順10:dockerコンテナ起動
dockerコンテナを起動するコマンドを実行します。
docker-compose up -d

手順11:rakeコマンドでDB作成
この時点ではDBはからっぽなので、このままだとDB接続時にエラーとなってしまいます。
以下のコマンドで必要なDBを作成します。
docker-compose run web rake db:create

以上で初期設定は完了です!
続いて動作確認してみましょう。
手順12:動作確認
ブラウザを起動してlocalhost:3000
でアクセスしてみます。

無事、Railsのスタートページが表示されました!
環境構築完了です!
ちなみにDBeaverを使用してデータベースにアクセスしてみると…

ちゃんとDBが作成されていることが確認できます。
DBeaverのインストール&使用方法については以下の記事をご覧ください。
おまけ:Railsのscaffold機能を使ってユーザー管理機能を追加してみる
Railsに備わっているscaffoldという機能を使うと、コマンド実行だけで簡易的な機能を追加するためのプログラム(画面の見た目、内部の処理、必要なソースファイル)を自動生成してくれるみたいです!
コレはめっちゃ便利!使ってみましょう。
手順はこんな感じ↓
- Railsプロジェクトに機能追加するscaffoldコマンドを実行
- DBに追加機能分のテーブルを追加するmigrateコマンドを実行
- 動作確認
おまけ手順1:Railsプロジェクトに機能追加するscaffoldコマンドを実行
プロジェクトディレクトリで以下コマンドを実行します。
docker-compose run web bin/rails g scaffold User name:string

おまけ手順2:DBに追加機能分のテーブルを追加するmigrateコマンドを実行
追加機能に必要なテーブルをDBに追加するために、以下コマンドを実行します。
docker-compose run web bin/rake db:migrate

おまけ手順3:動作確認
ブラウザを起動してlocalhost:3000/users
でアクセスしてみます。

簡易的なユーザー管理機能のページが表示できました!
この機能では、ユーザーの新規追加、名前の変更、削除などが行えます。
DBeaverでデータベースをのぞいてみると…

ちゃんとテーブルも作成されていますね!
ぜひご自身の環境で試してみてください。
まとめ
Dockerを使用してRailsのローカル開発環境を構築できました!
まだあまりDockerを使ったことがない方は、この機会に少し勉強してみることをオススメします。
面倒な環境構築なんてサクッと終わらせて、本題のアプリケーション作成にめいっぱい時間を使っていきましょう!
次はPHP環境の構築について実践、解説してみようかと思います。
それでは、また。