8tako8tako8’s blog

ソフトウェアエンジニア

RailsアプリをDocker化してみた

はじめに

この記事では、Dockerfiledocker-compose.ymlを作成することで、既存のRailsアプリをDocker化する方法を紹介します。

前提条件

  • Docker Desktopがインストールされていること
  • 対象となる既存のRailsアプリが存在すること
  • DBはPostgreSQLを使用すること

Dockerfileの作成

RailsアプリのルートディレクトリにDockerfileを作成し、下記の内容を記述します。

FROM node:16 as build-stage

FROM ruby:3.0.2

# Install Node.js and Yarn
RUN mkdir -p /opt
COPY --from=build-stage /opt/yarn-* /opt/yarn
COPY --from=build-stage /usr/local/bin/node /usr/local/bin/
COPY --from=build-stage /usr/local/lib/node_modules/ /usr/local/lib/node_modules/
RUN ln -s /opt/yarn/bin/yarn /usr/local/bin/yarn \
  && ln -s /opt/yarn/bin/yarn /usr/local/bin/yarnpkg \
  && ln -s /usr/local/bin/node /usr/local/bin/nodejs \
  && ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm \
  && ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npx

# Setup Rails App
RUN apt-get update -qq && apt-get install -y \
  build-essential \
  libpq-dev
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

イメージ軽量化のためマルチステージビルドしていますが、ここでは紹介しないので下記を参考にしてください。

docker-compose.ymlの作成

Railsアプリのルートディレクトリにdocker-compose.ymlファイルを作成し、以下の内容を記述します。

version: "3"
services:
  db:
    image: postgres:12
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres
    volumes:
      - db_data:/var/lib/postgresql/data

  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
    stdin_open: true
    tty: true
    environment:
      DB_HOST: db
      DB_NAME: myapp
      DB_USER: postgres
      DB_PASSWARD: postgres

volumes:
  db_data:

config/database.ymlの編集

Railsアプリのconfig/database.ymlファイルを編集して、PostgreSQLを使用するように設定します。

default: &default
  adapter: postgresql
  host: <%= ENV['DB_HOST'] %>
  database: <%= ENV['DB_NAME'] %>
  username: <%= ENV['DB_USER'] %>
  password: <%= ENV['DB_PASSWARD'] %>
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: myapp_dev

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myapp_prd

動作確認

下記のコマンドで、Dockerコンテナを起動します。

docker-compose build
docker-compose up

次に、データベースの作成です。

docker-compose run web rake db:create

コンテナ内でマイグレーションする。

docker-compose exec web bash
> rails db:migrate

http://localhost:3000/にアクセスして、アプリケーションが正常に動作していることを確認できれば完了です!

まとめ

この記事では、RailsアプリをDockerコンテナで実行するための基本的な設定を行いました。非DockerなものをDocker化するのは骨が折れると思いますが、Docker環境での開発のメリットは大きいので移行しておくいいかと思います!

P.S. 本番環境をEC2→ECSに移行するのは結構大変そう...