この記事では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_PASSWORD
とMYSQL_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-bundle
はbundle 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の開発環境構築を行いました。