Rails アプリケーションをコンテナで開発しよう ! 第 1 回 - まずは Rails アプリケーション作りから
Author : トリ
Ruby on Rails といえば泣く子も黙る超有名 Web アプリケーションフレームワークで、数多くの利用事例があります。本連載ではそんな Rails アプリケーションをイチから作り、開発環境を整え、最終的に AWS のコンテナサービスを使っていい感じに動かすことを目指していきます。
Getting Started with Rails
まずは Ruby on Rails の公式チュートリアルに沿って Rails アプリケーションを作るところから始めます。
チュートリアルをざっとみた感じ、Rails アプリケーションを作成するためには rails コマンドだけではなく node や yarn など様々なソフトウェアを実行環境にインストールする必要がありそうです。

本記事のゴール
突然ですが、僕はローカル環境にいろいろインストールしたくない勢です。AWS Cloud9 のようなクラウド IDE サービスを使う方法もありますが、理由は特にないけどローカル環境で完結させたいんです、そんな思いを持つ方も多くいらっしゃるかと思います。そこで連載の第 1 回となる本記事では、以下をゴールに進めていきます。
- Rails チュートリアルで必要と書かれている依存ソフトウェア (rails, node, yarn など)をローカル環境にインストールせずに Rails アプリケーションの作成コマンド rails new [YOUR-APP-NAME] が通るようにローカルコンテナ環境を作る
- Rails アプリケーションの作成が完了したら、rails server コマンドで Rails アプリケーションを実行し、HTTP リクエストに対してレスポンスが返ってくることを確認する

このクラウドレシピ (ハンズオン記事) を無料でお試しいただけます »
毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。
事前準備
まずは Docker for Desktop をホストマシンにインストールします。まだインストールしていない場合はこちらの Docker 社の Web サイトからダウンロード & インストールを行なってください。

さっそくチュートリアルに沿って環境を作っていきます
基本的な流れはチュートリアルに沿いつつ、一部手順やコマンドを変更しながら進めていきます。
まずは一時的なコンテナを作成し、そのコンテナの中で Rails アプリケーション作成に必要なソフトウェアのインストール、 Rails アプリケーションの作成という一連の作業をやってしまおうと思います。 (Rails アプリケーションを作成する環境をどう用意するかについては他にもいろいろな方法がありますので、ここに書かれているものだけが正解というわけではないことにご注意ください)
まずはホストマシンで作業ディレクトリを作ります。本記事では作業に macOS を利用していますので、Windows など別の OS をご利用の場合は適宜コマンドを読み替えて実行していただければ幸いです。(コンテナ内での作業は同じコマンドで大丈夫です)
# ディレクトリを作ってそこに移動
mac$ mkdir develop-rails-6-app-with-containers && cd $_
チュートリアルによれば Ruby 2.5.0 以降が必要らしいので、ここでは Docker Hub に公開されている 公式 Ruby コンテナイメージを使うことにします。
mac$ docker run --rm ruby:2.5.0 ruby -v
## omitted (はじめて ruby:2.5.0 を使う場合はここでイメージのダウンロードが行われます)
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
それでは、この Ruby 2.5.0 コンテナイメージからコンテナを実行し、コンテナの中で Rails アプリケーション作成に必要なソフトウェアのインストールや Rails アプリケーション作成を行なっていきます。
mac$ docker run -it --rm --name rails-gen -v $(pwd):/work -w /work ruby:2.5.0 bash
ちょっとだけコマンドの内容について解説します。触れていない箇所については現時点では無視してもらって大丈夫です。

上に示した通り、Ruby 2.5.0 コンテナにホスト側のディレクトリをマウントします。最終的に作成する Rails アプリケーションをこのディレクトリに内に作成する目的でマウントしているのですが、こうすることでコンテナを停止してもそのディレクトリに配置したファイルはホスト側に残り、また Git での操作などもコンテナ内ではなくホストマシン側で行えるようになります。
ここでは --rm オプションを付けてコンテナを実行しているため、このコンテナは停止後に自動的に削除されます。これは今回実行する Ruby 2.5.0 コンテナはあくまでも Rails アプリケーションの作成目的のみで利用する一時的なコンテナだからです。
コンテナの中に入ると以下のような表示になります。b740abb8963d という表示はコンテナ起動時にランダムに割り当てられるコンテナ ID のため同じ手順を実行していても違う値が表示されているかもしれませんが、正常な挙動なので気にせずそのまま進みましょう。
root@b740abb8963d:/work#
ホスト側の作業ディレクトリがマウントされている /work にいることが分かります。ls -a コマンドを実行し、ホスト側同様中身が空であることを確認しましょう。(環境やこの手順に到るまでの作業によっては .DS_Store のような OS が勝手に作成するファイルがあるかもしれませんが、それらは無視して大丈夫です)
root@b740abb8963d:/work# ls -a
. ..
チュートリアルによれば Rails を動かすために必要なものは、Ruby / SQLite3 / Node.js / Yarn のようです。SQLite3 はアプリケーションの実行時には必要なりそうな気がしますが、Rails アプリケーションの作成時には使わないと思われるのでここではいったんスキップし、 Node のインストールに進みます。
Node のインストールはチュートリアルからリンクを辿っていったところにある Node のインストール手順にしたがって進めます。利用している Ruby:2.5.0 コンテナイメージは Debian 9 ベースの模様なので、LTS 版の Node.js v12.x かつ Debian 用の記述に沿ってインストールします。
root@716d74a54824:/work# curl -sL https://deb.nodesource.com/setup_12.x | bash -
## omitted
root@716d74a54824:/work# apt-get install -y nodejs
Reading package lists... Done
## omitted
root@716d74a54824:/work# node --version
v12.18.3
Node を Ruby 2.5 コンテナの中にインストールできました!次は Yarn です。こちらもコンテナの中にインストールしちゃいましょう。チュートリアルからリンクされている Yarn のドキュメントに沿ってインストールします。
root@716d74a54824:/work# curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
OK
root@716d74a54824:/work# echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
deb https://dl.yarnpkg.com/debian/ stable main
root@716d74a54824:/work# apt update && apt install yarn
Hit:1 http://security.debian.org stretch/updates InRelease
## omitted
root@716d74a54824:/work# yarn -v
1.22.4
Yarn もインストールできました!いよいよ Rails 本体のインストールです。この作業が終わると rails コマンドを使って Rails アプリケーションを作れるようになります。
root@716d74a54824:/work# gem install rails
Fetching: concurrent-ruby-1.1.6.gem (100%)
## omitted
root@716d74a54824:/work# rails --version
Rails 6.0.3.2
Rails のインストールはうまくいきましたか ?
さあいよいよ Rails アプリケーションの作成です。rails new コマンドを使って新規 Rails アプリケーションを作成してみます。公式チュートリアルでは blog という名前のアプリケーションを作成していましたが、より強気に良いもの感を出していくためにここでは my-super-awesome-blog という名前で作っちゃいます。
root@716d74a54824:/work# rails new my-super-awesome-blog
create
create README.md
create Rakefile
create .ruby-version
create config.ru
create .gitignore
create Gemfile
## omitted - ※めちゃ長いです
Done in 124.72s.
Webpacker successfully installed 🎉 🍰
Rails アプリケーションが作成できました ! さっそく実行してみます !
root@716d74a54824:/work# cd my-super-awesome-blog/
root@716d74a54824:/work/my-super-awesome-blog# rails server
=> Booting Puma
=> Rails 6.0.3.2 application starting in development
=> Run `rails server --help` for more startup options ## ここでちょっと待つと思います
Puma starting in single mode...
* Version 4.3.5 (ruby 2.5.0-p0), codename: Mysterious Traveller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://127.0.0.1:3000
Use Ctrl-C to stop
Rails サーバーが起動できました。ログによれば 127.0.0.1:3000 で Listen しているようなのでさっそくアクセスしたいのですが、勢い勇んで macOS 側の Web ブラウザから http://127.0.0.1:3000 にアクセスしても残念ながら開けません。コンテナをはじめて使い始めたときによくハマるポイントなのですが、今回実行しているコンテナはポートをコンテナ外に公開していないので、こういうことが起こります。
とはいえ動作確認はしたいので、今回はコンテナの中で curl コマンドを利用して Rails サーバーからレスポンスが返ってくるかを確認してみましょう。現在利用しているターミナルウィンドウでは Rails サーバーがフォアグラウンドで動いているので、
1)ターミナルの別ウィンドウを開いた上で
2)コンテナの中に入り
3)curl コマンドでリクエストを送ってみます。
# ターミナル別ウィンドウを開いてね!
# (2) - Rails サーバーが起動しているコンテナの中に入る
$ docker exec -it rails-gen bash
root@b740abb8963d:/work#
# (3) - curl コマンドでリクエストを送ってみる
root@b740abb8963d:/work# curl http://127.0.0.1:3000
<!DOCTYPE html>
<html>
<head>
<title>Ruby on Rails</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
</head>
<body>
<div class="container">
<section>
<p>
<a href="http://rubyonrails.org">
<img width="130" height="46" alt="Ruby on Rails" border="0" src="data:image/svg+xml;base64,PD94..." />
</a>
</p>
<h1>Yay! You’re on Rails!</h1>
<img alt="Welcome" class="welcome" src="data:image/png;base64,iVB..." />
<p class="version">
<strong>Rails version:</strong> 6.0.3.2<br />
<strong>Ruby version:</strong> ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
</p>
</section>
</div>
</body>
</html>
root@b740abb8963d:/work#
HTML っぽいものが返ってきました !! (長いので上記は一部省略しています)
別ウィンドウで開いたターミナルを閉じて、もともとのウィンドウに戻ってみましょう。以下のような Rails サーバーのアクセスログが出力されているはずです。
# 最初に使ってた方のターミナルウィンドウです!
Started GET "/" for 127.0.0.1 at 2020-08-05 04:07:23 +0000
(8.1ms) SELECT sqlite_version(*)
Processing by Rails::WelcomeController#index as */*
Rendering /usr/local/bundle/gems/railties-6.0.3.2/lib/rails/templates/rails/welcome/index.html.erb
Rendered /usr/local/bundle/gems/railties-6.0.3.2/lib/rails/templates/rails/welcome/index.html.erb (Duration: 9.5ms | Allocations: 459)
Completed 200 OK in 26ms (Views: 14.2ms | ActiveRecord: 0.0ms | Allocations: 2616)
いい感じに Rails サーバーが動作していることが確認できましたので、Ctrl-C で Rails サーバーを止め、コンテナから抜けましょう。
^C- Gracefully stopping, waiting for requests to finish
=== puma shutdown: 2020-08-05 04:15:03 +0000 ===
- Goodbye!
Exiting
root@b740abb8963d:/work/my-super-awesome-blog#
exit コマンドまたは Ctrl-D でコンテナから抜けられます。 (コンテナも自動的に止まります)
root@b740abb8963d:/work/my-super-awesome-blog# exit
exit
ここまでの作業で Rails Getting Started の 4.1 "Starting up the Web Server" までが完了した状態です。
実際に作成された Rails アプリケーションのファイル群を見てみましょう。
# コンテナは抜けてここからはホストマシン側での作業です
$ ls -a
. .. my-super-awesome-blog
$ cd my-super-awesome-blog
$ tree -L 1 # tree コマンドは macOS には標準で入っていません。必要であれば brew install tree などでインストール可能です :)
.
├── Gemfile
├── Gemfile.lock
├── README.md
├── Rakefile
├── app
├── babel.config.js
├── bin
├── config
├── config.ru
├── db
├── lib
├── log
├── node_modules
├── package.json
├── postcss.config.js
├── public
├── storage
├── test
├── tmp
├── vendor
└── yarn.lock
12 directories, 9 files
見慣れた Rails アプリケーションのファイル群が見えますね!これでローカルマシンに rails コマンドやその他の依存ソフトウェアをインストールすることなく Rails アプリケーションを作成することができました ! 🎉🎉🎉
連載の第 2 回では、この Rails アプリケーションを普段開発していくためのコンテナイメージの用意や開発環境のセットアップなどをやっていきましょう。次回もお楽しみに !
筆者プロフィール

トリ
Sr. Product Developer Advocate, Containers Product, Amazon Web Services
Twitter が大好きです。
AWS のベストプラクティスを毎月無料でお試しいただけます
さらに最新記事・デベロッパー向けイベントを検索
AWS を無料でお試しいただけます