Web開発

DockerでRailsローカル開発環境を爆速構築

更新日:

こんにちは、ケースケ(@keisuke555_eng)です!

フリーランスのWebエンジニアとして活動しています。

今回は、「Dockerで爆速構築」シリーズの第3弾としてRails開発環境をローカルに構築する手順をご紹介します。

ちなみに過去のシリーズはこちら↓

前置きはこのくらいにして、さっそく手順を見ていきましょう!

DockerでRails環境を構築する手順

ローカルにRails開発環境を構築する手順は以下のとおりです。

  1. ディレクトリ作成
  2. Dockerfile作成
  3. Gemfile作成
  4. Gemfile.lock作成
  5. docker-compose.yml作成
  6. Railsプロジェクト作成
  7. Gemfile修正
  8. 修正したGemfileで再ビルド
  9. データベース接続情報を修正
  10. dockerコンテナ起動
  11. rakeコマンドでDB作成
  12. 動作確認

今回も基本的な手順については、Docker-docs-jaのックスタート: Compose と Railsを参考にしています。

ただ、上記手順だけだとコンテナを終了した際にDBデータを保持できなかったり、ソースファイルをホストPC⇄仮想環境でバインド(共有)できていなかったりするようです。

そこで今回は、その辺を修正して開発を進める上で最低限困らないようにしてみました。

手順1:ディレクトリ作成

まずは今回のプロジェクト用に、空のディレクトリ(フォルダ)を作成してください。

僕は今回「rails」というディレクトリを作成しました。

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'
railsの5系をインストールします

手順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
upコマンドを実行します

手順11:rakeコマンドでDB作成

この時点ではDBはからっぽなので、このままだとDB接続時にエラーとなってしまいます

以下のコマンドで必要なDBを作成します。

docker-compose run web rake db:create
DBを作成します

以上で初期設定は完了です!

続いて動作確認してみましょう。

手順12:動作確認

ブラウザを起動してlocalhost:3000でアクセスしてみます。

見事にスタートページが出た!

無事、Railsのスタートページが表示されました!

環境構築完了です!

ちなみにDBeaverを使用してデータベースにアクセスしてみると…

ちゃんと繋がりました

ちゃんとDBが作成されていることが確認できます。

DBeaverのインストール&使用方法については以下の記事をご覧ください。

おまけ:Railsのscaffold機能を使ってユーザー管理機能を追加してみる

Railsに備わっているscaffoldという機能を使うと、コマンド実行だけで簡易的な機能を追加するためのプログラム(画面の見た目、内部の処理、必要なソースファイル)を自動生成してくれるみたいです!

コレはめっちゃ便利!使ってみましょう。

手順はこんな感じ↓

  1. Railsプロジェクトに機能追加するscaffoldコマンドを実行
  2. DBに追加機能分のテーブルを追加するmigrateコマンドを実行
  3. 動作確認

おまけ手順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
必要なテーブルをDBに追加

おまけ手順3:動作確認

ブラウザを起動してlocalhost:3000/usersでアクセスしてみます。

かなりシンプルなページですw

簡易的なユーザー管理機能のページが表示できました!

この機能では、ユーザーの新規追加、名前の変更、削除などが行えます。

DBeaverでデータベースをのぞいてみると…

usersテーブルが確認できました!

ちゃんとテーブルも作成されていますね!

ぜひご自身の環境で試してみてください。

まとめ

Dockerを使用してRailsのローカル開発環境を構築できました!

まだあまりDockerを使ったことがない方は、この機会に少し勉強してみることをオススメします。

面倒な環境構築なんてサクッと終わらせて、本題のアプリケーション作成にめいっぱい時間を使っていきましょう!

次はPHP環境の構築について実践、解説してみようかと思います。

それでは、また。

-Web開発
-, , , , ,

Copyright© みちのくBASE , 2021 All Rights Reserved