Docker + Rails 6 + PostgreSQL による Web アプリケーション開発の始め方

要旨

  • Dockerを用いてRuby on Rails 6.0によるWebアプリケーション開発を行う手順をできるかぎり簡潔にまとめた。
  • Docker Composeを用いてデータベースサーバーのコンテナとWebサーバーのコンテナを管理する方法についても解説する。

対象OS

Windows 10 ProでもDockerを用いてRails開発を行うことができますが、用語や手順で相違点が多いので今回は対象外とします。

【更新】 Windows編を書きました。

注意事項

この記事は2019年2月16から18日の間に書かれています。Ruby on Rails 6.0のリリースが予定されているのは2019年4月末です。現時点での最新版である Rails 6.0.0.beta1 に基づいています。今後、内容に訂正が必要となる可能性が十分にあります。

はじめに

この記事ではDockerと呼ばれるソフトウェアを用いてRuby on Rails 6の開発環境を構築する手順を紹介します。Dockerをインストールする対象のOS(ホストOS)は、macOSUbuntu 18.04 (64bit)とします。

ゲストOSにはAlpine Linuxを採用しました。インストールに必要なストレージ容量が非常に小さいことが特長です。

Dockerを用いて構築されたゲストOSの環境はコンテナと呼ばれます。この記事では、データベースサーバー(PostgreSQLサーバー)のためのコンテナとWebサーバー(Railsアプリケーション)のためのコンテナ、計2個のコンテナを作ります。これらのコンテナをうまく組み合わせるためにDocker Composeと呼ばれるソフトウェアを使用します。

コンテナを実行するのに必要なファイルシステムディレクトリ、ファイル、メタ情報の集合体)をイメージと呼びます。イメージはWebサービスDocker Hubを通じて配布されます。

また、この記事では設定ファイル等の取得にGitを使用します。ホストOSに合わせて、最新のGitをインストールしてください。

Docker Hubアカウントの取得

Docker自体のインストーラやDockerイメージを取得するためには、Docker Hubのアカウントが必要となります。メールを受け取れるアドレスがあれば、無料で取得できます。未取得の方は、次のURLを訪問して登録してください。

https://hub.docker.com/signup 

Docker Hubにログインしてから次の手順に進んでください。

Docker/Docker Composeのインストール

macOSの場合

https://hub.docker.com/editions/community/docker-ce-desktop-mac から Docker Desktop for Macインストーラをダウンロードしてインストールしてください。Dockerと同時にDocker Composeもインストールされます。

Ubuntuの場合

ターミナルで以下のコマンド群を順に実行し、Dockerをインストールします。

$ sudo apt-get update
$ sudo apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
$ sudo apt-get update
$ sudo apt-get install -y docker-ce docker-ce-cli containerd.io

詳しくは https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-using-the-repository を参照してください。

さらに、以下のコマンド群を順に実行し、Docker Composeをインストールします。

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" \
    -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

1.23.2 の部分は、Docker Composeのバージョン番号です。

詳しくは、https://docs.docker.com/compose/install/#install-compose を参照してください。

$ sudo gpasswd -a $USER docker

Ubuntuからログアウトし、ログインし直します。

docker login

ターミナルで次のコマンドを実行し、Docker Hubにログインします。

$ docker login

Docker Compose用の設定ファイル群の取得

$ git clone https://github.com/oiax/rails6-compose.git
$ cd rails6-compose

コンテナ群の構築・起動

$ setup.sh
$ docker-compose up -d

オプション -d により、コンテナ群が detached mode で起動します。すなわち、コンテナ群がバックグランドで動き始めます。

ターミナルに次のようなメッセージが表示されれば OK です。

Starting rails6compose_db_1 ... 
Starting rails6compose_db_1 ... done
Starting rails6compose_web_1 ... 
Starting rails6compose_web_1 ... done

【参考】 setup.sh の中身

setup.sh は次のような bash スクリプトです。

#!/bin/bash
set -eu

docker pull oiax/rails6-deps:latest

case "$OSTYPE" in
  darwin*)
    docker-compose build web
    ;;
  linux*)
    docker-compose build --build-arg UID=$(id -u) --build-arg GID=$(id -g) web
    ;;
  *)
    echo "Unknown OS Type: $OSTYPE"
    ;;
esac

まず、docker pull コマンドでベースとなるイメージの最新版を取得しています。

続いて、docker-compose build コマンドで Web コンテナを構築します。このとき、ホスト OS とコンテナの間でソースコード等を共有するときに、ファイルやディレクトリの所有権に関する問題が発生しないように --build-arg オプションを不可しています。この問題は Linux 版の Docker で発生しますが、macOS 版では発生しません。

参考資料:

コンテナ群の状態の確認

$ docker-compose ps

コンテナ群が正常に起動していれば次のような結果が出力されます。

       Name                      Command              State           Ports
------------------------------------------------------------------------------------
rails6compose_db_1    docker-entrypoint.sh postgres   Up      5432/tcp
rails6compose_web_1   /bin/sh                         Up      0.0.0.0:3000->3000/tcp 

Webコンテナへのログイン

$ docker-compose exec web bash

develユーザーとしてAlpine Linuxにログインします。パスワードなしでsudoを実行する権限が与えてあります。

Rails 開発に最低限必要と思われるパッケージ群は入っていますが、もし足りないパッケージがあれば apk コマンドでインストールしてください。

Railsアプリケーションの開発の要点

  • rails コマンドや bundler コマンドを用いた各種作業は、Webコンテナにログインして行います。
  • ソースコードの編集はホストOS側のテキストエディタで行います。

https://github.com/oiax/rails6-compose/blob/master/RAILS.md に具体的な操作例がありますので、参考にしてください。

Rails アプリケーションの起動

ホスト OS のターミナルで、次のコマンドを実行します。

$ docker-compose exec web bash -c 'cd /apps/myapp; bin/webpack-dev-server'

さらに別のターミナルを開き、次のコマンドを実行します。

$ docker-compose exec web bash -c 'cd /apps/myapp; bin/rails s'

コンテナの停止

$ docker-compose stop

コンテナの破棄

$ docker-compose down

おわりに

私がこの記事を書こうと思ったきっかけは、2014年刊行の拙著『実践Ruby on Rails 4 現場のプロから学ぶ本格Webプログラミング』の改訂版を出したいという打診をインプレスの編集者から受けたことです。

この本ではVagrantを使って開発環境を構築しましたが、改訂版ではDockerを利用したいと考えました。原稿を書き始める前にブログ記事を書いて知識をアップデートしておこう、ということです。あわよくば読者の方からフィードバックをもらって間違いを潰しておきたい、という意図もあります。

この記事を書くにあたっては、Dockerの公式ドキュメントにある「Quickstart: Compose and Rails」(以下、「Quickstart」と呼びます)を参考にしました。

https://docs.docker.com/compose/rails/

ただし、両者の間には重要な相違点があります。Quickstartでは docker-compose up コマンドの結果、自動的にRailsアプリケーションが起動しますが、私の記事では手動で起動しなければなりません。私の手順の方が少し面倒ですが、わかりやすさを優先しました。

この記事で紹介しているのは、あくまでDockerを用いて手早くRails開発環境を構築する方法です。構築した開発環境の設定をチームで共有したり、実運用(本番)環境にRailsアプリケーションをデプロイしたりするのは、また別の話になります。

この記事についての質問は、ブログ上のコメント欄の他にメールでも受け付けます。hermes@oiax.jp までご連絡ください。