6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Ruby on Railsコンテナの作成方法について

Last updated at Posted at 2023-06-15

はじめに

今回はDockerを使ったRailsのコンテナ作成を行なっていきたいと思います。

コンテナとは

そもそもコンテナとはなんなのか?
一言で言うとアプリとファイルシステムを隔離する特殊なプロセスのことです。また、ここでいうプロセスとは、OS上で動作している1つ1つの処理のことで、まあ要するに動作中の個々のプログラムのことだと思ってください。
アプリとファイルシステムを隔離するということは、1つの物理マシンの中で稼働しているにも関わらず、そのプロセスだけが別マシンで動作している状態になるということです。
コンテナを使うには、コンテナの作成および実行を行うソフトウェアが必要になってきます。そこで用いられるのがDockerです。
コンテナの設計図となる「イメージ」を共有できる場所もあり、また、それを利用して短時間でコンテナの作成を行ったりと一種のエコシステムを形成しています。

その他コンテナ・Dockerについての詳細を知りたい方はこちらの記事を参考にしてください。初心者の自分でも理解できるくらいわかりやすくまとめられていました!

Ruby on Rails とは

Ruby on Rails(以降、Rails)とはRubyでWebアプリを作るためのフレームワークです。Railsを使用するためにはデータベースが必要です。今回はMariaDBを使用していきます。

Railsの動作および手順

RailsとMariaDBを組み合わせて使用するには以下の手順が必要です。

  1. Rubyをインストール
  2. Railsの動作に必要なライブラリ(yarnやNode.js)をインストール
  3. Gemfile、Gemfile.lockを作成
  4. bundle installコマンドを実行してRailsをインストール
  5. rails new . --force --no-deps --database=mysqlコマンドを実行してRailsのプロジェクトを作成
  6.  作成したプロジェクト内のdatabase.ymlを、MariaDBに接続する設定に変更
  7.  rake db:createコマンドを実行して、データベースを作成
  8.  rails serverコマンドを実行して、Webサーバーを実行

使用するイメージと設定ファイル

ソフトウェアをインストールしたイメージが必要なので、Dockerfileを作成していきます。
イメージはコンテナの設計図になります。このDockerイメージを元にし、コンテナが作成されていきます。
Dockerイメージ

上図からも分かるように取得したイメージはDockerホスト内のキャッシュと呼ばれるローカルイメージに保存されます。そのため、一度取得したイメージはキャッシュから取得することができるようになります。

この仕組みによって、コンテナを素早く起動することができます。
イメージは、Rubyの公式イメージを使用します。

イメージ 公式URL
Ruby https://hub.docker.com/_/ruby
MariaDB https://hub.docker.com/_/mariadb

これらの公式URLにアクセスすると、それぞれのDockerイメージの詳細情報を確認できます。

また、Dockerfiledocker-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
Dockerfile
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の命令
compose.yaml
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が必要になります。
GemfileGemfile.lockは、Rubyプロジェクトで使用するGem(Rubyのパッケージやライブラリ)の依存関係を管理するためのファイルです。それぞれについては以下のようなものになっています。

  • Gemfileは、プロジェクトのルートディレクトリに配置されるファイルで、Gemの名前とバージョン制約を記述します。Gemfileは開発者が手動で編集し、プロジェクトが依存するGemを定義します。

  • Gemfile.lockは、実際にインストールされたGemのバージョン情報を含む自動生成されるファイルです。Gemfile.lockはBundlerによって管理され、プロジェクトの特定の環境における正確なGemのバージョンを保証します。Gemfile.lockは通常、バージョンの衝突や互換性の問題を防ぐために、共有されるかバージョン管理システムにコミットされます。

今回使用するGemfileとGemfile.lockは以下のようになっています。

Gemfile
source 'https://rubygems.org'
gem "rails", "7.0.5"
Gemfile.lock

コンテナの作成準備

Railsを起動するためにはRailsプロジェクトそのものが必要です。プロジェクト作成後に設定ファイルを修正するためにも、まずはdocker compose runコマンドでRailsプロジェクトを作成していきます。

% docker compose run --rm web rails new . --force --no-deps --database=mysql

を実行してください。
Image from Gyazo
ここで入力されているrails new . --force --no-deps --database=mysqlは、Railsプロジェクトの新規作成コマンドです。

  • .は、現在のディレクトリにRailsプロジェクトを作成することを意味します。
  • --forceは、既存のファイルを上書きする際に確認をスキップし、強制的に上書きします。
  • --no-depsは、依存関係のインストールをスキップします。通常、Railsプロジェクトを作成する際には依存関係(Gemやライブラリ)が自動的にインストールされますが、このオプションを使用すると依存関係のインストールを行わずにプロジェクトを作成します。
  • --database=mysqlは、データベースの種類をMySQLに指定します。RailsプロジェクトはデフォルトでSQLiteを使用する設定になっていますが、このオプションを使用することでMySQLを使用するように設定されます。

以上のコマンドを実行すると、現在のディレクトリに新しいRailsプロジェクトが作成されます。作成されるプロジェクトには、MySQLを使用するための設定が含まれています。
Image from Gyazo

イメージを再度ビルドする必要があるので、docker compose buildコマンドを実行します。
Image from Gyazo

次に、Railsの接続先をMariaDBのコンテナにするために作成されたdatabase.ymlを開きます。
database.ymlconfigのフォルダー内にあります。
ファイルを開いたら、default: &dafaultを以下の内容に変更します。

database.yml
# 一部省略
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オプションを指定することでコンテナがデタッチドモード(バックグラウンド)で起動されます。つまり、コンテナのログは表示されず、コマンドプロンプトはすぐに利用可能になります。
具体的には以下のことが起きています。

  1. docker-compose.ymlファイルの読み込みと構成の解析
  2. 必要な場合には、Dockerイメージのビルド
  3. 起動するコンテナの作成およびバックグラウンドでの開始
  4. サービス間の依存関係の解決とネットワークの構成

まあ要するに続けて操作を行いたい場合は、-dオプションをつけておくのが無難でしょう。

では、docker-compose up -dを実行してみます。
Image from Gyazo

先ほども言いましたが、Railsを起動するには事前にデータベースを作成しておく必要があります。そこでRailsの用意されているrake db:createコマンドを実行します。
docker compose exec web rake db:create
Image from Gyazo

ここまでがコンテナの作成方法になります。お疲れ様でした!
最後にWebブラウザで接続確認をしてみましょう。
Image from Gyazo

きちんと表示されたでしょうか?
今回作成したコンテナのRailsプロジェクトは、初期状態のままなので、機能を追加したい場合はローカルのRailsプロジェクトに機能を追加していきましょう。

まとめ

Dockerを使用してRailsアプリケーションを作成する手順を以下にまとめます。

  1. プロジェクトディレクトリの作成
  2. Dockerfileの作成
  3. Gemfileの作成
  4. Dockerイメージのビルド
  5. Railsプロジェクトの作成
  6. Docker Composeファイルの作成
  7. Docker Composeを使用してアプリケーションを起動

最後に

今回はDockerを使ったRailsのコンテナ作成を行なっていきました。Docker自体使うことが初めてでカタカナ用語に苦戦しつつもなんとかなりましたね・・・😅
今後も開発をする際は積極的に活用していき、よりDockerへの理解を深められたらいいなと思います。
最後までお読みいただきありがとうございました。

引用文献

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?