要旨
- 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)は、macOSとUbuntu 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を訪問して登録してください。
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 の中身
#!/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 版では発生しません。
参考資料:
- https://stackoverflow.com/a/44683248/513554
- https://qiita.com/yohm/items/047b2e68d008ebb0f001
- https://qiita.com/nacika_ins/items/cf8ceb20711bd077f770
コンテナ群の状態の確認
$ 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アプリケーションの開発の要点
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」と呼びます)を参考にしました。
ただし、両者の間には重要な相違点があります。Quickstartでは docker-compose up
コマンドの結果、自動的にRailsアプリケーションが起動しますが、私の記事では手動で起動しなければなりません。私の手順の方が少し面倒ですが、わかりやすさを優先しました。
この記事で紹介しているのは、あくまでDockerを用いて手早くRails開発環境を構築する方法です。構築した開発環境の設定をチームで共有したり、実運用(本番)環境にRailsアプリケーションをデプロイしたりするのは、また別の話になります。
この記事についての質問は、ブログ上のコメント欄の他にメールでも受け付けます。hermes@oiax.jp までご連絡ください。