🐳

【Docker】Railsアプリケーション用環境の構築

2024/01/16に公開

とりあえずRailsの環境をDockerで作りたい時用のメモです。
といいつつチュートリアル向けの最小構成という感じではなく色々と高度な機能を開発していくうえでよく使うものも盛り込んでいます。

全部書こうかと思ったけどそこそこ長くなりそうだったのでGithubに上げました
https://github.com/ho-3b/rails-docker-env

アプリケーションの名前はsample_appです。
アプリケーション立ち上げは別記事に書きます。

以下多少補足など。

docker-compose.yml

webコンテナのcommandの部分はRailsアプリケーションサーバーの立ち上げコマンドですが、初回docker-compose up実行時にはRailsのインストールもしていない状態なのでコメントアウトしています。

各コンテナについて

nginx-proxy:リバースプロキシ

jwilder/nginx-proxyというDocker imageを利用します。
各コンテナに環境変数VIRTUAL_HOSTを設定すると、そのホストでアクセスできるようになります[^1]。
localhost:3000などでアクセスしていると、自分のアプリケーションのドメインを登録して利用するAPIが使えなかったりすることがあるので、それっぽいホストでアクセスできるようにしておいた方が便利です。
さらに.localhostのような変なトップレベルドメインだとはじかれてしまうケースがあるので(何のサービスだったか忘れたのですが以前経験があります)今回(実在しうるドメインなのでちょっと微妙ではありますが)https://local-sample-app.netでアクセスできるようにしています。

letsencrypt-nginx

jwilder/nginx-proxyと一緒にjrcs/letsencrypt-nginx-proxy-companionを利用することでSSL化も行うことができます。

web:アプリケーション用コンテナ

webコンテナはマルチステージビルドでRubyとNodeの両方が使える環境にしています。
Webpackerが標準だったRails6系とは異なり、7系のフロントエンド開発ではJSは必須ではないですが、選択肢によってはJSを使う場合もあるようです。
以下の記事などでざっと触れられていました。
https://qiita.com/megane42/items/bf85746b9cefaf38f473

あと個人的にはvimを入れるのがミソです
credentialを編集したいときエディタが入っていないと面倒です。

sample_appというディレクトリにRailsアプリケーションを作成する想定で、ここにGemfileとGemfile.lockを置いています。中身は空です。
webコンテナのDockerfileでこのファイルをコピーしてbundle installを行っていますが中身が空なので何も入りません。
Railsのインストールや新規アプリケーションの作成はdocker環境のビルドの中では行わず、あとからwebコンテナに接続して実行するようにしています。
開発を進めていってから他の人にこの環境を共有した場合、環境をビルドした時点で各種gemがインストールされます。

db:データベース用コンテナ

MySQLです。
Dockerfileでは日本語化の設定などをするようにしています

adminer

AdminerはPHP製のデータベース管理ツールです。Docker imageがあるため簡単に利用できます。
DBの中身が直感的に確認できるためよく使っています。
http://adminer.local-sample-app.netでアクセスできるようにしています。

mailcatcher

Railsアプリケーションで、smtpサーバーとしてこのコンテナを指定するとアプリケーションから送信したメールを受信できます。

追記:Sidekiqを使う場合

sidekiqとredisを使う場合の構成をredisブランチに追加しました
https://github.com/ho-3b/rails-docker-env/tree/redis

sidekiqコンテナについて

アプリケーション用コンテナと同じDockerfileでビルドします。
sidekiqを使うには関連のgemを導入する必要があり、95行目のsidekiq起動コマンド

command: bundle exec sidekiq config/sidekiq.yml

は、導入後でないと実行できません。
githubにあげているのはまっさらな状態のGemfileなので当然sidekiqは入っておらず、コマンドはwebコンテナのrails起動コマンド同様コメントアウトしています。

ただこの状態で起動しても、sidekiqコンテナはポート待受をしておらず、何のプロセスも実行されていないため、dockerの仕様でexited with code 0となってしまうようです。

sidekiqコンテナはアプリケーションの開発を進め、sidekiqをいざ利用する段階になってから用意したほうがよさそうです。

Discussion