既存のrailsアプリをdocker化する方法

はじめに

今回はDockerとdocker-composeについて学習したので既存のrailsアプリをdocker化する方法についてまとめます。
前提としてDocker、docker-composeはインストール済みとして進めていきます。

docker化までの流れ

以下の流れでdocker化を行います。

  • Dockerfile、docker-compose.ymlファイルを作成&編集
  • database.ymlファイルの編集
  • コンテナの立ち上げ&起動
  • アクセスできるかを確認

Dockerfile、docker-compose.ymlファイルを作成&編集

railsのプロジェクト直下にDockerfile、docker-compose.ymlファイルを作成します。

ファイル構成

Dockerfileに対し以下のように記述を行います。

FROM ruby:3.2.2
RUN  apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /rails_docker
WORKDIR /rails_docker
ADD Gemfile /rails_docker/
ADD Gemfile.lock /rails_docker/
RUN bundle install
ADD . /rails_docker

docker-compose.ymlに対し以下のように記述します。

version: '3'

volumes:
  db-data:

services:
  db:
    image: postgres:12
    environment:
      POSTGRES_PASSWORD: password
    volumes:
      - 'db-data:/var/lib/postgresql/data'

  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/rails_docker
    ports:
      - "3000:3000"
    depends_on:
      - db

docker-compose.ymlについて復習も兼ねて記載内容を解説します。

volumes:
  db-data:

db-dataという名前のボリュームを定義しています。
通常コンテナを破棄した際にコンテナで作成したデータは破棄されますがボリュームを設定することにより、ホスト側にデータを保存することができます。
定義したボリュームを他のコンテナからも参照することによりテストデータなどの共有を行うことができます。

services:
  db:
    image: postgres:12
    environment:
      POSTGRES_PASSWORD: password
    volumes:
      - 'db-data:/var/lib/postgresql/data'

services:でdbというサービス名を定義しています。
image:でビルドするイメージを指定しています。
environment:でコンテナに定義する環境変数を定義しています。
volumes:ボリューム:マウントするディレクトリの記法でフォルダをマウントしています。

  web:
    build: .
    command: >
      sh -c '
      rails db:create &&
      rails db:migrate &&
      bundle exec rails s -p 3000 -b '0.0.0.0'
      '
    volumes:
      - .:/rails_docker
    ports:
      - "3000:3000"
    depends_on:
      - db

build: .でホスト側に配置されたDockerfileをイメージに指定することができます。(.でカレントディレクトリのDockerfileが指定されています。)
command:でコンテナの環境で記載したコマンドを実行することができます。 (ポート番号3000番でローカルホストのブラウザに表示します。)

volumes:
  - .:/rails_docker

ボリュームが指定されていませんがこれはバインドマウントと言います。
ホスト側のカレントディレクトリとコンテナ側のrails_dockerディレクトリをマウントしています。
これによりコンテナ側のソースコードの変更などをホスト側でも確認することができます。

depends_on:
  - db

サービスの依存関係を表しており、dbを起動してからwebを起動することを表しています。

database.ymlファイルの編集

rails_docker/config/database.ymlに対し以下のように編集します。

default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

変更点は以下の通りです。

  • db:の追加
  • username:の追加
  • password:の追加

コンテナの立ち上げ&起動

以上の手順で準備ができたのでコンテナの立ち上げ&起動 を行います。

#イメージしてコンテナの立ち上げ&起動
docker-compose up -d --build

#初回のみDBを作成する。
docker-compose run web rails db:migrate

#初回&DB定義変更時にmigrate実行
docker-compose run web rails db:migrate

アクセスできるかを確認

http://localhost:3000/にアクセスしてアプリ画面が確認できれば完了です。

おわりに

以上既存のrailsアプリをdocker化する方法でした。
Dockerを使用することにより環境構築が楽になることを実感できました。 ご閲覧いただきありがとうございました。