はじめに
今回はDockerを使ったRailsのコンテナ作成を行なっていきたいと思います。
コンテナとは
そもそもコンテナ
とはなんなのか?
一言で言うとアプリとファイルシステムを隔離する特殊なプロセス
のことです。また、ここでいうプロセス
とは、OS上で動作している1つ1つの処理のことで、まあ要するに動作中の個々のプログラム
のことだと思ってください。
アプリとファイルシステムを隔離するということは、1つの物理マシンの中で稼働しているにも関わらず、そのプロセスだけが別マシンで動作している状態になる
ということです。
コンテナを使うには、コンテナの作成および実行を行うソフトウェアが必要になってきます。そこで用いられるのがDocker
です。
コンテナの設計図となる「イメージ」を共有できる場所もあり、また、それを利用して短時間でコンテナの作成を行ったりと一種のエコシステムを形成しています。
その他コンテナ・Dockerについての詳細を知りたい方はこちらの記事を参考にしてください。初心者の自分でも理解できるくらいわかりやすくまとめられていました!
Ruby on Rails とは
Ruby on Rails(以降、Rails)とはRubyでWebアプリを作るためのフレームワークです。Railsを使用するためにはデータベースが必要です。今回はMariaDBを使用していきます。
Railsの動作および手順
RailsとMariaDBを組み合わせて使用するには以下の手順が必要です。
- Rubyをインストール
- Railsの動作に必要なライブラリ(yarnやNode.js)をインストール
- Gemfile、Gemfile.lockを作成
-
bundle install
コマンドを実行してRailsをインストール -
rails new . --force --no-deps --database=mysql
コマンドを実行してRailsのプロジェクトを作成 - 作成したプロジェクト内のdatabase.ymlを、MariaDBに接続する設定に変更
-
rake db:create
コマンドを実行して、データベースを作成 -
rails server
コマンドを実行して、Webサーバーを実行
使用するイメージと設定ファイル
ソフトウェアをインストールしたイメージが必要なので、Dockerfileを作成していきます。
イメージはコンテナの設計図になります。このDockerイメージを元にし、コンテナが作成されていきます。
上図からも分かるように取得したイメージはDockerホスト内のキャッシュと呼ばれるローカルイメージに保存されます。そのため、一度取得したイメージはキャッシュから取得することができるようになります。
この仕組みによって、コンテナを素早く起動することができます。
イメージは、Rubyの公式イメージを使用します。
イメージ | 公式URL |
---|---|
Ruby | https://hub.docker.com/_/ruby |
MariaDB | https://hub.docker.com/_/mariadb |
これらの公式URLにアクセスすると、それぞれのDockerイメージの詳細情報を確認できます。
また、Dockerfileとdocker-compose.yamlを使用することで、アプリケーションの開発やデプロイメントを簡素化し、環境の再現性や可搬性を高めることができます。
-
Dockerfileは、Dockerイメージを作成するための設定ファイルです。Dockerfileには、ベースイメージの指定や必要なパッケージのインストール、アプリケーションのソースコードのコピーなどが記述されます。Dockerfileをビルドすることで、Dockerイメージが作成されます。
-
docker-compose.yamlは、複数のコンテナを定義し、それらを連携させるための設定ファイルです。例えば、データベースコンテナとアプリケーションコンテナの関係性やボリュームのマウントなどがdocker-compose.yamlに記述されます。docker-composeコマンドを使用して、docker-compose.yamlをもとに複数のコンテナを一括管理することができます。
そしたら、Railsの動作に必要な手順を落とし込んだ、Docdkefileとcompse.yamlを作成していきます。
myapp
|-- Dockerfile
|-- compose.yaml
|-- Gemfile
|-- Gemfile.lock
FROM ruby:3.2.2
# ベースにするイメージを指定
RUN apt-get update -qq
RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - && apt-get install -y nodejs
RUN npm install --global yarn
# Railsのインストールや必要なパッケージをインストール
WORKDIR /samplerails
# 作成した/samplerailsディレクトリを作業用ディレクトリとして設定
COPY Gemfile Gemfile.lock /samplerails/
# ローカルの Gemfile と Gemfile.lock をコンテナ内のsamplerails配下にコピー
RUN bundle install
# コンテナ内にコピーした Gemfile の bundle install
CMD ["rails", "server", "-b", "0.0.0.0"]
# Dockerイメージ内のコンテナが起動されたときに自動的に実行されるデフォルトのコマンドを指定するためのDockerfileの命令
services:
db: # MariaDBコンテナ
image: mariadb:10.7
environment:
MARIADB_ROOT_PASSWORD: password
volumes:
- db-data:/var/lib/mysql # ボリューム
web: # Railsコンテナ
build: .
depends_on:
- db
environment:
DATABASE_PASSWORD: password
ports:
- "3000:3000" # ポート番号
volumes:
- .:/samplerails # ボリューム
volumes:
db-data:
イメージにソフトウェアをインストールするために、DockerFileにRUN apt-get~
コマンドを記載しています。
また、Railsコンテナを作成するためにはGemfileとGemfile.lockが必要になります。
GemfileとGemfile.lockは、Rubyプロジェクトで使用するGem(Rubyのパッケージやライブラリ)の依存関係を管理するためのファイルです。それぞれについては以下のようなものになっています。
-
Gemfileは、プロジェクトのルートディレクトリに配置されるファイルで、Gemの名前とバージョン制約を記述します。Gemfileは開発者が手動で編集し、プロジェクトが依存するGemを定義します。
-
Gemfile.lockは、実際にインストールされたGemのバージョン情報を含む自動生成されるファイルです。Gemfile.lockはBundlerによって管理され、プロジェクトの特定の環境における正確なGemのバージョンを保証します。Gemfile.lockは通常、バージョンの衝突や互換性の問題を防ぐために、共有されるかバージョン管理システムにコミットされます。
今回使用するGemfileとGemfile.lockは以下のようになっています。
source 'https://rubygems.org'
gem "rails", "7.0.5"
コンテナの作成準備
Railsを起動するためにはRailsプロジェクトそのものが必要です。プロジェクト作成後に設定ファイルを修正するためにも、まずはdocker compose run
コマンドでRailsプロジェクトを作成していきます。
% docker compose run --rm web rails new . --force --no-deps --database=mysql
を実行してください。
ここで入力されているrails new . --force --no-deps --database=mysql
は、Railsプロジェクトの新規作成コマンドです。
-
.
は、現在のディレクトリにRailsプロジェクトを作成することを意味します。 -
--force
は、既存のファイルを上書きする際に確認をスキップし、強制的に上書きします。 -
--no-deps
は、依存関係のインストールをスキップします。通常、Railsプロジェクトを作成する際には依存関係(Gemやライブラリ)が自動的にインストールされますが、このオプションを使用すると依存関係のインストールを行わずにプロジェクトを作成します。 -
--database=mysql
は、データベースの種類をMySQLに指定します。RailsプロジェクトはデフォルトでSQLiteを使用する設定になっていますが、このオプションを使用することでMySQLを使用するように設定されます。
以上のコマンドを実行すると、現在のディレクトリに新しいRailsプロジェクトが作成されます。作成されるプロジェクトには、MySQLを使用するための設定が含まれています。
イメージを再度ビルドする必要があるので、docker compose build
コマンドを実行します。
次に、Railsの接続先をMariaDBのコンテナにするために作成されたdatabase.ymlを開きます。
database.ymlはconfigのフォルダー内にあります。
ファイルを開いたら、default: &dafaultを以下の内容に変更します。
# 一部省略
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: <%= ENV.fetch("DATABASE_PASSWORD") %> # 変更
host: db # 変更
port: 3306 # 追加
development:
<<: *default
database: samplerails_development
コンテナの作成
ようやく準備が終わりましたね・・・
そしたらdocker compose up -d
コマンドを使用してコンテナを作成していきます。
docker-compose up
コマンドとは、Docker Composeを使用して複数のコンテナを起動するためのコマンドです。
また、docker-compose up -d
は通常のdocker-compose up
コマンドとは異なり、-dオプションを指定することでコンテナがデタッチドモード(バックグラウンド)で起動されます。つまり、コンテナのログは表示されず、コマンドプロンプトはすぐに利用可能になります。
具体的には以下のことが起きています。
- docker-compose.ymlファイルの読み込みと構成の解析
- 必要な場合には、Dockerイメージのビルド
- 起動するコンテナの作成およびバックグラウンドでの開始
- サービス間の依存関係の解決とネットワークの構成
まあ要するに続けて操作を行いたい場合は、-dオプションをつけておくのが無難でしょう。
では、docker-compose up -d
を実行してみます。
先ほども言いましたが、Railsを起動するには事前にデータベースを作成しておく必要があります。そこでRailsの用意されているrake db:create
コマンドを実行します。
docker compose exec web rake db:create
ここまでがコンテナの作成方法になります。お疲れ様でした!
最後にWebブラウザで接続確認をしてみましょう。
きちんと表示されたでしょうか?
今回作成したコンテナのRailsプロジェクトは、初期状態のままなので、機能を追加したい場合はローカルのRailsプロジェクトに機能を追加していきましょう。
まとめ
Dockerを使用してRailsアプリケーションを作成する手順を以下にまとめます。
- プロジェクトディレクトリの作成
- Dockerfileの作成
- Gemfileの作成
- Dockerイメージのビルド
- Railsプロジェクトの作成
- Docker Composeファイルの作成
- Docker Composeを使用してアプリケーションを起動
最後に
今回はDockerを使ったRailsのコンテナ作成を行なっていきました。Docker自体使うことが初めてでカタカナ用語に苦戦しつつもなんとかなりましたね・・・😅
今後も開発をする際は積極的に活用していき、よりDockerへの理解を深められたらいいなと思います。
最後までお読みいただきありがとうございました。
引用文献