"Quickstart: Compose and Rails"を読みながらDocker ComposeでRails+MySQLの環境を作る
次の記事などでDockerを使ってRailsの開発環境を構築しているのを見て、自分でもやっておこうと思ったので、やってみました。

公式ドキュメントの”Quickstart: Compose and Rails”を読みながらやります。
前提
まったく同じ手順でやるだけというのもなんなので、一度おなじ手順でやったあとに、次のような変更を加えてやってみました。
- Rubyのバージョンを2.3.3から2.4.1にする
- Railsのバージョンを5.0.0.1から5.1.1にする
- PostgreSQLのかわりにMySQLを使う
以降の記述でとくに言及していないファイルや手順は”Quickstart: Compose and Rails”での説明とおなじことをやっています。
DockerとDocker Composeは次のバージョンを使います。
- Docker
- 17.03.1-ce
- Docker Compose
- 1.11.2
作業
Dockerfile
Railsの環境を含むイメージを作るためにDockerfile
を書きます。
FROM ruby:2.4.1
RUN apt-get update -qq && apt-get install -y build-essential libmysqlclient-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
Ruby 2.4.1の公式イメージがあるので、タグ2.4.1
を指定します。Rubyのイメージの大元はDebianのイメージなので、apt-get
で必要なパッケージをインストールしていきます。
RubyのMySQLクライアントであるmysql2
というgemがlibmysqlclient-dev
というライブラリに依存するので、このライブラリをインストールしておきます。
Gemfile
さきほどのDockerfile
でイメージへコピーしていたGemfile
は、Railsの5.1.1を使うことから次のような内容とします。
source 'https://rubygems.org'
gem 'rails', '5.1.1'
docker-compose.yml
複数のコンテナをDocker Composeで立ち上げるためにComposeファイルdocker-compose.yml
を書きます。
version: '3'
services:
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: password
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
2017年5月現在、Composeファイルはバージョン3が最新版かつ推奨1なので、version: 3
を指定しておけばよさそうです。
MySQLを使うとき、環境変数にMYSQL_ROOT_PASSWORD
, MYSQL_ALLOW_EMPTY_PASSWORD
, MYSQL_RANDOM_ROOT_PASSWORD
のどれかを指定する必要があります。詳しくはMySQL公式イメージのページにある”Environment Variables”の節を参照してください。今回はMYSQL_ROOT_PASSWORD
でrootパスワードを指定しておきます。
イメージのビルド
手順どおりやればOKです。イメージビルド後にRailsプロジェクトを作成するときMySQLを使う設定ファイルを生成するために、オプション--database
を指定しておきます。
$ docker-compose run web rails new . --force --database=mysql --skip-bundle
データベースへの接続設定
config/database.yml
のpassword
にdocker-compose.yml
で環境変数に指定したパスワードを書いておきます。実際はパスワードも環境変数などの間接的な方法で管理することになるでしょう。host
はdocker-compose.yml
内で指定したDB用コンテナの名前db
を指定します。
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: password
host: db
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
はじめはDBがないので作る必要があります。Rails 5ではrails
コマンドでタスクを実行できます。
$ docker-compose run web bin/rails db:create
コンテナの起動
最後に次のコマンドでweb
, db
のコンテナを立ち上げて、ブラウザでlocalhost:3000
にアクセスすればRailsのデフォルトページが見られます。
$ docker-compose up