Dockerを使うことで、Ruby on Railsの開発環境を簡単に構築し、環境の違いによる問題を解決できます。本記事では、Dockerを使ってRailsの開発環境を構築する方法を詳しく解説します!
Dockerについて基礎的な知識があること
構築する環境
- Rails 7
- Ruby latest(最新版)
- PostgreSQL latest(最新版)
Dockerについておさらいしたい人は以下の記事を参照してください。
[目次を開く]
1. プロジェクトディレクトリの作成
mkdir myapp
cd myapp 解説:
-
mkdir myapp: 新しいディレクトリmyappを作成します。これは、Railsプロジェクトを含むディレクトリです。 -
cd myapp:myappディレクトリに移動します。以降の操作はすべてこのディレクトリ内で行います。
2. Dockerfile の作成
# Dockerfile
FROM ruby:latest
# 必要なパッケージをインストール
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
# 作業ディレクトリの作成と設定
RUN mkdir /myapp
WORKDIR /myapp
# GemfileとGemfile.lockをコピーして依存関係をインストール
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN gem install bundler && bundle install
# アプリケーションのソースコードをコピー
COPY . /myapp
# ポートの公開
EXPOSE 3000
# サーバーの起動コマンド
CMD ["rails", "server", "-b", "0.0.0.0"] 解説:
-
FROM ruby:latest: Rubyの最新バージョンのDockerイメージをベースとして使用します。 -
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client: Node.js(RailsのJavaScriptランタイムとして必要)とPostgreSQLクライアントをインストールします。これにより、RailsアプリケーションがJavaScriptを処理でき、PostgreSQLデータベースに接続できるようになります。 -
RUN mkdir /myapp:/myappディレクトリを作成します。これはアプリケーションのルートディレクトリとして使用されます。 -
WORKDIR /myapp: 作業ディレクトリを/myappに設定します。以降のコマンドはこのディレクトリ内で実行されます。 -
COPY Gemfile /myapp/GemfileとCOPY Gemfile.lock /myapp/Gemfile.lock: ホストマシンのGemfileとGemfile.lockをコンテナ内の/myappディレクトリにコピーします。 -
RUN gem install bundler && bundle install: Bundlerをインストールし、Gemfileに記載されているGemをインストールします。 -
COPY . /myapp: ホストマシンのカレントディレクトリ(すべてのアプリケーションファイル)をコンテナ内の/myappディレクトリにコピーします。 -
EXPOSE 3000: Dockerコンテナが外部に公開するポートを指定します。Railsサーバーはデフォルトでポート3000を使用します。 -
CMD ["rails", "server", "-b", "0.0.0.0"]: コンテナが起動したときに実行するコマンドを指定します。ここでは、Railsサーバーを起動しています。
3. docker-compose.yml の作成
services:
db:
image: postgres:latest
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: myapp_development
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -b '0.0.0.0'"
volumes:
- ".:/myapp"
ports:
- "3000:3000"
depends_on:
- db
volumes:
pgdata:
解説:
-
version: '3': Docker Composeファイルのバージョンを指定します。 -
services: Docker Composeで管理するサービスを定義します。-
db: PostgreSQLデータベースサービスを定義します。-
image: postgres:latest: 最新のPostgreSQL Dockerイメージを使用します。 -
environment: 環境変数を設定します。これにより、PostgreSQLのユーザー、パスワード、データベース名を指定します。 -
ports: ホストのポート5432をコンテナのポート5432にマッピングします。
-
-
web: Railsアプリケーションサービスを定義します。-
build: .: カレントディレクトリにあるDockerfileを使用してイメージをビルドします。 -
command: コンテナ起動時に実行するコマンドを指定します。tmp/pids/server.pidを削除してからRailsサーバーを起動します。 -
volumes: ホストのカレントディレクトリをコンテナ内の/myappにマウントします。これにより、ホスト側の変更がコンテナに反映されます。 -
ports: ホストのポート3000をコンテナのポート3000にマッピングします。 -
depends_on:dbサービスが起動してからwebサービスを起動するようにします。 -
environment:DATABASE_URL環境変数を設定します。これにより、RailsアプリケーションがPostgreSQLデータベースに接続できます。
-
-
※既にポートが埋まっているなどのエラーが表示される場合はホストのポートを3001などに変更してみてください。
4. Gemfile と Gemfile.lock の作成
touch Gemfile
touch Gemfile.lock
# Gemfile
source 'https://rubygems.org'
gem "rails", "~> 7.0.8", ">= 7.0.8.4"
解説:
-
touch GemfileでGemfileを作成します。 -
touch Gemfile.lock: 空のGemfile.lockファイルを作成します。Gemfile.lockは、bundle installコマンドによって生成される依存関係のロックファイルです。
5. Rails アプリケーションの初期化
docker-compose run web rails new . --force --no-deps --database=postgresql 解説:
-
docker-compose run web:webサービスを一時的に起動します。 -
rails new . --force --no-deps --database=postgresql: 新しいRailsアプリケーションを現在のディレクトリに作成します。-forceは既存のファイルを上書きし、-no-depsは依存関係をインストールしないオプションです。-database=postgresqlはデータベースにPostgreSQLを使用することを指定します。
6. Gemfile の修正
Gemfile を再度開き、rails の行の上に以下の行を追加します。
gem 'pg', '~> 1.1' 解説:
-
gem 'pg', '~> 1.1': PostgreSQLデータベースを使用するためのpggem を追加します。
7. データベース設定ファイルの修正
config/database.yml ファイルを修正して、PostgreSQLの設定を行います。
# config/database.yml
default: &default
adapter: postgresql
encoding: unicode
pool: 5
username: postgres
password: password
host: db
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
production:
<<: *default
database: myapp_production
username: myapp
password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %> 解説:
-
adapter: postgresql: PostgreSQLを使用することを指定します。 -
encoding: unicode: データベースのエンコーディングを指定します。 -
pool: 5: データベース接続のプールサイズを指定します。 -
username: postgresとpassword: password: データベースに接続するための認証情報を指定します。 -
host: db: Docker Composeで定義されたデータベースサービスのホスト名を指定します。 -
development,test,production: 各環境に対応するデータベース設定を定義します。
8. 依存関係のインストール
docker-compose build
docker-compose run web bundle install 解説:
-
docker-compose build: Dockerイメージをビルドします。 -
docker-compose run web bundle install: 一時的にwebサービスを起動し、bundle installコマンドを実行してすべての依存関係をインストールします。
9. データベースの作成とマイグレーション
docker-compose run web rails db:create
docker-compose run web rails db:migrate
解説:
-
rails db:create: データベースを作成します。 -
rails db:migrate: データベースのマイグレーションを実行します。これにより、データベースのスキーマが最新の状態になります。
10. アプリケーションの起動
docker-compose up -d 解説:
docker-compose up: すべてのサービス(web と db)を起動します。これにより、Railsアプリケーションがポート3000で起動します。
これで、ブラウザで http://localhost:3000 にアクセスして、Railsのウェルカムページが表示されることを確認してください。これらの手順を実行することで、Dockerを使用してRails 7と最新のRuby、PostgreSQLを含む開発環境が構築されます。
11.不要なコンテナを削除
docker-compose up や docker-compose run コマンドを繰り返し実行すると、同じ名前のサービスコンテナが複数作成されることがあります。これらのコンテナは、使用していない限り削除して問題ないので削除します。
まとめ
Webサーバ上で動くアプリケーション、いわゆるクライアントとホストの概念を理解するのにDockerは最適なので不明点はしっかり復習し抑えておきましょう!


