【Docker】Railsアプリケーション用環境の構築
とりあえずRailsの環境をDockerで作りたい時用のメモです。
といいつつチュートリアル向けの最小構成という感じではなく色々と高度な機能を開発していくうえでよく使うものも盛り込んでいます。
全部書こうかと思ったけどそこそこ長くなりそうだったのでGithubに上げました
アプリケーションの名前は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を使う場合もあるようです。
以下の記事などでざっと触れられていました。
あと個人的には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ブランチに追加しました
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