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

# Docker Compose - クイックスタート・ガイド：Compose と Rails

原文：Quickstart Guide: Compose and Rails
https://docs.docker.com/compose/rails/

このクイックスタート・ガイドでは、Compose を使って、どのようにシンプルな Rails/PostgreSQLアプリケーションをセットアップ・実行するかを示します。あらかじめ、[Compose のインストール](http://qiita.com/zembutsu/items/dd2209a663cae37dfa81)が必要です。

## プロジェクトの定義

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

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

この Dockerfile はイメージを定義するものです。アプリケーションを含むコンテナを構築する時、そこには Ruby と Bundler だけでなく、そこに依存関係のある全てが含まれます。Dockerfile の書き方は、[Docker user guide](https://docs.docker.com/userguide/dockerimages/#building-an-image-from-a-dockerfile) と [Dockerfile reference](http://docs.docker.com/reference/builder/) をお読みください。

次に、Rails を読み込むだけの bootstrap `Gemfile` を作成します。これは `rails new` によって上書きされます。

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

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

```
db:
  image: postgres
  ports:
    - "5432"
web:
  build: .
  command: bundle exec rails s -p 3000 -b '0.0.0.0'
  volumes:
    - .:/myapp
  ports:
    - "3000:3000"
  links:
    - db
```


## プロジェクトのビルド

これで Django プロジェクトを `docker-compose run` で開始できます。

```
$ 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
```

新しい `Gemfile` の `therubyracer` をアンコメントし、Javascript ランタイムを入手します。

```
gem 'therubyracer', platforms: :ruby
```

これで新しい `Gemfile` ができましたので、イメージを再構築する必要があります（ Dockerfile 自身の変更時にも、再構築を行います）。

```
$ docker-compose build
```

## データベースへの接続

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

新しく `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 でアプリケーションが動作します（ Boot2docker を使っている場合は、`boot2docker ip` で IP アドレスが分かります）。