やる気がストロングZERO

やる気のストロングスタイル

Railsの開発環境とステージング環境をDockerを使って構築したのでメモ

Railsの開発環境とステージング環境をDockerを使って構築してみた。
注意:Docker周りインフラ周りについてエキスパートではないので本当にこれが要求を満たせているのかは不明

ディレクトリ構成

.
├── app
│   ├── Dockerfile  # webサーバー構築用
│   ├── conf.d 
│   │   └── rails_app.conf  # nginxの設定ファイル
│   ├── rails_app/  # railsアプリのルートディレクトリ
├── db
│   ├── data/  # dbの実データのマウントディレクトリ
│   └── db_init.sql  # db初期化時に実行するスクリプト(dbとuserの作成)
└── docker-compose.yml

./docker-compose.yml

version: '3'

services:
  app:
    build: ./app/
    volumes:
      - ./app/log/nginx:/var/log/nginx
      - ./app/conf.d:/etc/nginx/conf.d
      - ./app/rails_app:/app
    ports:
      - "80:80"
    depends_on:
      - db
  db:
    image: postgres
    ports:
      - "5432:5432"
    volumes:
      - ./db/data/data:/var/lib/postgresql/data
      - ./db/db_init.sql:/docker-entrypoint-initdb.d/db_init.sql

・DBサーバーとWEBサーバーを使ってrailsアプリを動作させるための設定
・./app/DockerfileにNginxとRubyrailsのインストールと起動コマンドが記載されている
・volumesのマウント系はDockerfileに書こうとすると絶対パスで書かないといけない?っぽかったのでこちらに書いた。(どちらになにを書くべきなのか理解がまだあやふや)
・現状はrailsアプリコードをvolumeでマウントするようにしているが、railsが生成するキャッシュファイルなどがroot権限で作成されてしまい、ホスト側から触りづらいので、マウントではなくcopyやaddなのでイメージに含めてしまうのがいいのかも。(で、キャッシュファイルなどを保存したければ個別にvolumeマウント設定をしておく)

・- ./db/data/data:/var/lib/postgresql/data
DBのvolumeマウントについて、dockerが管理するvolumeに任せることもできるみたいだったが、ディレクトリ内にファイルとして存在してくれていたほうが管理しやすいと思っているのでプロジェクトディレクトリ内にマウントする。

・- ./db/db_init.sql:/docker-entrypoint-initdb.d/db_init.sql
postgresqlの初期化時にdb_init.sqlを実行してもらう設定。
db_init.sqlの内容は、railsで使用するDBとuserを作成するsqlが書かれている。

./db/init_db.sql

railsで使用するDBとuserを作成するsqlが書かれている。
・fixtureの実行時にSUPERUSERであることが求められたのでSUPERUSERにした。

create role rails_app_dev login password 'rails_app_dev';
ALTER USER rails_app_dev WITH SUPERUSER;
create role rails_app_prod login password 'rails_app_prod';
ALTER USER rails_app_prod WITH SUPERUSER;

create database rails_app_dev;
ALTER DATABASE rails_app_dev OWNER TO rails_app_dev;

create database rails_app_prod;
ALTER DATABASE rails_app_prod OWNER TO rails_app_prod;

create database rails_app_test;
ALTER DATABASE rails_app_test OWNER TO rails_app_dev;

./app/Dockerfile

・NginxとRubyrailsのインストールと起動コマンドの設定。 ・bundle installをCMDでやっているがここでやるべきなのかわからないがとりあえず動くようだ

FROM ubuntu:18.04


WORKDIR /root


# ロケール設定
ENV LC_ALL C.UTF-8
ENV LANG C.UTF-8


# shellをbashに指定
SHELL ["/bin/bash", "-c"]


# 最新状態へ
RUN apt update
RUN apt -y upgrade


# 必要なコマンドインストール
RUN apt -y install build-essential wget zlib1g-dev libssl-dev libbz2-dev libreadline-dev libpq-dev


# nginxのインストール
RUN apt -y install nginx


# Rubyのインストール
RUN wget https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.1.tar.gz && \
tar zxvf ruby-2.6.1.tar.gz && \
cd ruby-2.6.1 && \
./configure && \
make && \
make install


# railsのインストール
RUN gem install rails


WORKDIR /app
EXPOSE 80
CMD (bundle install && rails assets:precompile RAILS_ENV=production && rails s -e production) & nginx -g "daemon off;"

./app/conf.d/rails_app.conf

・Nginxからpumaへリクエストが通るように設定

# 書籍 Ruby on Rails5 アプリケーションプログラミングを参考に記載。
upstream rails_app {
  server localhost:3000;
}


server {
  listen 80;
  server_name localhost;
  root /app/public;


  location / {
    try_files $uri @rails_app;
  }


  location @rails_app {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://rails_app;
  }


  error_page 500 502 503 504 /500.html;
}

./app/rails_app/config/database.yml

railsのDB設定

default: &default
  adapter: postgresql
  encoding: unicode
  port: 5432
  # For details on connection pooling, see Rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>


development:
  <<: *default
  host: localhost
  database: rails_app_dev
  username: rails_app_dev
  password: rails_app_dev


test:
  <<: *default
  host: localhost
  database: rails_app_test
  username: rails_app_dev
  password: rails_app_dev


production:
  <<: *default
  host: db
  database: rails_app_prod
  username: rails_app_prod
  password: rails_app_prod

seedなどの設定

割愛するが、本来なら再設定が必要なのかも(デフォルトでもインストール毎に違う値が初期設定されているっぽかったが)

運用方法

開発時

'・docker-compose up -d db'でDBサーバーコンテナを起動しておく。
rails_app/以下のコードを編集し、rails serverコマンドでテスト実行する。(localhost:3000へアクセス)

ステージング環境テスト時

docker-composer up -d でWEBサーバーコンテナとDBサーバーコンテナを起動し localhost:80で確認する