Docker+Railsで環境構築する

こんにちは、おくやんです。

このブログでは、開発に役立つノウハウを実践的なコード例と共に紹介しています。

Dockerを使ったRailsアプリケーションを作りたいけど、どのように始めればいいかわからない。。。

今回は、このようなお悩みを解決します。

本記事の内容

Docker+Railsの開発環境を構築する流れを解説
Docker環境の構築手順
Railsアプリケーションを作成手順

今回はDocker上でRailsアプリケーションの開発環境を構築する手順についてまとめました。

Railsアプリケーションの開発環境をDocker上で構築することで、同じ環境をどこにでも簡単に再現することができるようになります。

設定例も載せていますので、実際に動かしながら確認してみてください。

開発環境を構築する流れ

まずは環境構築を行う流れについて説明します。

流れは下記となります。

環境構築の流れ

1. Docker環境の構築
2. Railsアプリケーションの作成

はじめにDocker環境の構築を行い、DBサーバやAPサーバが起動できるようにしましょう。

その後、Railsコマンドを利用し、新規アプリケーションの作成を行っていきます。

それではDocker環境の構築からはじめていきましょう。

Docker環境の構築を行う

Dockerを起動するのに必要なファイルの作成行っていきます。

今回、環境構築を行うシステムの環境については以下です。

システム環境

ホストOS Windows 10
Docker for Windows 4.19.0
Docker 23.0.5
Docker Compose v2.17.3
DBサーバ Image postgres:15.3-alpine3.18
APサーバ Image ruby:3.1.2-alpine3.15
おくやん
Windows環境でのDockerセットアップ手順に関しては、【Windows】Dockerのインストール方法を解説で詳しく解説しています。

まずはDockerfileの作成を行いましょう。

Dockerfileの作成

作業フォルダを作成し、配下にDockerfileを作成します。

mkdir app
cd app/
vi Dockerfile

下記の内容でファイルを作成しましょう。

Dockerfile

FROM ruby:3.1.2-alpine3.15

ENV LANG="ja_JP.UTF-8"
ENV APP_HOME="/app"

WORKDIR $APP_HOME

RUN apk update \
 && apk upgrade \
 && apk --update add \
      g++ \
      make \
      tzdata \
      postgresql-dev \
      libstdc++ \
      libressl \
      libc6-compat \
      libxml2-dev \
      libxslt-dev \
      zlib-dev \
      yaml \
      yaml-dev \
      openssh \
      ruby-json \
      nodejs \
      yarn \
      vim \
      git \
      bash \
 && cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
 && rm -rf /var/cache/apk/*
RUN gem update --system \
 && gem install bundler --no-document

EXPOSE 3000

軽量なAlpineをベースに、Railsに必要なパッケージをインストールしています。

Dockerfileの内容は下記記事で詳しく説明していますので、参照ください。

>> 【初心者向け】Dockerfileの作り方

続いてdocker-compose.ymlを作っていきましょう。

docker-compose.ymlの作成

docker-compose.ymlを作っていきます。

Dockerfileを作成したフォルダと同じ階層にファイルを作成してください。

docker-compose.yml

version: '3.8'
services:
  db:
    image: postgres:15.3-alpine3.18
    environment:
      - TZ=Asia/Tokyo
    volumes:
      - db-data:/var/lib/postgresql/data
    ports:
      - 5432:5432
    env_file:
      - .env

  web:
    build:
      context: .
    environment:
      - TZ=Asia/Tokyo
      - BUNDLE_APP_CONFIG=/app/.bundle
    env_file:
      - .env
    ports:
      - 3000:3000
    volumes:
      - .:/app
      - bundle-data:/usr/local/bundle
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -b 0.0.0.0 -p 3000 -e development"
    stdin_open: true
    tty: true
    depends_on:
      - db

volumes:
  db-data:
    driver: local
  bundle-data:
    driver: local

今回はPostgreSQLを利用したDBサーバと、Dockerfileをもとにイメージ作成したAPサーバを起動する設定としています。

docker-compose.ymlの内容について、詳しく知りたい方は下記記事を見てください。

>> 【初心者向け】docker-compose.ymlの書き方を調べてみた

次に環境変数の設定ファイルを作ります。

環境変数定義ファイルの作成

Docker内部で利用する環境変数の定義ファイルを作成していきましょう。

環境変数の定義ファイルも、Dockerfileと同階層に作成します。

.env

# DB
POSTGRES_USER=okuyan
POSTGRES_PASSWORD=okuyan_password

DBのユーザ名パスワードを設定します。

設定値は各自の環境に合わせて変更してください。

最後にbuildコマンドを実行しましょう。

buildの実行

Dockerfileをもとにイメージを作成します。

下記コマンドを実行してください。

docker-compose build

これでDocker環境の準備は完了となります。

次はRailsアプリケーションの作成を行っていきましょう。

Railsアプリケーションを作成する

RubyやRailsのコマンドを利用して、アプリケーションの起動に必要なファイルを作成していきます。

Gemfileの作成

最初はGemfileを作成です。

下記内容のファイルを作成しましょう。

Gemfile

source "https://rubygems.org"
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby "3.1.2"

# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main"
gem "rails", ">= 7.0.3.1"

続いてRailsコマンドで新規アプリケーションの作成を行います。

新規プロジェクトの作成

rails newコマンドを実行し、新規プロジェクトの作成を行いましょう。

早速実行していきます。

docker-compose run --rm web bundle exec rails new . --database=postgresql

コマンドを実行するとGemfileを上書きするか確認されますので、上書きしましょう。

処理が完了すると、コマンド実行したフォルダ直下に必要なファイルが生成されます。

それでは、生成されたファイルを環境に合わせて修正していきましょう。

DBの設定ファイルの修正

config/database.yml配下に作成された、DBの設定ファイルを修正していきます。

必要な情報は.evnに定義しているので、環境変数から読み取るように設定していきます。

config/database.yml

default: &default
  adapter: postgresql
  encoding: utf8
  template: template0
  collation: ja_JP.utf8
  ctype: ja_JP.utf8
  pool: <%= ENV.fetch('RAILS_MAX_THREADS') { 5 } %>
  username: <%= ENV.fetch('POSTGRES_USER') { 'postgres' } %>
  password: <%= ENV.fetch('POSTGRES_PASSWORD') { 'postgrespassword' } %>
  host: <%= ENV.fetch('DB_HOST') { 'db' } %>
  port: <%= ENV.fetch('DB_PORT') { 5432 } %>

development:
  <<: *default
  database: db_development

test:
  <<: *default
  database: db_test

production:
  <<: *default
  database: db_production

環境変数が未設定の場合を想定し、fetchメソッドでデフォルト値を設定しています。

次にDBの作成を行いましょう。

DBの作成

作成した設定ファイルをもとにDBの作成を行っていきます。

下記コマンドを実行してください。

docker-compose run --rm  web bundle exec rails db:create

development環境とtest環境のDBの作成が行われます。

production環境のDBを作成したい場合は、引数に「RAILS_ENV=production」を追加して実行してください。

これで準備は完了です。

初期画面の確認

アプリケーションを立ち上げて初期画面が表示されるか確認してみましょう。

下記コマンドを実行して、アプリケーションを起動します。

docker-compose up

起動が完了したら、ブラウザから「http://localhost:3000」にアクセスしてみましょう。

下記画面が表示されれたらOKです。

初期画面

Railsのバージョンの違いにより、表示される画面が少し違うかもしれませんが問題ありません。

モデル(Model)を作成してみる

これまでの説明で、開発を始める準備は完了です。

以降、モデルの生成やGemの追加など開発を進めていくことになります。

今回は試しに簡単なモデルの作成を行ってみます。

モデルの作成

モデルの作成はRailsコマンドを利用して行います。

今回はユーザ名とメールアドレスを管理するUserテーブルを作ってみましょう。

下記コマンドを実行してください。

docker-compose run --rm web bundle exec rails g model User name:string mail:string

下記のように複数のファイルが生成されたと思います。

migrateコマンド実行

Docker上でRailsコマンドを実行していますが、ホスト上のフォルダをマウントしていますので、生成されたファイルはホスト側からも確認できます。

lsコマンド実行

続いてmigrateを実行します。

migrateの実行

migrateコマンドを実行して、DBに変更内容を伝えていきます。

下記コマンドを実行してください。

docker-compose run --rm web bundle exec rails db:migrate

このコマンドにより、Userテーブルが作成されます。

それではRailsコンソールを利用して、作成したUserテーブルを実際に操作してみましょう。

続いて、下記コマンドを実行してください。

docker-compose run --rm web bundle exec rails c --sandbox

コマンドを実行すると対話モードになるので、レコードの作成や検索を行ってみます。

Railsコンソール画面

Userテーブルに対して、レコードの作成や検索が行えることを確認できました。

まとめ:Dockerを利用してRailsの開発環境を構築してみよう

本記事ではDocker上でRailsアプリケーションの開発環境を構築する手順について解説しました。

手順を以下にまとめます。

 Docker環境の構築手順

1. Dockerfileの作成
2. docker-compose.ymlの作成
3. 環境変数定義ファイルの作成
4. buildの実行

 Railsアプリケーションの作成手順

1. Gemfileの作成
2. 新規プロジェクトの作成
3. DBの設定ファイルの修正
4. DBの作成

Dockerを利用して開発環境構築を行うことで、環境の共有が楽になり、開発者間で環境を統一することにもつながります。

やり方を押さえれば、誰でも簡単に開発環境の構築が行えます。ぜひ自身の環境で手を動かして実践してみてください。

最後まで読んでいただき、ありがとうございます。


最新情報をチェックしよう!