【Docker入門】Docker composeでRuby on Rails開発環境を構築する

docker

こんにちは!システムエンジニアのオオイシです。

Ruby on Railsの開発環境を作成するときは、Macならまだしも、Windowsだと環境依存の問題で難しいですよね?

解決方法として、今回は、Docker Composeを使った開発環境の構築方法について紹介していきます。

Dockerコンテナで環境を作ると・・・

  • 軽量で起動が早い
  • Windows 、Linuxなどしか動かないなどの環境依存がない
  • Dockerコンテナだと本番でのスケールが容易
  • デプロイが簡単
などのメリットがあるので挑戦してみてください!

docker-composeとは

Docker composeとは、複数のコンテナを協調して実行したい場合に、それらをまとめて管理するためのツールです。

例えば、一般的なWebアプリケーションは、

  • Webサーバー(Apache、 Negixなど)
  • アプリケーションサーバー(Ruby on Rails, Tomcatなど)
  • DBサーバー(MySQL、Oracleなど)

などの3階層で構築しますが、Docker Composeを使うと複数コンテナの一括管理できます。 Docker Composeだとコンテナを一括管理できるので、コンテナがとても使いやすくなりますよ!

なお、Dockerについては、こちらを参照してください。

compose定義ファイルの基礎(docker-compose.yml)

docker-compose.ymlとは、Docker Composeでコンテナの一括管理をするための定義ファイルです。

docker-compose.ymlには、複数のコンテナが協調して1つのサービスになるように、実行順序、環境変数、公開ポートやDockerビルドなどを書いていきます。

例えば、

  1. MySQL(MariaDB)をRuby on Railsを起動する前に起動する
  2. Ruby on Railsは3000番ポートを解放
  3. DBのパスワードは環境変数で定義
  4. ホスト(Mac または Windows)の./app とコンテナの/appをマッピング

と、言うようにです。

後に紹介する、Railsで使う docker-compose.yml の詳細は次のようになります。

docker-compose.yml:

詳しくは、公式ドキュメントを参照してください。

docker-compose コマンド

サービスを立ち上げるには、

$ docker-compose up

バックグランド(デーモンで)サービスを立ち上げるには、

$ docker-compose up -d

とします。

実行結果:

 

その他にもよく使うコマンドとして、

dockerのコンテナの一覧を見る為には、

$ docker-compose ps

実行結果:

 

dockerのコンテナにシェルで入るには、

$ docker-compose exdc app sh (※ app は サービス名)

を使います。

次項では、これらを使ってRuby on Rails の開発環境を構築する方法を説明していきます!

Ruby on Rails の開発環境を構築しよう

全体の構成を説明

今回はシンプルにRuby on RailsMySQL(MaridDB)の2つのコンテナを作成します。

  • Ruby 2.5 (alpine linuxベース)
  • Ruby on Rails 最新版
  • MySQL(MariaDB)

最終的なホスト側のファイル構造

それでは手順を解説していきます!

(STEP1)Railsの雛形を作成する

Railsの雛形をdocker上で作成します。

このように /app にRailsアプリの雛形を作成します。

(STEP2)Dockerfileの定義する

Ruby on Railsを構築するためのDockerfileを記述します。

Dockerfileはdockerイメージを作成するための手順書のようなものです。

Dockerfile:

(STEP3)docker-compose.ymlを定義する

MySQL(MariaDB)Ruby on Railsのサービスを定義します。
 
DBデータは、ホストの./db/volumesへ保存します。
 
こうすることでコンテナを再起動しても永続化することが可能です。
 
docker-compose.yaml:

database.yml:

環境変数から受け取れるように変更します。

(STEP4)Rails起動のための設定

db:migrate assets:precompile はシェルスクリプトに書きます。

開発時には、webpack-dev-server も使いため、foreman も実行します。

app/app/script/entrypoint_development.sh:

※ホスト側(Macなど)のshの実行権限がない場合には、Permission denied と言われる場合があるため、chmod +x app/script/entrypoint_development.sh を実行しておきましょう。

app/Procfile:

Gemfile:

(STEP5)開発環境をビルドする

RailsのDockerイメージをビルドします。

このコマンドはdocker-compose.yml に記載したbuild: .を実行します。

つまり、カレントディレクトリのDockerfileをbuildします。

Ruby on Railsを実行確認しよう!

では、Docker Composeを起動してみましょう。

-d (--detach) は、バックラウンドで実行するオプションです。

db:create はdocker-compose.ymlの中で作成しているので、不要です。

http://localhost にアクセスしてみてください。

Welcomeページが表示されれば、成功です!

最後に、Docker Composeのプロセスの状態を確認してみましょう。

停止するにはdocker-compose downを実行します。

アプリを作ってみる

scaffold を使って簡単なアプリを作成してみます。

このように、docker-compose exec サービス名 でコンテナを指定して実行することができます。

まとめ

いかがでしたか?

Docker Composeを使うと、Dockerコンテナを連携して一括管理することができます。

実用的なサービスを構築するためには、Docker Composeでコンテナ管理することは必須なので、ぜひ試してみてくださいね!