🐳

DockerでRuby on Railsの環境構築

2024/07/10に公開

概要

Railsの勉強をするついでに、せっかくなのでDockerで環境構築をしてみました。
この記事ではDockerを使ったRailsの環境を構築するための手順を紹介していきます。

私が調べる中で、バージョンが古かったり、上手く動かない場合があったため、私なりに噛み砕いて動くように調整してみた内容になっています。
よくある、環境構築記事と同じような構成になっていますが、ご容赦ください。

初めて記事を書くので、読みにくい点等あるかもしれません。
DockerやRailsについてはこれから学んでいくので、誤り等あれば適宜修正していきます。

対象読者

私と同じようにDockerやRailsがどのようなものかはなんとなく知っているけど、触るのは初めて、くらいの初学者を想定しています。

予備知識

前述の通り、DockerやRuby、Railsそのものについてはこれから勉強していくので、詳しい説明はしません。(できません・・・)
それぞれがどういったものかについては、他の有識者の方の記事がわかりやすいと思います。
私のざっくりとした認識だけ書いておきます。

Docker

コンテナと呼ばれる仮想環境を提供するツール。
ローカル環境に色々インストールしなくても、様々な環境を構築することができる。
https://www.docker.com/ja-jp/

Docker Compose

複数コンテナを組み合わせて、起動・停止や各種連携を一括で行うためのツール。
APIサーバーとDBサーバーのような組み合わせで使う。
https://docs.docker.jp/compose/toc.html

Ruby on Rails

RubyのWebフレームワーク。
MVCパターンに準拠していて、単体でWebサイトも作れるし、API開発もできる。
PHPだとLaravelとかCakePHPとか。
https://rubyonrails.org/

環境

  • MacOS Sonoma
  • Docker 4.32.0
  • docker-compose 2.24.6
  • Ruby 3.3.2
  • Rails 7.1.0
  • MySQL 8.0

前準備

こちらのサイトからDocker Desktopをダウンロードし、インストールしておいてください。
実行に必要なコマンドなども合わせてインストールされます。
今回はMacで環境を作るのでMac版です。
https://www.docker.com/ja-jp/products/docker-desktop/

作業は基本的にターミナルで行っていきます
Mac標準のものでもいいですが、私はiTerm2を使っています
https://iterm2.com/

ちなみに、VSCodeでもターミナルが利用できます。
ファイルの編集をしながらターミナルの操作を一つのウィンドウ上でできるので便利です。
https://code.visualstudio.com/

実践

1.作業フォルダの用意

作業フォルダを用意します。
どのような名前でもいいですがここではmyappとします

$ mkdir myapp

2.ファイルの作成

1で作ったmyappディレクトリ配下に必要なファイルを用意していきます。
ファイルの内容については、後ほど説明します。

  • Dockerfile
  • docker-compose.yml
  • Gemfile
  • Gemfile.lock

以下のコマンドで一括で作成できます
myapp配下に移動することを忘れずに

# myappへ移動
$ cd myapp

# ファイルを作成
$ touch {Dockerfile,docker-compose.yml,Gemfile,Gemfile.lock}

Dockerfile

# ベースイメージを指定
FROM ruby:3.3.2

# 必要なパッケージをインストール
RUN apt-get update -qq && apt-get install -y nodejs yarn default-mysql-client

# 作業ディレクトリを設定
WORKDIR /myapp

# GemfileとGemfile.lockをコピー
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock

# Bundlerを実行
RUN bundle install

# アプリケーションのコードをコピー
COPY . /myapp

# ポート3000を公開
EXPOSE 3000

# サーバーを起動
CMD ["rails", "server", "-b", "0.0.0.0"]

Dockerイメージを作成するためのファイルです。
イメージとはコンテナを作るためテンプレートのことです。
今回の場合Railsを動かすためのイメージの設定をしています。
FROMに指定したruby:3.3.2というイメージをベースに、必要なパッケージをインストールしたり、公開するポートを指定したりと、様々な設定をしています

docker-compose.yml

# 作成したいコンテナを列挙する
services:
  db:
    # DBコンテナを作成するために利用するイメージ
    image: mysql:8.0
    # データの保存先 (ホストディレクトリ:コンテナ内ディレクトリ)
    volumes:
      - mysql_data:/var/lib/mysql
    environment:
      # MySQL8.0 必須
      MYSQL_ROOT_PASSWORD: password 
    # 公開するポート番号
    ports:
      - 3306:3306
  web:
    # . を指定することで、docker-compose.ymlと同じ場所にDockerfileがあることを示している
    build: .
    # コンテナ起動時に実行されるコマンド
    # すでに rails serverが動いている場合は停止、その後に起動している
    command: bash -c "rm -f tmp/pids/server.pid && rails server -b 0.0.0.0"
    # データの保存先 (ホストディレクトリ:コンテナ内ディレクトリ)
    volumes:
      - .:/myapp
    # 公開するポート番号
    ports:
      - '3000:3000'
    # コンテナの作成順序。MySQLコンテナが起動してからRailsのコンテナを起動する
    depends_on:
      - db
# ホストディレクトリの指定
volumes:
  mysql_data:

Docker Composeを利用するための設定ファイルで、各コンテナをどのように作成するか指定しています。
要点だけメモ的にコメントしています。
volumesについてですが、基本的にデータは一時的に保存されるもので、一度コンテナを停止すると消えてしまうそうです。
そのデータを永続化するために、保存場所の指定が必要なようです。

Gemfile, Gemfile.lock

Gemfile
source 'https://rubygems.org'
gem 'rails', '7.1.0'

どちらもRubyで利用するgemと呼ばれるパッケージマネージャーがパッケージを管理するためのファイルです。
Gemfileには何をインストールするかを指定します。
今回はrailsの7.1.0をインストールします

Gemfile.lockは何をインストールしたかを管理するためのファイルです。
gemを使ってパッケージをインストールしたとき(bundel installなど)に自動的に書き込まれるので空のままでOKです。

3.Railsアプリの作成〜コンテナの起動・表示まで

ファイルの用意ができたのでいよいよ、コンテナを作っていきます。
基本的にコマンドを実行していくことになります。

Railsアプリの作成

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

run --rm web rails new .で一時的に作ったwebコンテナを起動し、railsアプリをダウンロードしています。
--rmオプションをつけているので、処理が完了したら破棄されます。

--forceオプションですでにRailsアプリがある場合でも上書きして新しいアプリが作成されます。
--no-depsオプションはリンクした他のコンテナが起動しないようにしています。

上手くいくと、Railsのファイルが作成されると思います。

イメージのビルド

$ docker compose build

Dockerイメージを作成します。
まだコンテナは作られていません。

コンテナの作成・起動

$ docker compose up -d

コンテナを作成し、起動します。
-dオプションをつけることでバックグラウンドでコンテナを起動しています

データベースの設定

コンテナの起動ができたので、動作確認といきたいところですが、このままURLにアクセスしても失敗します。
Railsアプリを起動するためにはデータベースの設定が必要です。

config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
   username: root
- password:
+ password: password
- host: localhost
+ host: db

上記のようにconfig/database.ymlを変更してください。
passworddbコンテナのenvironmentに指定したMYSQL_ROOT_PASSWORDと同じ値です。
hostdbというDB用に作ったコンテナ名が入ります。

以下のコマンドでRailsアプリを動かすために必要なデータベースを作成します

$ docker compose exec web rake db:create

先ほどはrunコマンドでしたが、今回はexecです。
runは、新たにコンテナを起動するのに対し、execは起動中のコンテナに対して実行します。

確認

これですべての準備が完了しました。以下のURLにアクセスしてみてください。
http://localhost:3000

以下のようにRailsの画面が表示されればOKです。
お疲れ様でした!

スクリーンショット

まとめ

今まで開発環境を作るときは、ローカルに様々なツールをインストールする必要があり、組み合わせによってはツール同士の競合による不具合や、そもそも動かないことが少なからずありました。
ローカル環境を汚すことなく、様々な環境を作れるのはかなりのメリットですし、もし他の人にも環境構築してもらう場合にも、ファイルを共有すれば済むので時間の短縮にもなると思います。

今回はDocker+Railsの環境をとりあえず作ってみようということで、DockerやDocker Composeの細かいところまでは気にせずに進みましたが、どこかのタイミングでしっかり勉強してみたいと思います。

参考

この記事は以下の記事を参考に執筆しています。

Discussion