DockerでRails API+PostgreSQLの環境構築メモ
目的
初めてDockerで環境構築を行ったときの構築手順のメモです。
環境
Laptop: Windows 10 Pro
Docker: Docker for Windows
方針
- Ruby on Railsではバックエンド用に
--api
で構築。localhost:3000
で立ち上げる。 - データベースはPostgreSQLを使用。
構成
初期のファイル構成です。ローカル環境にprojectapp
フォルダ、その中にサーバーサイド用のフォルダapiを作ります。各ファイルについて順番に見ていきます。
projectapp
|-- docker-compose.yml
|-- api
|-- Gemfile
|-- Gemfile.lock
|-- Dockerfile
Rails + PostgreSQLの構築
(参考)
Ruby on Railsのコンテナを作成するためのDockerfileを作ります。
FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
Gemfileを作ります。後ほどrails new
で上書きされます。
source 'https://rubygems.org'
gem 'rails', '~>5'
Gemfile.lock
を作る。中は空白。次はdocker-compose.yml
を作成します。
version: '3'
services:
api:
build: ./api
ports:
- '3000:3000'
command: /bin/sh -c "rm -f /myapp/tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- ./api:/myapp
depends_on:
- db
db:
image: postgres
volumes:
- dbdata:/var/lib/postgresql/data
ports:
- '5432:5432'
volumes:
dbdata:
データサーバ用に永続化したDocker volumeをビルドします。
servicesで指定したapiのDokerfileに記載した順に従いrubyのimageをビルド、ローカルのGemfile, Gemfile.lockをコンテナにコピーし、コンテナ上にrails new
でrailsプロジェクトを作成します。
docker-compose run api rails new . --api --force --skip-bundle --database=postgresql
次に、config/database.ymlのdefault部分を変更します。
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 } %>
development:
<<: *default
database: postgres
username: postgres
password:
host: db
Railsがpostgresサーバに接続できるように設定変更ができたので、docker-composeでapiとdbをビルド・起動します。
# コンテナをビルド
$ docker-compose build
# コンテナの作成&起動(バックグラウンド)
$ docker-compose up -d
うまく起動したらlocalhost:3000
に接続できます。
下記でログが見られます。
$ docker-compose logs -f api
まとめ
構築した後のファイル構成を示します。
projectapp
|-- docker-compose.yml
|-- api
|-- app
|-- bin
|-- config
|-- db
|-- lib
|-- log
|-- public
|-- test
|-- tmp
|-- vender
|-- .gitignore
|-- config.ru
|-- Gemfile
|-- Gemfile.lock
|-- Dockerfile
|-- Rakefile
|-- README.md
|-- Gemfile
|-- Gemfile.lock
|-- Dockerfile
フロントサイドとしてReact用を追加した場合は、次の記事に続きを書きました。
2019年10月26日
[…] 前回はDocker上でRails API+PostgreSQLの環境構築を行ったので、今回はその続きでReactでのフロントエンドもdocker-composeに追加しました。 […]