【Mac編】DockerでRuby on Railsの開発環境を作ってみよう


【Mac編】DockerでRuby on Railsの開発環境を作ってみよう

Dockerを使い始めたら、お馴染みの Ruby on Rails の開発環境も作ってみたいですよね。今回は、公式ドキュメントを元に、 Docker で Ruby on Rails の開発環境を作る様子をご紹介。

尚、 Docker で Rails の環境を作る際、 自分のパソコンの OS によって作業内容が変わります。今回は Mac用の内容になっていますので、 Windowsの方、 Linuxの方はご了承ください。

目次
  1. 【Mac編】DockerでRuby on Railsの開発環境を作ってみよう
  2. MacのDockerでRuby on Railsを準備・起動する様子の動画
  3. MacのDockerにRuby on Railsを設定する方法
  4. まとめ

【Mac編】DockerでRuby on Railsの開発環境を作ってみよう

MacのDockerでRuby on Railsを準備・起動する様子の動画

Dockerの公式ドキュメントと Mac の相性はよく、公式ドキュメント通りに作業を進めていけば Ruby on Rails の環境できます。ただ、最初ドキュメントを見た時、「これで大丈夫かな?」と作業を進める中で不安を感じましたので、作業内容を収録しました。作業前の不安解消にお役立ちできれば幸いです。

また Docker で Ruby on Rails の環境を作るために必要なファイル郡、 GitHub にアップしています。公式ドキュメント通りの内容です。上記リンク、ご参照下さい。

それでは、動画ではご紹介できなかった細かい内容をご紹介していきます。

MacのDockerにRuby on Railsを設定する方法

画像クリックで拡大

今回は公式ドキュメントを元に Mac の Docker に Ruby on Rails をセットしますが、公式ドキュメント、一通り読んでもちょっと分かりにくいですよね。必要となるファイルも紹介されていますが、拡張子が無かったりするので Railsはじめて、 Docker初心者、という方はより不安になるのではないでしょうか。

いくつか情報整理の方法はあると思いますが、まずは書かれている内容をより簡単に全体イメージできるように「必要なファイル」と「コード」で仕分けしてみました。

DockerでRails環境を構築するために必要なファイル群
必要なファイル 目的 コード コードの補足
Dockerfile RailsのDockerイメージを作成・起動するため
Dockerfileのコード

  FROM ruby:2.5
  RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
  RUN mkdir /myapp
  WORKDIR /myapp
  COPY Gemfile /myapp/Gemfile
  COPY Gemfile.lock /myapp/Gemfile.lock
  RUN bundle install
  COPY . /myapp

  # Add a script to be executed every time the container starts.
  COPY entrypoint.sh /usr/bin/
  RUN chmod +x /usr/bin/entrypoint.sh
  ENTRYPOINT ["entrypoint.sh"]
  EXPOSE 3000

  # Start the main process.
  CMD ["rails", "server", "-b", "0.0.0.0"]
コードの補足説明

  FROM ベースとなるイメージ(ベースイメージのベースは debian)
  RUN コマンド実行
  WORKDIR RUNやCOPY、CMDなどの命令コードの実行ディレクトリ
  COPY 自分のパソコンのファイルをイメージ内にコピペ
  ENTRYPOINT コンテナ起動時読み込まれるディレクトリやファイル
  EXPOSE イメージ側のポート番号
  CMD ビルド時には何も実行しませんが、イメージに対して意図したコマンドを指定。コンテナに毎回同じ実行可能ファイルを実行させたいので、ENTRYPOINT と CMD両方を使用

  【その他キーワード】
  postgresql-client Postgre を使うためのツール
  chmod +x 単に実行可能にする
  -b -bオプションはRailsを指定されたIPにバインドします
Gemfile インストールするライブラリの管理ファイル
Gemfileのコード

  source 'https://rubygems.org'
  gem 'rails', '~>5'
              
コードの補足説明
gem 'rails', '~>5' インストールする Rails のバージョンを 5以上に、という内容
Gemfile.lock インストールされたすべてのgemのすべてのバージョンをロックするもの、最初は空ファイル
entrypoint.sh コンテナ起動時の初期設定、シェルスクリプト
entrypoint.shのコード

  #!/bin/bash
  set -e

  # Remove a potentially pre-existing server.pid for Rails.
  rm -f /myapp/tmp/pids/server.pid

  # Then exec the container's main process (what's set as CMD in the Dockerfile).
  exec "$@"
コードの補足説明

  .pid pid は、WEBサーバを起動するときに tmp/pids/server.pidに書き込まれ、終了するときに削除。server.pid に pid が書かれているとWEBサーバが起動中と判断されてしまう。そのため rmで一旦削除。
  set -e エラーがあったらシェルスクリプトをそこで打ち止めにしてくれる
  exec "$@" 位置パラメーターの各値が展開
            
docker-compose.yml コンテナの作成・起動、それからRailsとPostgreの連携のため
docker-compose.ymlのコード

version: '3'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
    
コードの補足説明

  -c 次の文字列からコマンドを読み込み、位置パラメータに引数を割り当て
  rails s rails server
  depends_on  サービス間の依存関係を表現
              

上記表、見難い場合は Googleシート ご参照下さい。

まず今回の作業で必要となるファイルは 5つ。

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

ローカル環境に Rails をセットしたことのある方なら、「全然違う」と感じることでしょう。Dockerで Rails の環境を作るには上記のようなファイルが必要になります。

また各ファイルには公式ドキュメントに書かれているようなコードが必要に。各ファイル毎のコードとコードの分かりにくい点は、上記表に収めていますのでご参照下さい。

画像クリックで拡大

ちなみに今回の作業環境は、ファイル編集とコマンド操作が伴いますので、私は Visual Studio Code を選択しました。デフォルトの状態で、テキストエディタ、ファイル管理、コマンド操作ができるので便利です。

上図のように 5つのファイルが用意出来たら、次はそれらのファイルをもとに実行します。

画像クリックで拡大

docker-compose run web rails new . --force --no-deps --database=postgresql

実行コマンドは、公式ドキュメント通りに。今回 Dockerfile を使っていますが、 Dockerfile の build は、 docker-compose.yml 内で指示しています。そのため docker-compose コマンドがメインに。

docker-compose run で docker-compose.yml が起動し、順番にプログラム処理されていきます。そのとき services: 内の web: については個別のコマンドも指示。

web rails new . とすることで、 web: の処理過程で生成されるコンテナに対して Rails に新規プロジェクト作成を指示。

docker-compose.yml だけでも処理が複雑なのに、コンテナ作業も 1回のコマンドに同梱しているので、よけい難しい内容になっています。ただ、こうした処理方法もできるんだ、という点は勉強になりますね。

そしてオプションの --force (-f) は強制的に実行して下さい、という命令。 --no-deps は、リンクサービスを開始しない、という指示。 --database=postgresql についてはデータベースに関する指示。

画像クリックで拡大

docker-compose run web rails new . --force --no-deps --database=postgresql を実行すると、 Dockerイメージの postgre、 ruby のダウンロードがはじまり、Rails のセット作業が進みます。 4、5分するとイメージが 1つ、コンテナが 2つ新規作成されます。

画像クリックで拡大

そして web rails new . の結果、現在の作業ディレクトリに Rails関連のファイル、フォルダ軍が出現。ちなみに web rails new myapp01 とすると、 myapp01フォルダが自動作成されて、そのフォルダ下に Rails のファイル、フォルダは保存されますが、このあとの作業に支障をきたしますので、デフォルトの内容でいいと思います。

また web rails new . の結果、 Gemfile と Gemfile.lock が自動的に書き換えられる結果に。

画像クリックで拡大

画像クリックで拡大

本来 Rails のイメージを作成する時に、こうした機能充実の Gemfile、それから Gemfile.lock を利用する必要があったのですが、 Rails のバージョン等で内容が変わることもあるために、最初は必要最低限の記載。この機能充実の Gemfile と Gemfile.lock を使って再度 Rails のイメージを作成すれば、 Rails機能を搭載した Dockerのイメージを作成できます。

画像クリックで拡大

docker-compose build

再び docker-compose するわけですが、今度は一度使用した Dockerfile の変更に伴う再実行なので、 docker-compose run ではなく docker-compose build に(nuildに関する公式ドキュメント)。

再び Rails のセットアップ等が進むため、3、4分時間がかかります。

画像クリックで拡大

無事 docker-compose build が完了すると上図のように。次は Rails でデータベース Postgre が使えるようにセットしていきます。

画像クリックで拡大

データベースの設定は、 Rails関連フォルダの中の config フォルダにある database.yml を編集します。 database.yml を開くと上図のようにいろいろ書かれていますが、こちらを公式ドキュメントの通りに書き換え。

画像クリックで拡大

今回はサンプルなのでパスワード等の設定はされていません。実環境で利用する際はご注意下さい。

画像クリックで拡大

データベースの設定が完了したら、次は docker-compose up と公式ドキュメントには書かれていますが、これを実行してもまだ Rails のデータベースが作成されていませんのでエラーがでます。

今回は先に

docker-compose run web rake db:create

してデータベースを作成。

画像クリックで拡大

そして docker-compose up

画像クリックで拡大

localhost:3000 にアクセスすると Ruby on Rails のウェルカム画面が出力されていることが確認できます。

ここまでの Docker の様子を確認したいので、一旦コマンド画面に戻って Ctrl + c でコマンドをキャンセル。そしてイメージやコンテナの様子を確認してきます。

画像クリックで拡大

docker image ls

docker-compose 経由の Dockerfile で、イメージが新しく作成されていることが確認できます。

画像クリックで拡大

docker container ls -a

コンテナは、計 4つできていることが確認。現在どのコンテナも動いていないようなので、ブラウザにアクセスしても Rails の反応はありません。

画像クリックで拡大

自分のパソコンの中には Rails のファイル群があるのに、ブラウザは反応しない。これは Docker のコンテナによって Rails が起動していたため。この Docker特有のファイル感に慣れるのには、マウントや Volumeといった Docker のデータ管理を知っておく必要があります。

参考までに、現在の Rails のコンテナ状況を確認して、 Rails と自分のパソコンのデータの関係を確認してみましょう。

画像クリックで拡大

docker-compose up -d

コンテナの状況を確認する前に、一旦上記コマンドで Rails を起動しておきましょう。 するとコンテナ 1_web_1 と 1_db_1 が動いている事が確認できます。下記コマンドで Rails の方のコンテナを確認してみました。

docker container inspect 1_web_1

画像クリックで拡大

Railsコンテナのデータ状況を示す Mounts の項目を確認すると、現在の作業ディレクトリ(Source)とコンテナ(Destination)の接続ポイントが確認できます。コンテナの myapp 以下、つまり Rails のファイル群と現在の作業ディレクトリが接続中。 Type が ”bind” とありますので、こちらは マウント接続を意味。

画像クリックで拡大

今回の結果、ローカル環境で Rails のファイルを編集し、 Docker で Rails を動かせるわけですが、もし現在の Railsコンテナを docker commit で再イメージしたいとした時、自分のパソコンのデータは切り離されてイメージ化されますので、予めご注意下さい。

docker cp や GitHub などを使ってうまくデータ転送する必要があります。

Webサイト担当者としてのスキルが身に付く

無料カウンセリングはこちら

まとめ

画像クリックで拡大

今まで画像と文章でいろいろ紹介してきましたが、Mac の Docker で Ruby on Rails を作成する様子は上図の通り。「Dockerfile?」「コンテナ?」と思われた方、まずは Docker の基礎から体系的に学習することをオススメします。 基礎がわかる、使えるようになると、 Docker もモットモット楽しくなると思いますよ。

「参考書は買ったんだけどな...」「ネットで調べても、みんな Docker のコマンド違うな...」という方、もし Docker を就職、転職用のツール、スキルに考えているなら CodeCampGATE がオススメですよ。

4か月間短期集中型で Webアプリケーションの基礎を学習し、その中で Docker もレッスン。そして IT業界への就職、転職を斡旋してくれるというもの。お金はかかりますが、これからの人生、『 ITスキルなし or あり 』 で考えたら、決して高くないのではないでしょうか?

もしが止まっているようであれば、一度「無料相談」試してみませんか? 『無料相談』は随時行っていますので、ご興味ある方は 公式ページ より確認してみて下さい。


関連記事

オシママサラ
この記事を書いた人
オシママサラ
まずは7日間お試し!人気プログラミング講座を無料公開中
オンライン・プログラミングレッスンNo.1のCodeCamp