クイックスタート・ガイド:Docker Compose と Rails

このクイックスタート・ガイドは Docker Compose を使い、簡単な Rails/PostgreSQL アプリをセットアップします。事前に Compose のインストール が必要です。

プロジェクトを定義

アプリケーションを構築するため、3つのファイルをセットアップしていきます。まずアプリケーションを実行する前に、 Docker コンテナ内には、依存関係のある全ての準備が必要になります。そのため、コンテナ中で何が必要なのかを、正確に定義しなくてはいけません。この定義に使うのが Dockerfile と呼ばれるファイルです。まずはじめに、Dockerfile は次のような構成です。

FROM ruby:2.2.0
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp

これはイメージ内にアプリケーションのコードを送ります。ここでは Ruby イメージを使い、Bundler や内部の依存関係を持つコンテナを作成します。 Dockerfile の書き方など詳細情報については、 Docker ユーザ・ガイドDockerfile リファレンス をご覧ください。

次に Rails を読み込むだけのブートストラップ用の Gemfile を作成します。rails new によって上書きされます。

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

そして Dockerfile の構築には、空の Gemfile.lock が必要です。

$ touch Gemfile.lock

最後に docker-compose.yml というファイルに、これら全てを結び付けます。アプリケーション構成するサービス(ここでは、ウェブサーバとデータベースです)を定義します。構成とは、使用する Docker イメージ(データベースは既製の PostgreSQL イメージを使い、ウェブ・アプリケーションは現在のディレクトリで構築します)と、必要であればどこをリンクするかや、ウェブ・アプリケーションの公開用ポートを記述します。

version: '2'
services:
  db:
    image: postgres
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

プロジェクトの構築

これらの3つのファイルを用い、docker-compose run コマンドを使い新しい Rails スケルトン・アプリを作成します。

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

Compose はまず Dockerfile を使い web サービスのイメージを構築します。それからそのイメージを使った新しいコンテナの中で、rails new を実行します。完了すると、次のように新しいアプリが作成されています。

$ ls
Dockerfile   app          docker-compose.yml      tmp
Gemfile      bin          lib          vendor
Gemfile.lock config       log
README.rdoc  config.ru    public
Rakefile     db           test

rails new によって作成されるファイルは所有者が root でした。これはコンテナが root ユーザによって実行されたからです。新しいファイルの所有者を変更します。

sudo chown -R $USER:$USER .

新しい Gemfile から therubyracer を読み込む行をアンコメントします。これは Javascript のランタイムを入手したからです。

gem 'therubyracer', platforms: :ruby

これで新しい Gemfile ができたので、イメージを再構築する必要があります(つまり、Dockerfile の更新時、必要に応じて再起動を行うべきです)。

$ docker-compose build

データベースに接続

アプリケーションが実行可能になりましたが、まだ足りないものがあります。デフォルトでは、データベースは localhost で実行するとみなされます。そのため、db コンテナに指示しなくてはいけません。postgres イメージにデフォルトで設定されている database と username を変更する必要があります。

config/database.yml を次のように置き換えます。

development: &default
  adapter: postgresql
  encoding: unicode
  database: postgres
  pool: 5
  username: postgres
  password:
  host: db

test:
  <<: *default
  database: myapp_test

これでアプリケーションを起動できます。

$ docker-compose up

上手くいけば、次のような PostgreSQL の出力が見え、数秒後、似たような表示を繰り返します。

myapp_web_1 | [2014-01-17 17:16:29] INFO  WEBrick 1.3.1
myapp_web_1 | [2014-01-17 17:16:29] INFO  ruby 2.2.0 (2014-12-25) [x86_64-linux-gnu]
myapp_web_1 | [2014-01-17 17:16:29] INFO  WEBrick::HTTPServer#start: pid=1 port=3000

最後にデータベースを作成する必要があります。他のターミナルで、次のように実行します。

$ docker-compose run web rake db:create

以上です。これで Docker デーモン上のポート 3000 でアプリケーションが動作しているでしょう。もし Docker Machine を使っている場合は、docker-machine ip 仮想マシン名 で Docker ホストの IP アドレスを確認できます。