Docker ComposeでRailsアプリをDocker化する方法

はじめに

Docker Composeを使ってRailsアプリをコンテナ化する方法を解説します。


How to
コンテナ化したいプロジェクトを用意する

コンテナ化したいプロジェクトをGitHubからローカルにクローンします。

$ git clone <リポジトリのパス>


Dockerfileを用意する

Rails用のDockerfileを作成します。

FROM ruby:3.2.2
RUN apt-get update && apt-get install -y \
    build-essential \
    libpq-dev \
    nodejs \
    postgresql-client \
    yarn

WORKDIR /rails-docker
COPY Gemfile Gemfile.lock /rails-docker
RUN bundle install


FROM: ベースとなるrubyのイメージを取ってきます。

FROM ruby:3.2.2

RUN: 必要なパッケージをインストールします。

RUN apt-get update && apt-get install -y \
    packages \

WORKDIR: 指定したフォルダに移動します。なければ、フォルダを作成し、そこに移動します。

WORKDIR /rails-docker

COPY: ファイルをコンテナにコピーします。

COPY Gemfile Gemfile.lock /rails-docker

RUN: コピーしたGemfileを元にrailsに必要なパッケージ(gem)をインストールする。

RUN bundle install


docker-compose.ymlを用意する

次にdocker-compose.ymlを作成します。

# docker-composeのversionを指定
version: '3'

# db-dataというvolumeを作成
volumes:
  db-data:

# ここから下にserviceを定義
services:
  # webというserviceを定義
  web:
    # docker buildと同じ。カレントディレクトリを指定
    build: .
    # サービスコンテナが起動したときに実行するコマンドを指定
    # ">" -> 折り返して表示。 "-c" -> 複数コマンドを実行
    command: >
      bash -c "rails db:create &&
              rails db:migrate &&
              rails s -b 0.0.0.0"
    # docker run -pと同じ。portを指定
    ports:
      - '3000:3000'
    # docker run -vと同じ。マウント先を指定
    volumes:
      - '.:/rails-docker'
    # コンテナ側に環境変数を設定
    environment:
      - 'DATABASE_PASSWORD=postgres'
    # docker run -itと同じ
    tty: true
    stdin_open: true
    # db serviseを作成後、docker runする
    depends_on:
      - db
    # web serviceからdb serviceにアクセスできる
    links:
      - db

  # dbというserviceを定義
  db:
    # imageを取得する
    image: postgres:12
    # マウント先を指定
    volumes:
      - 'db-data:/var/lib/postgresql/data'
    # パスワードを設定
    environment:
      - 'POSTGRES_PASSWORD=postgres'


databese.ymlを編集する

railsのconfig/database.ymlを編集します。

default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  user: postgres
  port: 5432
  password: <%= ENV.fetch("DATABASE_PASSWORD") %>
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>


コンテナを起動する

コンテナを起動させます。
-d(detach)でコンテナがバックグラウンドで起動します。

docker-compose up -d

最後にブラウザからlocalhost:3000にアクセスしてrailsアプリが起動しているか確認しましょう。