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とRubyとrailsのインストールと起動コマンドが記載されている
・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とRubyとrailsのインストールと起動コマンドの設定。 ・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で確認する