Dockerを使ってRuby on Rails環境の構築をしてみる

仕事でdockerを使って開発環境を構築していたので、試しに自身のPCに環境を作ってみた。

#### (環境)
Mac(Sierra 10.12.6)

#### (参考)
https://docs.docker.com/compose/rails/#define-the-project
に沿って実施。

# 1.Docker for Macのインストール
https://docs.docker.com/compose/install/

# 2.Rails / PostgreSQLアプリケーションを設定
Docker Composeを使用してRails / PostgreSQLアプリケーションを設定する。

## 2-1.プロジェクト定義
開発していくディレクトリにアプリケーションを構築するために必要な4つのファイルを設定する。(viコマンドが使えるなら、そちらから作成すると楽かも)
・dockerfile
・Gemfile
・Gemfile.lock
・docker-compose.yml

*今回はPC内のUserフォルダ配下に作成
*プロジェクト名をmyappとして設定

```ruby:dockerfile
FROM ruby:2.4.1

ENV LANG C.UTF-8
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
COPY . /myapp
```

```ruby:Gemfile
source 'https://rubygems.org'
gem 'rails', '5.0.0.1'
```

```ruby:Gemfile.lock(空のファイル)

```

```ruby:docker-compose.yml
version: '3'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
```

## 2-2.プロジェクトの構築
作成した4つのファイルを利用してdocker-compose runを実行し、アプリケーションを生成する。(ターミナルを使って実施)

```console
docker-compose run web rails new . --force --database=postgresql
```
ざっくりだが、以下のことを行なっている。
・dockerfileに記載の内容を見て、必要な情報(ライブラリ)を取り込む
・Rails newする
・bundle installする

アプリケーション生成後は、以下を実施する。

```console
docker-compose build
```

## 2-3.データベースの設定と作成
データベースの情報を設定するために、**config/database.yml**を変更し、コマンドでDBを作成する。

```config/database.yml(設定箇所のみ抜粋)
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password:
  pool: 5

development:
  <<: *default
  database: myapp_development


test:
  <<: *default
  database: myapp_test
```


データベースを作成する

```console
docker-compose run web rake db:create
```

作成が成功すると、以下のコマンドが表示される。

```console
myapp "User"$ docker-compose run web rake db:create
Starting appname_db_1 ... 
Starting appname_db_1 ... done
Created database 'myapp_development'
Created database 'myapp_test'
MACuser-no-MacBook-Air-2:myapp
```

## 2-4.dockerを起動
dockerを起動し、ローカル環境のページにアクセスする。

```console
docker-compose up
```

実行すると以下のコマンドが表示される。

```console
appname_db_1 is up-to-date
Starting appname_web_1 ... 
Starting appname_web_1 ... done
:
:
web_1  | => Rails 5.1.1 application starting in development on http://0.0.0.0:3000
web_1  | => Run `rails server -h` for more startup options
web_1  | Puma starting in single mode...
web_1  | * Version 3.11.3 (ruby 2.4.1-p111), codename: Love Song
web_1  | * Min threads: 5, max threads: 5
web_1  | * Environment: development
web_1  | * Listening on tcp://0.0.0.0:3000
web_1  | Use Ctrl-C to stop
```

**http://localhost:3000**にアクセスして、ようこそページが表示されれば、構築完了。
![スクリーンショット 2018-04-08 23.13.43.png](https://qiita-image-store.s3.amazonaws.com/0/248644/ccd15d73-f6ce-9c59-a7bc-5ec73d1e43ff.png)

# その他(アプリケーションの停止)
アプリケーションの停止はプロジェクトディレクトリでdocker-compose downを実行する。

・別のターミナルウィンドウを表示し、プロジェクトディレクトリから実施

```console
myapp "User"$ docker-compose down
Stopping appname_web_1 ... done
Stopping appname_db_1  ... done
Removing appname_web_1 ... done
Removing appname_db_1  ... done
Removing network appname_default
myapp "User"$
```

・downするともう一つのターミナル(docker-compose upした側)も停止の実行結果が表示される

```console
web_1  | - Gracefully stopping, waiting for requests to finish
web_1  | === puma shutdown: 2018-XX-XX XX:XX:XX +0000 ===
web_1  | - Goodbye!
web_1  | Exiting
appname_web_1 exited with code 1
db_1   | 2018-XX-XX XX:XX:XX.XXX UTC [1] LOG:  received smart shutdown request
db_1   | 2018-XX-XX XX:XX:XX.XXX UTC [1] LOG:  worker process: logical replication launcher (PID 64) exited with exit code 1
db_1   | 2018-XX-XX XX:XX:XX.XXX UTC [59] LOG:  shutting down
db_1   | 2018-XX-XX XX:XX:XX.XXX UTC [1] LOG:  database system is shut down
appname_db_1 exited with code 0
myapp  "User"$ 

```