Ruby / Rails

DockerでRails+PostgreSQLの環境構築を解説

2019年7月15日

こんにちは、Nanayakuです。

今回は、Dockerの公式ドキュメントの「Quickstart: Compose and Rails」について解説していきます。

開発環境

  • mac OS
  • Docker version 18.09.2

目次

環境構築する前に

Dockerをインストールしましょう。

 

プロジェクトの定義

アプリケーションのディレクトリ・ファイルを作成します。

ディレクトリを作成する場所はどこでも大丈夫です。

私はデスクトップに作成しました。

$ mkdir ディレイ名

$ cd ディレイ名

 

Dockerfileの作成

Dockerfile」とは、コンテナイメージを自動作成する手順をまとめたファイルのことです。

以下のコマンドで作成できます。

$ touch Dockerfile

$ open Dockerfile

他のやり方として、

$ vi Dockerfile

このコマンドで、ファイルの作成と編集ができます。

編集した後の「:wq」このコマンドで保存・終了することが出来ます。

 

Dockerfileには拡張子をつけません。

他のファイルも同じで、拡張子がついていないものはそのままで大丈夫です。

Dockerfileには↓の設定を定義します。

Dockerfile

FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

 

Dockerfileの主要な命令

FROM

作成するDockerイメージのベースとなるイメージを指定します。

今回の場合は「rubyのversion2.5」を指定しています。

他にもPHP、MySQLなどあり、DockerHubから選択します。

RUN

Dockerのビルド(イメージの作成)時に、Docker内で実行するコマンドを定義します。

CMD

RUNと似ていて、こっちらもビルド時のDocker内で実行するプロセスを定義します。

RUNとCMDの違いは、RUNはアプリケーションの更新や配置を行い、CMDはアプリケーションそのものを動作させます。

COPY

Dockerを動作させるためのファイルやディレクトリを、Dockerコンテナ内にコピーします。

ENTRYPOINT

コンテナ内で最初に動作するコマンドを指定します。

 

Dockerfileの下記の部分は、Docker内にGemfileをコピーし、bundle installを実行することを定義しています。

COPY Gemfile /myapp/Gemfile

COPY Gemfile.lock /myapp/Gemfile.lock

RUN bundle install

 

Gemfileの作成

Gemfileを作成したら、下記を定義します。

$ vi Gemfile

Gemfile

source 'https://rubygems.org'
gem 'rails', '~>5'

Gemfile.lockは空のまま作成します。

$ touch Gemfile.lock

Gemfileは必要なgemリストで、Gemfile.lockは実際にインストールされたgemを記録するファイルです。

 

entrypoint.shファイルの作成

$ vi entrypoint.sh

entrypoint.sh

#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

このファイルはコンテナが起動した時、最初に実行されるコマンドを定義しています。

 

docker-compose.ymlファイルの作成

$ vi docker-compose.yml

docker-compose.yml

version: '3'
services:
db:
image: postgres
volumes:
- ./tmp/db:/var/lib/postgresql/data
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db

docker-compose.ymlは、複数のコンテナを実行するためのファイルです。

この場合は、データベースとrailsのコンテナを連携させ実行しています。

 

プロジェクトの構築

以下のコマンドを実行します。

$ docker-compose run web rails new . --force --no-deps --database=postgresql

「run」はイメージ・コンテナに対して1回のみ実行するコマンドです。

「run web rails new」は、docker-composeに対してwebサービスを開始し、rails newを1回のみ実行することを表しています。

「--force」は、「強制的に」と言う意味があります。

「--no-deps」は、runコマンドでリンクされたコンテナを起動させない命令です。

「--force --no-deps --database=postgresql」は、リンクされたデータベースの「postgresql」を起動させないと言う意味です。

 

$ ls -l

このコマンドで、生成されたファイル一覧を確認できます。

rails newで新しく「Gemfile」が生成されたので、もう1度buildする必要があります。

$ docker-compose build

 

データベースに接続

上記でアプリを起動することが出来るようになりましたが、railsとデータベースのコンテナが連携されていません。

そのため、railsのデータベースのデフォルト設定を変更しなければなりません。

「config/database.yml」の内容を以下の内容に書き換えます。

database.yml

default: &default
adapter: postgresql
encoding: unicode
host: db
username: postgres
password:
pool: 5

development:
<<: *default
database: myapp_development

test:
<<: *default
database: myapp_test

これで、アプリを起動できます。

起動には以下のコマンドを実行します。

$ docker-compose up

うまくいくと画像のようになります。

これでrailsとデータベース(postgresql)のコンテナを連携させられましたが、データベースは作成されていません。

そこで、新しくターミナルを開き、以下のコマンドを実行します。

$ docker-compose run web rake db:create

これで開発環境の構築は完了です。

「http://localhost:3000」で、Railsのウェルカムページが表示されるはずです。

webにアクセスすると、画像のようになります。

 

停止方法

サーバーは「control + c」で停止します。

コンテナ(アプリケーション)は以下のコマンドで停止します。

$ docker-compose down

 

再起動

アプリケーションを再び起動するには、もう1度upコマンドを実行します。

$ docker-compose up

 

まとめ

step
1
Dockerfileの作成

step
2
Genfileの作成

step
3
entrypoint.shの作成

step
4
docker-compose.ymlの作成

step
5
プロジェクト(compose)の構築

 

参考サイト

Rails環境をDockerで作ったら躓いた

Quickstart: Compose and Rails

 

最後に

今回作成したサンプルをGitHubにアップしています。

https://github.com/sabakan789/rails_sample

備忘録がわりに作ったので、間違っている所とかあったら、コメントくれると嬉しいです。

-Ruby / Rails
-

© 2024 Nanayaku blog Powered by AFFINGER5