このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Ruby on Railsコンテナ①

 Docker Composeコマンドを使ったRuby on Railsコンテナの構築例を紹介します。RubyコンテナとMariaDBコンテナを使用します。

「Ruby on Railsコンテナ」は次の3部に分けて解説していきます。

 ここでは、オリジナルイメージの作成に必要な「Dockerfile」ファイルとRailsコンテナに必要な「Gemfile」ファイル、「Gemfile.lock」ファイルを作成していきます。

Ruby on Railsとは

まず、はじめにRuby on Railsについて解説します。

 Ruby on Railsは、ウェブアプリケーションの開発をスムーズに行うためのフレームワークです。Ruby言語で書かれたオープンソースのフレームワークであり、シンプルな文法と直感的な機能が特徴です。

 Ruby on Railsは、MVC(Model-View-Controller)アーキテクチャに基づいており、開発者がアプリケーションのロジック、データ、ユーザーインターフェースを効果的に分離し管理するのに役立ちます。また、豊富なライブラリやプラグイン、自動化されたタスクの実行など、開発プロセスを迅速化する多くの機能を提供しています。

 Ruby on Railsは、アジャイル開発やプロトタイピングに特に適しており、多くの企業や開発者によって広く採用されています。

URL:https://rubyonrails.org/

MariaDBとは

 MariaDBは、オープンソースのリレーショナルデータベース管理システムであり、MySQLのフォークから派生しています。MySQLの元々の開発者がMySQLのオープンソースコミュニティとの不和から派生させたものです。MariaDBはMySQLと互換性があり、MySQLからの移行が比較的容易です。

 MariaDBは高いパフォーマンスと安定性を提供し、大規模なウェブアプリケーションや企業のデータベースシステムで広く利用されています。また、拡張性やセキュリティにも焦点を当てており、クラスタリングやレプリケーションなどの高度な機能を提供しています。MariaDBのコミュニティやエコシステムも活発であり、さまざまなプラグインやツールが利用可能です。

URL:https://mariadb.org/

Ruby on Rails コンテナの作成

「compose.yaml」を作成して、DjangoとMySQLコンテナを作成します。

 Rubyイメージを使用して Railsイメージを作成します。Rubyイメージにソフトウェアをインストールするため、カスタムイメージを作成することになりますので、Dockerfileを定義していきます。

オリジナルイメージを使用するにはDockerfileを定義する必要があります。

  Railsの動作には追加でライブラリ(Node.jsとyarn)が必要です。Rubyイメージに以下をインストールして Railsイメージを作成します。

①Node.jsのインストール
②yarnのインストール

Node.jsとは

 Node.jsは、JavaScriptランタイム環境であり、非同期イベント駆動の特性を持つプラットフォームです。JavaScript言語を使用してサーバーサイドのアプリケーションを開発することができます。

 Node.jsは、Google ChromeのV8 JavaScriptエンジンに基づいており、高速な処理とスケーラビリティを提供します。また、非同期処理とコールバックを活用することで、I/O密度の高いアプリケーションやリアルタイムアプリケーションを効率的に処理することが可能です。

yarnとは

 yarnは、JavaScriptのパッケージマネージャーであり、Node.jsプロジェクトの依存関係を管理するためのツールです。npm(Node Package Manager)に代わる選択肢として、Facebookによって開発されました。

 yarnは、npmと同様の機能を提供しながらも、依存関係の解決やパッケージのダウンロードを高速化するためにキャッシュを使用します。また、パッケージの安定性を確保するために、パッケージのインストール時にロックファイルを生成する機能も提供しています。yarnはオープンソースであり、多くのJavaScript開発者によって広く利用されています。

Rubyコンテナには、GemfileとGemfile.lockというファイルが必要です。

不要なDockerオブジェクトの削除

まず、不要なDockerオブジェクトをすべて削除しておきます。

以下のコマンドを実行します。

・「docker system prune -a」コマンドを実行します。

Are you sure you want to continue? [y/N] の質問には「y」と入力します。

PS C:\Users\joeac> docker system prune -a
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all images without at least one container associated to them
  - all build cache

Are you sure you want to continue? [y/N] y
Deleted Containers:
(略)

・「docker system prune -a」コマンドで削除されなかったDockerオブジェクトは、個別に削除しておきます。

環境によって削除されずに残っているDockerオブジェクトは異なります。

ディレクトリの作成と移動

Railsコンテナを作成するには以下のファイルが必要となります。

  • Dockerfile
  • compose.yaml
  • Gemfile
  • Gemfile.lock

これらのファイルを保存するディレクトリを作成します。

作業ディレクトリに移動します。

・「cd desktop/docker」コマンドを実行します。
PS C:\Users\joeac> cd desktop/docker
PS C:\Users\joeac\Desktop\docker>

「rails」ディレクトリを作成して、作成したディレクトリに移動します。

・次のコマンドを実行します。
  • 「mkdir rails」コマンド
  • 「cd rails」コマンド
PS C:\Users\joeac\Desktop\docker> mkdir rails

    Directory: C:\Users\joeac\Desktop\docker

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2024/04/21    11:50                rails

PS C:\Users\joeac\Desktop\docker> cd rails
PS C:\Users\joeac\Desktop\docker\rails>

GemfileとGemfile.lock ファイル

Railsコンテナを作成するには、GemfileとGemfile.lockの2つのファイルが必要となります。

Gemfile

 Gemfileは、Ruby on Railsプロジェクトの依存関係を管理するためのファイルです。通常、Gemfileにはプロジェクトが使用するGem(Rubyのパッケージ)のリストが含まれています。Gemfile内の各行は、Gemの名前とバージョン指定を記述します。例えば、以下のような形式です。

gem 'rails', '6.1.0'
gem 'devise', '~> 4.7.3'

 Gemfileは、新しいGemを追加したり、特定のバージョンのGemを指定したりするために使用されます。依存関係が変更されると、Gemfileを更新する必要があります。

Gemfile.lock

 Gemfile.lockは、GemfileにリストされたGemの実際のバージョンと依存関係を固定したファイルです。このファイルは自動生成され、手動で編集することはありません。Gemfile.lockは、特定のGemのバージョンがプロジェクトに正確にインストールされ、他の開発者が同じ環境で同じバージョンのGemを使用することを保証します。また、Gemfile.lockはバージョンの衝突や競合を防ぎ、開発環境の再現性を確保します。

 GemfileとGemfile.lockの組み合わせにより、Ruby on Railsプロジェクトの依存関係が管理され、プロジェクトの開発環境が一貫性を持って構築されます。

Gemfileファイルの作成

VSCodeで「Gemfile」ファイルを作成します。

・「code Gemfile」コマンドを実行します。
PS C:\Users\joeac\Desktop\docker\rails> code Gemfile

VS Codeが起動します。

以下の内容を入力します。

source 'https://rubygems.org'
gem 'rails', '6.1.0'
・定義内容の解説
行番号内容解説
1source ‘https://rubygems.orgプロジェクトで使用するGem(Rubyのパッケージ)を取得するためのリポジトリを指定する。
2gem ‘rails’, ‘6.1.0’プロジェクトがRailsというGemを使用することを示す。'6.1.0'はRailsのバージョン番号を指定している。
Gemfile.lockファイルの作成

VSCodeで「Gemfile.lock」ファイルを作成します。

・「code Gemfile.lock」コマンドを実行します。
PS C:\Users\joeac\Desktop\docker\rails> code Gemfile.lock

VS Codeが起動します。

 この「Gemfile.lock」ファイルは、手動で編集することはありません。空のテキストファイルとします。そのまま保存します。

「Dockerfile」の作成

VSCodeで「Dockerfile」ファイルを作成します。

・「code Dockerfile」コマンドを実行します。
PS C:\Users\joeac\Desktop\docker\django2> code Dockerfile

VSCodeが起動します。

・「Dockerfile」ファイルを以下のように編集して保存します。
FROM ruby:3.0.4
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
WORKDIR /samplerails
COPY Gemfile Gemfile.lock /samplerails/
RUN bundle install
CMD ["rails", "server", "-b", "0.0.0.0"]
・定義内容の解説

「Dockerfile」ファイルの定義を解説します。

行番号内容解説
1FROM ruby:3.0.4ベースイメージとして、Rubyのバージョン3.0.4を使用することを指定する。
2RUN apt-get update -qqコンテナ内のAPTパッケージリストを最新の状態に更新する。
3RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash – && apt-get install -y nodejs下に別途解説。
4RUN npm install –global yarnNode.jsのパッケージマネージャーであるnpmを使用して、yarnをグローバルにインストールする。
5WORKDIR /samplerails以降のコマンドが実行される作業ディレクトリを/samplerailsに設定する。
6COPY Gemfile Gemfile.lock /samplerails/ホストマシン上のGemfileとGemfile.lockをコンテナの/samplerailsディレクトリにコピーする。
7RUN bundle installGemfileに記載されたGemの依存関係を解決し、バンドルをインストールする。
8CMD [“rails”, “server”, “-b”, “0.0.0.0”]コンテナが起動した際に実行されるデフォルトのコマンドを指定する。Railsサーバーを起動し、0.0.0.0からの接続を受け付ける。
「Dockerfile」ファイルの定義
3行目のコマンドの解説

RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash – && apt-get install -y nodejs

このコマンドを2つに分けて解説します。

  1. 「RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash –
    • まず、curlコマンドを使用してhttps://deb.nodesource.com/setup_lts.xというURLからスクリプトファイルをダウンロードします。
      • -f: エラーステータスコードが返された場合にエラーメッセージを表示しないで続行します。
      • -s: 進捗メーターやエラーメッセージを表示しません。
      • -S: エラーステータスコードが返された場合にはエラーメッセージを表示しますが、成功した場合は何も表示しません。
      • -L: リダイレクトがあった場合にはリダイレクト先にアクセスします。
    • 次に、パイプ(|)を使ってダウンロードしたスクリプトをbashで実行します。
      • bash -: ダウンロードしたスクリプトをbashシェルで実行します。
  2. && apt-get install -y nodejs
    • 前のコマンドが正常に完了した場合に、次のコマンドが実行されます。
    • apt-get install -y nodejsは、Node.jsをインストールするためのAPTパッケージマネージャーであるapt-getを使用して、nodejsパッケージをインストールします。
      • -y: インストールプロセスで発生する全てのプロンプトに対して自動的に”yes”を回答し、ユーザーの介入なしに続行します。
bash -」の意味

 「bash -」は、bashシェルを起動するコマンドです。-は通常、bashを対話的なモードで起動する際に使用されますが、ここでは通常の非対話的なモードでbashを起動します。非対話的なモードでは、bashは対話モードでのようなプロンプトを表示せず、指定されたコマンドやスクリプトを実行します。

具体的には、bash -は以下のような振る舞いをします。

  • ターミナルにプロンプトが表示されず、新しい行が開始されます。
  • bashが起動し、指定されたコマンドやスクリプトを実行します。
  • 実行が完了したら、bashは終了し、制御が元のシェルに戻ります。

 つまり、bash -はシェルスクリプトの実行などでbashを使用する際に、対話的なモードではなく非対話的なモードで実行するための方法です。

「setup_lts.x」の中身

ちなみに、「setup_lts.x」には以下の内容が記述されています。

#!/bin/bash

# Logger Function
log() {
  local message="$1"
  local type="$2"

(省略)

# Main execution
install_pre_reqs || handle_error $? "Failed installing pre-requisites"
configure_repo "$NODE_VERSION" || handle_error $? "Failed configuring repository"

 この続きは「Ruby on Railsコンテナ②」で、「compose.yaml」ファイルの作成とRailsプロジェクトを作成していきます。

関連コンテンツ