DockerでRuby on Railsの環境構築
概要
Railsの勉強をするついでに、せっかくなのでDockerで環境構築をしてみました。
この記事ではDockerを使ったRailsの環境を構築するための手順を紹介していきます。
私が調べる中で、バージョンが古かったり、上手く動かない場合があったため、私なりに噛み砕いて動くように調整してみた内容になっています。
よくある、環境構築記事と同じような構成になっていますが、ご容赦ください。
初めて記事を書くので、読みにくい点等あるかもしれません。
DockerやRailsについてはこれから学んでいくので、誤り等あれば適宜修正していきます。
対象読者
私と同じようにDockerやRailsがどのようなものかはなんとなく知っているけど、触るのは初めて、くらいの初学者を想定しています。
予備知識
前述の通り、DockerやRuby、Railsそのものについてはこれから勉強していくので、詳しい説明はしません。(できません・・・)
それぞれがどういったものかについては、他の有識者の方の記事がわかりやすいと思います。
私のざっくりとした認識だけ書いておきます。
Docker
コンテナと呼ばれる仮想環境を提供するツール。
ローカル環境に色々インストールしなくても、様々な環境を構築することができる。
Docker Compose
複数コンテナを組み合わせて、起動・停止や各種連携を一括で行うためのツール。
APIサーバーとDBサーバーのような組み合わせで使う。
Ruby on Rails
RubyのWebフレームワーク。
MVCパターンに準拠していて、単体でWebサイトも作れるし、API開発もできる。
PHPだとLaravelとかCakePHPとか。
環境
- 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版です。
作業は基本的にターミナルで行っていきます
Mac標準のものでもいいですが、私はiTerm2を使っています
ちなみに、VSCodeでもターミナルが利用できます。
ファイルの編集をしながらターミナルの操作を一つのウィンドウ上でできるので便利です。
実践
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
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アプリを起動するためにはデータベースの設定が必要です。
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
を変更してください。
password
はdb
コンテナのenvironment
に指定したMYSQL_ROOT_PASSWORD
と同じ値です。
host
はdb
というDB用に作ったコンテナ名が入ります。
以下のコマンドでRailsアプリを動かすために必要なデータベースを作成します
$ docker compose exec web rake db:create
先ほどはrun
コマンドでしたが、今回はexec
です。
run
は、新たにコンテナを起動するのに対し、exec
は起動中のコンテナに対して実行します。
確認
これですべての準備が完了しました。以下のURLにアクセスしてみてください。
以下のようにRailsの画面が表示されればOKです。
お疲れ様でした!
まとめ
今まで開発環境を作るときは、ローカルに様々なツールをインストールする必要があり、組み合わせによってはツール同士の競合による不具合や、そもそも動かないことが少なからずありました。
ローカル環境を汚すことなく、様々な環境を作れるのはかなりのメリットですし、もし他の人にも環境構築してもらう場合にも、ファイルを共有すれば済むので時間の短縮にもなると思います。
今回はDocker+Railsの環境をとりあえず作ってみようということで、DockerやDocker Composeの細かいところまでは気にせずに進みましたが、どこかのタイミングでしっかり勉強してみたいと思います。
参考
この記事は以下の記事を参考に執筆しています。
Discussion