DockerでRails + MySQLの開発環境を構築

スポンサーリンク

Docker で MySQL を使った Ruby on Rails の開発環境を構築してみたので、その作業メモです。Docker for Mac のおかげで、Docker がかなり使いやすくなっていました。

— 環境 —
Docker version 1.12.0
Ruby 2.3.1
Rails 5.0.0.1
Mac OS X El Capitan

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

Docker for Mac をインストール

まずは、以下の Getting Started に沿って Docker をインストールします。

Getting Started

Docker でよく使うコマンド等に慣れておくと進めやすいかと。よく使うコマンドについては、以前に書いた Docker 入門記事もご参考下さい。

Docker入門、VM上でLinuxコンテナ立ち上げ〜基本操作まで | EasyRamble

Docker の Rails チュートリアル通りに進める

Docker 公式サイトの Rails チュートリアルに沿って進めます。あらかじめインストールした Docker を起動させておきます。

Quickstart: Compose and Rails

Dockerfile の内容やデータベースに MySQL を使う点などを公式チュートリアルから変更しました。

Dockerfile の作成

最初に Dockerfile の作成です。Dockerfile は利用する image(イメージ)、および実行される container(コンテナ)の構成内容をコードで記述するファイルとなります。

以降の作業は myapp ディレクトリで行うとします。

Dockerfile

Dockerfile で使われる命令は割と理解しやすい書き方です。公式ドキュメントが充実しているので、それを見れば困ることはないかと思います。

Dockerfile リファレンス Docker-docs-ja 1.12.RC ドキュメント

WORKDIR を /tmp に指定して、Gemfile や Gemfile.lock などを ADD した後に bundle install を実行しているのは、Gemfile と Gemfile.lock に変更がない場合はキャッシュを使ってビルド時間を短縮するためです。これがないと、後述する docker-compose build の度に bundle install が走り毎回ビルドに時間がかかってしまう。詳しくは以下。

RailsアプリをDockerにデプロイするときにGemfileを変更してなければBundle Installをスキップする方法 – ワザノバ | wazanova
Docker で bundle install を爆速にする – Qiita

Gemfile や Gemfile.lock に変更があったら bundle install が走ります。

/tmp ディレクトリを使う他に、BUNDLE_PATH を指定して、そのパスを別コンテナから volume としてマウントする方法もあるようです。

How to cache bundle install with Docker Medium
Make bundler fast again in Docker Compose
Docker Compose でローカルの Rails 開発環境を作る – Qiita

Gemfile, Gemfile.lock の作成

Gemfile を以下の内容で作成。

Gemfile

続いて空の Gemfile.lock を作成。

Gemfile.lock

Gemfile, Gemfile.lock はビルド後に上書きされます。

docker-compose.yml の作成

docker-compose.yml は複数のコンテナから構成されるサービスを yaml で定義するファイルです。生成するサービスごとに、使う image の設定や実行するコマンド、ポート開放などの設定を行います。

docker-compose.yml

docker-compose.yml の書き方は以下。

Compose ファイル・リファレンス Docker-docs-ja 1.12.RC ドキュメント

web の build は Dockerfile のパスを指定します。

ここまでのファイルを作成して、ディレクトリ構成は以下のようになりました。

Docker Compose でビルド

ここで rails new を実行して、Rails アプリケーションを生成します。以下のコマンドを実行。

Rails アプリケーションが生成されたことを確認。

JavaScript runtime 用に therubyracer の gem インストールを有効にします。

Gemfile

docker-compose.yml を使ってビルドを実行します。

docker-compose.yml や Dockerfile を編集した場合には、この docker-compose build を実行して image を作成する。

config/database.yml の設定

MySQL への接続情報を config/database.yml で設定します。

config/database.yml

host に db コンテナを指定する点に注意です。デフォルトの host: localhost だと、Docker で実行する環境の web コンテナと db コンテナが別なのでDB接続できない。

Docker コンテナ実行&ブラウザ確認

ここまでで Docker で実行するコンテナ環境や Rails アプリケーション側の準備は終了です。Docker コンテナを実行して、Rails アプリケーションとサーバーが起動した状態にします。以下コマンドを実行。

これで Docker コンテナが実行された状態となり、Rails の開発用サーバーが起動した状態になる。

続いて、ターミナルの別タブでデータベースを作成します。

ブラウザで localhost:3000 にアクセスしますと…出ました!カッコイイ! Rails 5 の画面です。

Screen Shot 2016-09-06 at 10.08.32

あとは、Rails アプリケーションを開発していきます。おつかれさまでした!

他にやることまとめ

他にやらなきゃいけないことのリスト。

・開発環境ということで MySQL のパスワードを直書きしているが、production 運用を考えるなら環境変数などから設定する必要がある。

・Docker コンテナは生成・破棄が前提となるので、MySQL データベースのデータをちゃんと保存する必要がある。DB コンテナの破棄とともにデータが吹っ飛んだら大変。DB データ部分だけ、データ専用の別コンテナに切りだすとか、本番環境ではマネージド型の DB を使うとか。

・本番環境で運用する場合のデプロイ方法を考える。DockerHub を使う、自分で Docker Registry を立てる等。本番環境で Docker Compose でビルドするやり方もありなのだろうか?

・ログ管理や監視ツールなどの導入。

本番環境での Docker 運用を考えると、他にも色々と疑問だったりやらなきゃいけないことがありますが、Docker の便利さは素晴らしすぎて感動レベルです。image さえ手元にあれば、ビルド時間がとても短いのがいい。もう少し使いこなせるようになれば、Chef 等でサーバーの冪等性を頑張るより楽できそうな期待があります。

あと Docker の勉強で「プログラマのための Docker 教科書」という本を最近読んだのですが、この本が超絶分かりやすかったです。Docker の理解や使い方の学習が一気に進みました。

その他、参考にさせて頂いたサイトを紹介。ありがとうございました。

スポンサーリンク
 
スポンサーリンク

Leave Your Message!