docker-composeを用いたPosgreSQL+Railsのwebアプリローカル環境構築

# はじめに
今回Railsでマッチングアプリを開発しようと思いまして、ローカル環境構築にdocer-composeを用いました。

DBはPostgreSQLを採用しています。

引くほど詰まりまくったので記録を残しておこうと思います。

# 環境
- macOS Catalina 10.15.4
- ruby 2.6.3
- rails 2.5.3
- docker for mac 2.2.0.4
- PostgreSQL 12.2

# [1]作業ディレクトリを作成して移動

```:terminal
% mkdir app(好きな名前)

% cd app

% pwd 
~/app
```

ここに作業コンテナを作成します。



# [2]dockerを立ち上げるのに必要なファイルを作成

ここでは、docker-composeでスケルトンアプリを立ち上げるのに必要なファイルを作成していきます。

簡易パスワードで作ったので面倒くさがりな方は基本コピペで大丈夫です笑


## Dockerfileの作成

Dockerfileにはdocker-composeでコンテナを立ち上げる際に必要な処理を記述します。

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

ENV APP_ROOT /app
WORKDIR $APP_ROOT

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

RUN bundle install


ADD . $APP_ROOT
```


## docker-compose.ymlの作成

ここではwebとpostgresという２つのコンテナを立ち上げます。

postgresコンテナでDBを、webコンテナでrailsを立ち上げます。

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

```

## Gemfileの作成

ここで```bundle install```するためのRubyやRailsのバージョンを指定します。


```:terminal
% vi Gemfile
```

```:Gemfile
source 'https://rubygems.org'

ruby '2.6.3'
gem 'rails', '5.2.3'
```

ちなみにdocker開発では、でgemの変更を反映させるにはその都度```docker-comopose build```を行う必要があります。


## Gemfile.lockの作成

ここで空の```Gemfile.lock```を作成しておきます。

``` :terminal
% touch Gemfile.lock
```

# [3]rails newする

webコンテナでrailsを起動してスケルトンアプリを作成します。
 
   
```:terminal
docker-compose run web rails new . --force --database=postgresql --skip-bundle 
``` 

## database.ymlを修正する

railsに必要なファイルが自動で作成されているはずなので、ここで```config```ディレクトリにある```database.yml```を修正します。

```:./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 #追加
...
```

## docker-compose build & upする

```:terminal
% docker-compose build
% docker-compose up -d # -d はバックグラウンド処理
```

## db:createする

今後railsに関わる作業は基本的に```docker-compose run web```でコンテナ内のrailsを操作します。


```:terminal
% docker-compose run web db:create
```

```docker-compose ps```でコンテナの状態を確認しましょう。

```:terminal
% docker-compose ps                                                                                                                                     
         Name                        Command               State                Ports              
---------------------------------------------------------------------------------------------------
matching_app_postgres_1   docker-entrypoint.sh postgres    Up      0.0.0.0:5432->5432/tcp
web                       bundle exec rails s -p 300 ...   Up      0.0.0.0:3000->3000/tcp                  
```
コンテナも無事立ち上がっていますね。

DBも作成したので、```localhost:3000```にアクセスしてみましょう。

ここで"yay"の画面が返ってきたらローカル環境の立ち上げは成功です！！

# PosticoでDBにアクセスする

Posticoという超絶便利なツールがありまして、GUIで直感的にDBを操作することができます。
Dockerで立ち上げたDBにアクセスするのが難しかったので、そちれについても記事を書きたいと思います！

Postico記事 -> https://qiita.com/Rick516/items/5dfb754005e8c3f3fd6d

# 参考記事
- https://qiita.com/jungissei/items/c58bd1158cd909540b26
- https://qiita.com/azul915/items/5b7063cbc80192343fc0