Rails 7 Docker チュートリアル:初心者向けにコンテナ化の基礎を徹底解説
はじめに
Ruby on Railsは、Webアプリケーション開発において幅広く利用されているフレームワークです。
特にバージョン7以降では、パフォーマンスや開発体験の向上が期待されており、多くのプロジェクトで採用が進んでいます。
一方、Dockerはコンテナ技術を活用し、開発環境や本番環境の構成を効率的に管理する手段として多くのエンジニアから注目されています。
Dockerを活用すれば、特定のソフトウェアバージョン管理が容易になり、開発に必要なライブラリやサービスをまとめて構築できます。
このように、Rails 7をDockerで動かすのは大きなメリットがありますが、初心者の皆さんにとっては少し難しそうに感じるかもしれません。
そこでこの記事では、Rails 7アプリケーションをDocker上で動かす一連の手順を、分かりやすく解説します。
実務においてもよく利用される構成を例にして、DockerfileやDocker Composeの使い方、コンテナ化のメリットや注意点などを具体的に紹介します。
皆さんがスムーズにDocker環境を構築できるようになることを目指して、一歩ずつ丁寧に進めていきましょう。
この記事を読むとわかること
- Rails 7をDocker化するうえで必要な基本の手順
- DockerfileとDocker Composeの具体的な設定例
- 開発環境と本番運用でよくある活用シーン
- Railsでよく使われるデータベースとの組み合わせ
- Dockerを使うときのメリットと注意点
- コンテナの起動・停止・ログ確認などの運用の基本
- 環境変数を使った設定管理のポイント
- コンテナ化によるチーム開発の利点
ここから先は、初心者の皆さんを想定して、なるべく専門用語をかみくだきながら解説します。
それぞれの節で登場する概念に対しては、実務での活用シーンを挙げながら具体的に説明します。
Rails 7とDockerを組み合わせるメリット
まずは本題に入る前に、Rails 7とDockerを組み合わせると何が嬉しいのかを確認しておきましょう。
環境構築が簡単
Railsの実行環境を整えるためには、Rubyやデータベースなどをインストールしてバージョンを合わせる必要があります。
Dockerを使えば、特定のイメージを元に必要なライブラリやRubyのバージョンを揃えられるため、「動作がうまくいかない」といったトラブルを減らしやすくなります。
チーム開発での手戻りが減る
一人ひとりが同じDockerコンテナ上で開発するので、環境差異によるエラーを最小限に抑えられます。
また、新しくチームに参加した方がいても、Dockerイメージと設定ファイルがあればすぐに同じ環境を用意できるでしょう。
本番運用に活用しやすい
近年は本番環境でもDockerが活用されるケースが多いです。
コンテナオーケストレーションツール(Kubernetesなど)と組み合わせることで、スケーラブルなアプリケーション運用が比較的簡単に行えます。
こうした利点を踏まえると、Rails 7をDocker化しておくのはメリットが大きいといえます。
Dockerとは何か
Dockerは、アプリケーションをコンテナと呼ばれる仕組みで隔離して動かすためのプラットフォームです。
イメージという設計図から、実際に動くコンテナを起動するイメージを持つとわかりやすいでしょう。
ここではDockerの基本的な動きを簡単におさらいします。
コンテナと仮想マシンとの違い
かつては仮想マシン(VM)を使って、ひとつのOSの中に別のOSをまるごとインストールし、開発環境を構築するのが一般的でした。
しかしVMの場合はOSごと仮想化するため、起動が重くなったり大量のメモリを消費したりすることがあります。
DockerはホストOSの一部リソースを共有しながら動くため、VMに比べて軽量な構成を実現できます。
イメージとコンテナの関係
Dockerでは、イメージと呼ばれるファイルシステムのスナップショットのようなものを作成します。
このイメージを元にして起動する具体的なプロセスをコンテナと呼びます。
イメージは何度でも再利用可能で、コンテナは複数のイメージから個別に作ることもできます。
例えばRailsのイメージを元に、コンテナAやコンテナBを起動するなど、プロジェクトごとに柔軟に運用可能です。
Docker Composeとは
複数のコンテナを連携させる場合、一つひとつのコマンド実行だけでは管理しにくくなります。
そこでDocker Composeを使うことで、設定ファイル(通常はdocker-compose.yml)を元にまとめてコンテナを起動・停止できるようになります。
Railsの場合、Webアプリケーションのコンテナだけでなく、データベースのコンテナやキャッシュ用のコンテナなど、いくつかの要素を組み合わせて動かすことが多いです。
Docker Composeがあると、これらを一括で扱えて便利です。
Rails 7をDocker化する基本ステップ
ここからは、Rails 7アプリケーションをDocker上で動かすための流れを順番に確認していきます。
大まかに以下のようなステップを踏むことになります。
- Railsアプリケーションの雛形を作成
- Dockerfileを準備
- Docker Composeの設定ファイルを作成
- コンテナのビルドと起動
- ブラウザからの動作確認
この一連の流れは、実務でもほぼ同じ流れで行われています。
Railsアプリケーションの雛形を作る
まずはRails 7のアプリケーション雛形を作成します。
ローカルの環境にRubyやRailsを直接インストールして作る方法と、Docker自体を利用しながら作る方法があります。
もしローカルにRubyをインストールするのが難しい場合でも、仮で一度ローカルに導入するか、あるいは既にあるRailsプロジェクトを使うケースが多いです。
本記事では、ひとまずRailsのコマンドが使える前提で雛形を作ると想定してみましょう。
Dockerfileを準備する
次に、Dockerfileという名前のファイルを用意します。
ここにはRailsが動くために必要なパッケージなどをインストールする命令を記述します。
たとえば、以下のように書くことがあります。
FROM ruby:3.2 WORKDIR /app # Node.jsやYarnが必要な場合があるのでインストール RUN apt-get update && \ apt-get install -y nodejs && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* COPY Gemfile Gemfile.lock /app/ RUN bundle install COPY . /app
上記はあくまで一例です。
FROM ruby:3.2
の部分で、Rubyを含むベースのイメージを指定しています。
その後、Railsプロジェクトに必要となるファイルをDockerコンテナ内にコピーし、bundle install
でGemをインストールする流れです。
WORKDIRを/app
に設定することで、以降の作業ディレクトリが/app
になります。
Docker Composeの設定ファイルを作成
Docker Composeを使うときは、通常 docker-compose.yml
というファイルをプロジェクト直下に置きます。
Railsアプリケーション用のWebコンテナと、データベース用のコンテナなどを定義しておくのが一般的です。
一例として、PostgreSQLを利用する場合の設定例を示します。
version: '3.9' services: web: build: . ports: - "3000:3000" volumes: - .:/app depends_on: - db environment: - DATABASE_URL=postgresql://postgres:password@db:5432/myapp_development command: bundle exec rails s -b 0.0.0.0 -p 3000 db: image: postgres:15 environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password volumes: - db_data:/var/lib/postgresql/data volumes: db_data:
-
web: Railsのコンテナです
build: .
は同じディレクトリ内のDockerfileを参照するという意味ports: - "3000:3000"
はホストの3000番ポートをコンテナの3000番ポートにマッピングしますvolumes: - .:/app
でホストのカレントディレクトリをコンテナ内部の/app
にマウントして、ホットリロードしやすくしていますdepends_on: - db
で、このコンテナを起動する前にdb
サービスを起動するよう指定environment:
にはデータベースに接続するための環境変数を渡していますcommand:
でRailsのサーバーを起動
-
db: PostgreSQLのコンテナです
image: postgres:15
はPostgreSQL 15をベースにコンテナを起動environment:
でPostgreSQLのユーザー名やパスワードを設定volumes:
でデータの永続化用ボリュームを指定
コンテナをビルドして起動する
Dockerfileとdocker-compose.ymlの準備ができたら、コマンド一発でコンテナをビルドし起動できます。
docker-compose build docker-compose up
もしくは、docker-compose up --build
と一度に実行してもかまいません。
しばらくするとコンテナが立ち上がり、Railsのサーバーが0.0.0.0:3000
で待ち受ける状態になります。
localhost:3000 にアクセスしてRailsの画面が表示されれば成功です。
実務での活用シーン
ここでは、Rails 7とDockerを組み合わせる具体的な活用シーンを考えてみましょう。
ローカル開発での利点
ローカルマシンに直接Rubyやデータベースを入れると、複数プロジェクトが混在してバージョンの衝突が起きることがあります。
Dockerを使えば、プロジェクトごとにイメージを分けて管理できるため、互いに干渉しにくくなります。
また、複数のプロジェクトを同時に進めるフリーランスの方などは、Dockerによって効率的に環境を切り替えられるケースが多いでしょう。
テスト環境でのメリット
Dockerはテスト環境にも適しています。
テストを実行するコンテナを毎回クリーンな状態で起動すれば、環境の汚染によるテスト結果のぶれを抑えられるからです。
CIツールと組み合わせて、コンテナを自動で起動→テスト→終了といった流れを定義しておくこともよくあります。
本番運用への展開
近年はAWSやGCPなどのクラウドサービスでもDockerコンテナをサポートしているケースが増えてきました。
実務では、Rails 7のアプリケーションをDocker化しておき、本番環境でもほぼ同じ構成をデプロイするという流れが一般的になりつつあります。
本番用の設定(データベースやAPIの接続情報など)だけ環境変数で切り替えるというやり方も多いです。
Dockerを使う際の注意点
便利なDockerですが、注意点もあります。
コンテナのサイズが膨らむ
Dockerイメージには不要なファイルを含めないようにする工夫が必要です。
Railsだと一部のアセットやキャッシュが溜まりすぎると、コンテナ自体が重くなることがあります。
dockerignore
ファイルを活用して、不要なディレクトリやファイルをイメージに含めない設定をすることをおすすめします。
予期しない権限問題
ホスト側のファイルの所有権やパーミッションが原因で、コンテナ内でファイル操作ができなくなる場合があります。
これを防ぐために、コンテナ内でのユーザーIDを設定したり、ボリュームマウントの方法を調整したりするとスムーズです。
ネットワークの設定
Docker Composeで定義したネットワークはコンテナ同士の通信を便利にしますが、ポートの競合や外部アクセスの設定には気をつける必要があります。
特にRailsで使う3000番ポートが他のサービスでも使われていると、競合が発生するかもしれません。
この場合はホスト側のポート番号を変えるなどで回避できます。
環境変数の管理
Railsアプリケーションではデータベースの接続情報などを環境変数で管理するのが一般的です。
Docker Composeを利用すれば、environment:
セクションにキーと値を指定して渡せます。
一方、本番運用などでは機密情報をソースコードに埋め込まないように注意しましょう。
たとえばRailsのデフォルトで用意されている credentials.yml.enc
を使ったり、あるいは別途管理サービスを使ったりする方法があります。
ただし、このあたりの管理方法はチームの方針にもよります。
環境変数に認証情報をそのまま書く場合は、リポジトリに誤ってコミットしないように注意しましょう。
コンテナの起動と停止、ログ確認
Docker Composeを使うと、ローカル開発時のサイクルは以下のようになります。
docker-compose up
で起動- 画面上にRailsやDBのログが流れる
Ctrl + C
で停止
バックグラウンドで起動したい場合は docker-compose up -d
とし、ログを見たいときは docker-compose logs -f
でリアルタイム表示ができます。
Railsでエラーが起きた際には、コンテナのログを追うことで原因が分かりやすくなるでしょう。
よくあるエラーと対処法
ここではRails 7をDockerで動かす際に初心者が陥りやすいエラー例と対処法を紹介します。
データベースの接続がうまくいかない
多くの場合は環境変数の設定ミスや、DATABASE_URL
の指定が正しくないなどが原因です。
YAMLのインデントがずれていたり、コンテナ名やポート番号が間違っていたりすると、RailsからDBに接続できずにエラーが出ます。
ビルドキャッシュの不具合
Dockerはビルド時にキャッシュを利用します。
Gemfileやpackage.jsonなどの依存ファイルを変更しても、キャッシュが効きすぎて意図した更新が反映されないことが稀にあります。
docker-compose build --no-cache
でキャッシュを無効化すると解決する場合があります。
ライブラリの不足
コンテナ内でNode.jsが必要なのにインストールしていないといったケースです。
Rails 7ではCSSやJavaScriptをアセットパイプラインなどで扱う場合、Node.jsやYarnが必要になることがあります。
Dockerfileでインストールを忘れないようにしましょう。
チーム開発への応用
コンテナ技術は、チームでRailsを開発する上でも大きな役割を果たします。
みんなが同じDockerイメージを共有することで、環境差異による「動く・動かない」のトラブルを減らせるからです。
たとえば、以下のようなフローが考えられます。
- リポジトリにDockerfileとdocker-compose.ymlをコミット
- 新しくプロジェクトに参加する人はリポジトリをクローン
docker-compose up
で同じ開発環境が再現
これだけで、メンバー全員が共通のRuby、Rails、データベース環境を使えます。
運用・保守のポイント
本番運用でもDockerは大いに役立ちますが、運用面でも注意が必要です。
ログの集約
Railsのログやデータベースのログをコンテナ内だけにため込んでしまうと、確認が面倒になることがあります。
本番ではログ収集サービスや外部ディスクにマウントする方法が検討されがちです。
デプロイ方法
コンテナイメージをビルドし、Docker Registry(例えばDocker HubやAmazon ECRなど)に登録することで、本番サーバーでイメージをpullして起動するパターンが考えられます。
CI/CDツールを使ってイメージの自動ビルドとデプロイをセットアップしておくと、リリースがスムーズです。
デプロイ時にイメージのタグをバージョンごとに分けておくと、ロールバックが楽になる可能性があります。
セキュリティアップデート
RailsやRuby、OSレイヤーのパッケージに脆弱性が発見されたときには、すぐにイメージを再ビルドして更新することが大切です。
Dockerイメージを更新して再デプロイする流れが整っていれば、セキュリティ修正作業が比較的スピーディに行えます。
パフォーマンスとコンテナの関係
Railsはメモリ消費量が大きくなることもあるフレームワークです。
そのため、コンテナを起動するホストマシンのリソース管理は重要なポイントになります。
本番運用ではオートスケールを活用することも多いですが、メモリ使用量やCPU使用率のモニタリングを行い、必要に応じてコンテナを増やしたり減らしたりする仕組みを用意すると便利です。
まとめ
ここまで、Rails 7をDockerで動かす方法について、初心者の皆さんにもわかりやすいように説明してきました。
どのようにDockerfileやDocker Composeを設定するか、また実務やチーム開発でどう役立つかをイメージできたのではないでしょうか。
Rails 7 Docker チュートリアルとしては、最小構成のサンプルを示しましたが、実務ではさまざまなコンテナを追加して複数環境を切り替えるケースもあります。
Dockerを導入しておくと、環境構築が楽になるだけでなく、チーム開発の効率も高まるはずです。
慣れてきたらテストやステージング、本番まで一貫してコンテナ運用に取り組んでみてください。
皆さんがスムーズにDockerを活用できるようになることを願っています。