はじめに
Railsアプリを開発していると、
- Rubyのバージョンが違う
- PostgreSQLの設定が違う
- 開発環境を再構築したい
といった問題に遭遇することがあります。
今回、個人開発アプリ「TaskLink」の開発環境をDocker化したので、その手順と学んだことをまとめます。
Docker化した理由
Docker導入前はローカル環境で直接Railsを実行していました。
しかし、
- Rubyのバージョン管理
- PostgreSQLのセットアップ
- 環境差異
が気になっていました。
Dockerを利用することで、
「誰が起動しても同じ環境になる」
というメリットがあります。
開発環境
今回の構成です。
Docker Compose
├── web (Rails 8)
└── db (PostgreSQL 16)
使用技術
- Ruby 3.3
- Rails 8
- PostgreSQL 16
- Docker
- Docker Compose
ディレクトリ構成
tasklink/
├── Dockerfile
├── docker-compose.yml
├── Gemfile
├── Gemfile.lock
└── app/
Dockerfile
Railsアプリ用コンテナです。
FROM ruby:3.3
WORKDIR /app
COPY Gemfile Gemfile.lock ./
RUN bundle install
COPY . .
CMD ["bin/dev"]
docker-compose.yml
RailsとPostgreSQLを起動します。
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: password
コンテナ起動
ビルド。
docker compose build
起動。
docker compose up
ブラウザでアクセス。
http://localhost:3000
Railsアプリが起動しました。
DB作成
コンテナ内で実行します。
docker compose run web rails db:create
docker compose run web rails db:migrate
Docker化して良かったこと
1. 環境差異がなくなった
Dockerイメージに依存関係をまとめられるため、
RubyやPostgreSQLのバージョン差異を気にしなくて済むようになりました。
2. 再構築が簡単
コンテナを削除しても、
docker compose build
docker compose up
だけで復旧できます。
3. 本番環境を意識できる
本番環境では複数のサービスが連携して動作します。
Dockerを利用することで、
- Rails
- PostgreSQL
を分離して管理する考え方を学ぶことができました。
ハマったポイント
Gemが反映されない
Gemfileを変更したのに反映されないことがありました。
原因はイメージを再ビルドしていなかったことです。
以下で解決しました。
docker compose build
DB接続エラー
PostgreSQLコンテナ名とdatabase.ymlの設定が一致していないと接続できません。
Docker Composeのサービス名と合わせる必要があります。
db
host: db
学んだこと
Docker導入によって、
- コンテナの考え方
- RailsとDBの分離
- 環境構築の再現性
を学ぶことができました。
また、今後チーム開発を行う際にもDockerの知識は役立つと感じています。
おわりに
Rails学習中はローカル環境で開発することが多いですが、Dockerを導入することで環境構築の再現性が大きく向上しました。
個人開発でもDockerを利用することで、実務に近い構成を経験できるのでおすすめです。
現在開発中のTaskLinkでは、
- Docker
- GitHub Actions
- AWS EC2
- Nginx
- Puma
を利用した構成で運用しています。
今後はさらにCI/CDや監視周りについても学習していきたいと思います。