クイックスタート・ガイド: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 アドレスを確認できます。