アルアカ - Arcadia Academia

Arcadia Academiaは「エンジニアリングを楽しむ」を合言葉に日本のデジタル競争力を高めることをミッションとするテックコミュニティです。

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

Featured image of the post

今回はDockerでRails環境を構築する手順を解説します。

前提条件

  • Rails 7
  • Ruby latest(最新版)
  • PostgreSQL latest(最新版)

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/GemfileCOPY Gemfile.lock /myapp/Gemfile.lock: ホストマシンの GemfileGemfile.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 の作成
version: '3'
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. GemfileGemfile.lock の作成
touch Gemfile
touch Gemfile.lock

# Gemfile

source 'https://rubygems.org'
gem "rails", "~> 7.0.8", ">= 7.0.8.4"

解説:

  • touch GemfileGemfile を作成します。
  • 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: postgrespassword: 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: すべてのサービス(webdb)を起動します。これにより、Railsアプリケーションがポート3000で起動します。

これで、ブラウザで http://localhost:3000 にアクセスして、Railsのウェルカムページが表示されることを確認してください。これらの手順を実行することで、Dockerを使用してRails 7と最新のRuby、PostgreSQLを含む開発環境が構築されます。

11.不要なコンテナを削除

docker-compose updocker-compose run コマンドを繰り返し実行すると、同じ名前のサービスコンテナが複数作成されることがあります。これらのコンテナは、使用していない限り削除して問題ないので削除します。

まとめ

Webサーバ上で動くアプリケーション、いわゆるクライアントとホストの概念を理解するのにDockerは最適なので不明点はしっかり復習し抑えておきましょう。

Icon in a callout block
プロジェクトの要件によってはVMwereなどを使う場合もあるけれど、DockerはWebアプリケーションの開発環境構築では、ほぼデファクトスタンダートなので、いろんな環境を自分で構築し理解を深めよう!


▼ 目次