Docker Composeを使用したRuby on Railsの開発環境構築

投稿者: | 2019-09-09
Table of Content

この記事ではDocker Composeを利用したRuby on Railsの開発環境構築を行います。

使用するOSおよびRuby等のバージョンは以下の通りです。

  • Mac OS
  • Ruby2.6.3
  • Rails5.2.3
  • MySQL5.7

作成する環境はRuby on RailsのWebアプリケーションサーバとMySQLのデータベースサーバの2つのコンテナを作成します。
(コンテナを2つ作成するのはそれぞれのコンテナでデータベースとWEBアプリケーションをそれぞれ動作させるためです。)

1. プロジェクトの作業ディレクトリを作成

作業ディレクトリを作成します。以下のコマンドを実行して作業ディレクトリを作成します。
(作成するフォルダは任意の場所で構いません。作業ディレクトリ名(例ではex_ruby)も好きな名前で構いません。)

$ mkdir ex_ruby
$ cd ex_ruby

2. Dockerfileを作成

ex_ruby/Dockerfileを作成し、内容を以下のように記述します。

# 最新安定版のイメージを取得
FROM ruby:2.6.3

# 必要なパッケージのインストール
RUN apt-get update -qq && \
    apt-get install -y build-essential \ 
                       libpq-dev \        
                       nodejs           

# 作業ディレクトリの作成、設定
RUN mkdir /app_name

##作業ディレクトリ名を環境変数APP_ROOTに割り当てて、以下$APP_ROOTで参照
ENV APP_ROOT /app_name 
WORKDIR $APP_ROOT

# ホスト側(ローカル)のGemfileを追加する(ローカルのGemfileは別途事前に作成しておく)
ADD ./Gemfile $APP_ROOT/Gemfile
ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock

# Gemfileのbundle install
RUN bundle install
ADD . $APP_ROOT

3. Gemfileを作成

コンテナにrailsのgemをインストールするために、ex_ruby/Gemfileを作成し、内容を以下のように記述します。

source 'https://rubygems.org'
gem 'rails', '5.2.3'

4. 空のGemfile.lockを作成

コンテナにインストールするgemと依存関係にあるgemをGemfile.lockに記載します。
今回は依存関係はないので、空のGemfile.lockを以下のコマンドを実行して作成します。

$ touch Gemfile.lock

5. docker-compose.ymlの作成

「docker-compose.yml」ファイルを以下の内容で作成します。

MYSQL_ROOT_PASSWORDMYSQL_DATABASEは任意のパスワードとデータベース名を設定して大丈夫です。

version: '3' # バージョンを指定
services:
  db: # データベースサーバ用のコンテナの設定を記述
    image: mysql:5.7 # コンテナで使用するイメージ名を記述します。
    environment:
      MYSQL_ROOT_PASSWORD: password # 任意のパスワードを設定
      MYSQL_DATABASE: root # 任意のデータベース名を設定
    ports:
      - "3306:3306" # ホストの3306ポートとコンテナの3306ポートを接続します。

  web: # アプリケーションサーバ用のコンテナの設定を記述
    build: . # docker-compose.ymlと同じ階層にあるDockerfileを使ってイメージをビルドするための記述です。
    command: bundle exec rails s -p 3000 -b '0.0.0.0' # コンテナ立ち上げ時に起動するコマンドです。railsを実行します。

    volumes:
      - .:/app_name # 作業ディレクトリをコンテナ内の/app_nameにマウントします。
    ports:
      - "3000:3000" # ホストの3000ポートとコンテナの3000ポートを接続します。
    links:
      - db # dbコンテナとの接続を記述します。

6. rails newを実行する

新規Railsプロジェクトを作成するため、以下のコマンドを実行します。

$ docker-compose run web rails new . --force --database=mysql --skip-bundle

オプションの

--forceはファイルが存在する場合に上書きで作成するためのオプションです。

--database=mysqlは使用するデータベースの指定をするためです。

--skip-bundlebundle installをスキップするためです。
(Dockerfile内でbundle installを行っているので、行う必要がないのとbundle installに少し時間がかかるためスキップしています。)

7. database.ymlを修正する

rails new で作成されたデータベースの接続設定ファイルにはホスト名とパスワードが設定されていません。railsアプリケーションがデータベースに接続できるようにするため、
ex_ruby/config/database.ymlの12行目から18行目までの内容を以下のように編集します。

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: 
  host: localhost

この部分を以下のように編集します。

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password # docker-compose.ymlのMYSQL_ROOT_PASSWORD
  host: db # docker-compose.ymlのservice名

8. Docker起動

コンテナを起動するため、作業ディレクトリに移動して以下のコマンドを実行します。

(ここで実行するdocker-composeコマンドは「docker-compose.yml」ファイルを探して実行が進むので、「docker-compose.yml」ファイルがあるディレクトリ上で実行する必要があります。)

$ docker-compose up -d # コンテナの一斉起動

docker compose upは、イメージがなければイメージのビルドを行い、コンテナの起動までを行うコマンドです。

(イメージが無ければコンテナが起動できないため、イメージが無い場合はイメージのビルドを行います。)

オプションの-dはバックグラウンドでコンテナを起動するためのオプションです。

9. データベース作成

新しいターミナルを開いて、作業ディレクトリ上で以下のコマンドを実行します。

$ docker-compose run web rails db:create

10. ブラウザでlocalhost:3000にアクセスしてサーバーの起動を確認

Webブラウザでhttp://localhost:3000/にアクセスして、以下のような画面が表示されていれば環境構築は完了です。

サーバへのアクセス結果

11. その他のコマンド(変更の反映方法など)

サーバを止める場合は、作業ディレクトリで以下のコマンドを実行します。

$ docker-compose stop

ターミナルのCtrl+Cで止めると次回起動時にエラーとなるため注意してください。

(もし、Ctrl+C止めてしまった場合は、ex_ruby/tmp/pids/server.pidを削除し、コンテナを再起動してください。再起動はdocker-compose up -dでできます。

ex_ruby/tmp/pids/server.pidの削除は、Finderからファイルを選択して削除するか以下のコマンドを実行します。

$ rm tmp/pids/serve.pid

Dockerfileやdocker-compose.ymlの変更を反映し、railsサーバーを再起動するには以下のコマンドを実行します。

$ docker-compose up --build

オプションの

--buildはDockerfileのビルドも同時に行うためのコマンドです。

bundle installなどのコマンドを実行したい場合は以下のコマンドを実行します。

【例】

$ docker-compose run {サービス名} {任意のコマンド}

実際にbundle installを行うコマンドは、以下のコマンドになります。

$ docker-compose run web bundle install

ローカルからMySQLコンテナに接続する場合は以下のコマンドを使います。

$ mysql -u root -p -h localhost -P 3306 --protocol=tcp

12. docker-compose downなどでイメージを削除した場合の再起動を行う方法

コンテナを停止するコマンドにはdocker-compose stopの他に、docker-compose downというコマンドがあります。

このコマンドはコンテナの停止を行うと共に、イメージの削除も行うコマンドです。このコマンドでコンテナの停止を行った後で、docker-compose up -dでコンテナを起動すると、以下の画面のようにエラーになってしまいます。

データベースアクセスエラー画面

これはデータベースコンテナのイメージが削除されたことによってデータベースも削除されてしまったためです。

9. データベース作成で行ったのと同じように再度以下のコマンドを実行して、データベースを再作成する必要があります。

$ docker-compose run web rails db:create

この記事では、Docker Composeを利用したRuby on Railsの開発環境構築を行いました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です