こんにちは、おくやんです。
このブログでは、開発に役立つノウハウを実践的なコード例と共に紹介しています。
今回は、このようなお悩みを解決します。
本記事の内容
今回はDocker上でRailsアプリケーションの開発環境を構築する手順についてまとめました。
Railsアプリケーションの開発環境を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 |
まずは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の内容は下記記事で詳しく説明していますので、参照ください。
続いて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
下記のように複数のファイルが生成されたと思います。
Docker上でRailsコマンドを実行していますが、ホスト上のフォルダをマウントしていますので、生成されたファイルはホスト側からも確認できます。
続いて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
コマンドを実行すると対話モードになるので、レコードの作成や検索を行ってみます。
Userテーブルに対して、レコードの作成や検索が行えることを確認できました。
まとめ:Dockerを利用してRailsの開発環境を構築してみよう
本記事ではDocker上でRailsアプリケーションの開発環境を構築する手順について解説しました。
手順を以下にまとめます。
Docker環境の構築手順
2. docker-compose.ymlの作成
3. 環境変数定義ファイルの作成
4. buildの実行
Railsアプリケーションの作成手順
2. 新規プロジェクトの作成
3. DBの設定ファイルの修正
4. DBの作成
Dockerを利用して開発環境構築を行うことで、環境の共有が楽になり、開発者間で環境を統一することにもつながります。
やり方を押さえれば、誰でも簡単に開発環境の構築が行えます。ぜひ自身の環境で手を動かして実践してみてください。
最後まで読んでいただき、ありがとうございます。