DockerでRails・PostgreSQL構築

# 概要

* Dockerを使用したRailsの開発環境を構築
* DBはPostgreSQLを使用
* ローカル開発環境で構築(PostgreSQLのユーザー名、パスワードは簡易なものを使用)

＞＞[MySQLはこちら](https://qiita.com/jung_issei/items/7999512f63863a5bddb5)

# 前提
* Mac、Windows10のローカル開発環境で動作
* 「Docker for Windows」か「Docker for Mac」がインストール済みであること

## ディレクトリ構造

```terminal
├─src
│  ├─Gemfile
│  └─Gemfile.lock
├─Dockerfile
└─docker-compose.yml

```

## 準備するファイル

ディレクトリ構造にある4つのファイルの内容は下記になります。
 
 
 

### Dockerfile

```dockerfile:Dockerfile
FROM ruby:2.6.3
ENV LANG C.UTF-8

RUN apt-get update -qq && \
    apt-get install -y build-essential \
            libpq-dev \
            nodejs

RUN mkdir /app
RUN mkdir /app/src

ENV APP_ROOT /app/src
WORKDIR $APP_ROOT

ADD ./src/Gemfile $APP_ROOT/Gemfile
ADD ./src/Gemfile.lock $APP_ROOT/Gemfile.lock

RUN bundle install


ADD . $APP_ROOT

```

### docker-compose.yml(※WindowsとMacで記述を分ける箇所有)

```yml:docker-compose.yml
version: '3'
services:
  postgres:
    image: postgres
    ports:
      - "3306:3306"
    volumes:
      - ./tmp/db:/var/lib/postgresql/data #MacOSの場合
      - app_postgre:/var/lib/postgresql/data #Windowsの場合
    environment:
      POSTGRES_USER: 'admin'
      POSTGRES_PASSWORD: 'admin-pass'
    restart: always
  app:
    build: .
    image: rails
    container_name: 'app'
    command: bundle exec rails s -p 80 -b '0.0.0.0'
    ports:
      - "80:80"
    environment:
      VIRTUAL_PORT: 80
    volumes:
      - ./src:/app/src
    depends_on:
      - postgres
    restart: always

#下記はWindowsの場合追加
volumes:
  app_postgre:
    external: true

```

※PostgreSQLはWindowsではマウントできないようなので、参照先を外部に指定します。


### Gemfile

```Gemfile:src/Gemfile
source 'https://rubygems.org'
ruby '2.6.3'
gem 'rails', '5.2.3'
```

### Gemfile.lock
ファイルの中身は空でOK

```Gemfile.lock:src/Gemfile.lock

```


# 手順

## ボリューム作成(※Windowsの場合のみのコマンド)
```terminal
$ docker volume create --name app_postgre
```
※PostgreSQLはWindowsではマウントできないようなので、参照先を外部にするためのコマンドです。

## スケルトンアプリ作成

```terminal
$ docker-compose run app rails new . --force --database=postgresql --skip-bundle
```

## database.ymlを修正

```yml:src/config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: admin
  password: admin-pass
  host: postgres
```

## イメージ再ビルド
※処理完了までちょっと時間がかかることがあります。。。

```terminal
$ docker-compose build
```

## コンテナ立ち上げ

```terminal
$ docker-compose up -d
```

## PostgreSQLにRailsのDBを作成

```terminal
$ docker-compose run app rails db:create
```

これで、[http://localhost](http://localhost)にブラウザでアクセスすると、Railsのインストール完了画面がでてきました。

## トップページ作成
とりあえずトップページを表示させたい場合は下記コマンドを実行

```terminal
$ docker-compose run app rails g controller Home top
```

「get 'home/top'」を「root to: 'home#top'」を変更

```ruby:config/routes.rb
#　・・・

root to: 'home#top'

#　・・・
```

# インストール後の作業

私の記事ですが、下記の手順もまとめましたので、参考にしていただければ幸いです。

[【Rails】「config」の使い方 - Qiita](https://qiita.com/jung_issei/items/133a18dc1095d0be557f)
サイトから送信するSMTPサーバー情報や、ソーシャルログインなどで使用するAPIキーをGitにアップロードする際に、外部に情報が流出させないようにする設定です。

[【Rails】Bootstrap4・jQueryを適用](https://qiita.com/jung_issei/private/e8841a44ce880b2f7b2f)
フロントでBootstrap4とjQueryを適用して構築したい時は便利

[Font Awesome適用](https://fontawesome.com/kits/a5ec3dea41/use?welcome=yes)
アイコンを気軽に使用したい時はこちらが便利。メールアドレスの登録・アンケート回答すると、無料でたくさんのアイコンが使用できます。

[【devise】メール認証のサインアップ・イン・アウト機能](https://qiita.com/jung_issei/items/a3bb837cfdedda7b5d85)
メール認証で、サイトに新規会員登録機能や、ログイン・ログアウト機能を搭載する設定です。

[【Rails】【Devise】twitter・Facebookログイン実装](https://qiita.com/jung_issei/items/f569b6e0ed75672c8c29)
上記のメール認証に加えてソーシャルログイン機能を実装する手順です。