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データベースを使用するためのpg
gem を追加します。
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は最適なので不明点はしっかり復習し抑えておきましょう!