- 更新日: 2016年9月6日
- Docker
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
Docker for Mac をインストール
まずは、以下の Getting Started に沿って Docker をインストールします。
Docker でよく使うコマンド等に慣れておくと進めやすいかと。よく使うコマンドについては、以前に書いた Docker 入門記事もご参考下さい。
Docker入門、VM上でLinuxコンテナ立ち上げ〜基本操作まで | EasyRamble
Docker の Rails チュートリアル通りに進める
Docker 公式サイトの Rails チュートリアルに沿って進めます。あらかじめインストールした Docker を起動させておきます。
Dockerfile の内容やデータベースに MySQL を使う点などを公式チュートリアルから変更しました。
Dockerfile の作成
最初に Dockerfile の作成です。Dockerfile は利用する image(イメージ)、および実行される container(コンテナ)の構成内容をコードで記述するファイルとなります。
1 2 3 |
$ cd /path/to/myapp |
以降の作業は myapp ディレクトリで行うとします。
Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 |
FROM ruby:2.3.1 ENV LANG C.UTF-8 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs RUN gem install bundler WORKDIR /tmp ADD Gemfile Gemfile ADD Gemfile.lock Gemfile.lock RUN bundle install ENV APP_HOME /myapp RUN mkdir -p $APP_HOME WORKDIR $APP_HOME ADD . $APP_HOME |
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
1 2 |
source 'https://rubygems.org' gem 'rails' |
続いて空の Gemfile.lock を作成。
1 2 3 |
$ touch Gemfile.lock |
Gemfile.lock
1 |
# 空のままでいい |
Gemfile, Gemfile.lock はビルド後に上書きされます。
docker-compose.yml の作成
docker-compose.yml は複数のコンテナから構成されるサービスを yaml で定義するファイルです。生成するサービスごとに、使う image の設定や実行するコマンド、ポート開放などの設定を行います。
docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 |
version: '2' services: db: image: mysql web: build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - .:/myapp ports: - "3000:3000" depends_on: - db |
docker-compose.yml の書き方は以下。
Compose ファイル・リファレンス Docker-docs-ja 1.12.RC ドキュメント
web の build は Dockerfile のパスを指定します。
ここまでのファイルを作成して、ディレクトリ構成は以下のようになりました。
1 2 3 4 5 6 7 |
myapp |- Dockerfile |- Gemfile |- Gemfile.lock |- docker-compose.yml |
Docker Compose でビルド
ここで rails new を実行して、Rails アプリケーションを生成します。以下のコマンドを実行。
1 2 3 |
$ docker-compose run web rails new . --force --database=mysql --skip-bundle |
Rails アプリケーションが生成されたことを確認。
1 2 3 |
$ ls -la |
JavaScript runtime 用に therubyracer の gem インストールを有効にします。
Gemfile
1 |
gem 'therubyracer', platforms: :ruby |
docker-compose.yml を使ってビルドを実行します。
1 2 3 |
$ docker-compose build |
docker-compose.yml や Dockerfile を編集した場合には、この docker-compose build を実行して image を作成する。
config/database.yml の設定
MySQL への接続情報を config/database.yml で設定します。
config/database.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
default: &default adapter: mysql2 encoding: utf8 pool: 5 username: root password: password host: db development: <<: *default database: myapp_development test: <<: *default database: myapp_test |
host に db コンテナを指定する点に注意です。デフォルトの host: localhost だと、Docker で実行する環境の web コンテナと db コンテナが別なのでDB接続できない。
Docker コンテナ実行&ブラウザ確認
ここまでで Docker で実行するコンテナ環境や Rails アプリケーション側の準備は終了です。Docker コンテナを実行して、Rails アプリケーションとサーバーが起動した状態にします。以下コマンドを実行。
1 2 3 |
$ docker-compose up |
これで Docker コンテナが実行された状態となり、Rails の開発用サーバーが起動した状態になる。
続いて、ターミナルの別タブでデータベースを作成します。
1 2 3 |
$ docker-compose run web rake db:create |
ブラウザで localhost:3000 にアクセスしますと…出ました!カッコイイ! Rails 5 の画面です。
あとは、Rails アプリケーションを開発していきます。おつかれさまでした!
他にやることまとめ
他にやらなきゃいけないことのリスト。
・開発環境ということで MySQL のパスワードを直書きしているが、production 運用を考えるなら環境変数などから設定する必要がある。
・Docker コンテナは生成・破棄が前提となるので、MySQL データベースのデータをちゃんと保存する必要がある。DB コンテナの破棄とともにデータが吹っ飛んだら大変。DB データ部分だけ、データ専用の別コンテナに切りだすとか、本番環境ではマネージド型の DB を使うとか。
・本番環境で運用する場合のデプロイ方法を考える。DockerHub を使う、自分で Docker Registry を立てる等。本番環境で Docker Compose でビルドするやり方もありなのだろうか?
・ログ管理や監視ツールなどの導入。
本番環境での Docker 運用を考えると、他にも色々と疑問だったりやらなきゃいけないことがありますが、Docker の便利さは素晴らしすぎて感動レベルです。image さえ手元にあれば、ビルド時間がとても短いのがいい。もう少し使いこなせるようになれば、Chef 等でサーバーの冪等性を頑張るより楽できそうな期待があります。
あと Docker の勉強で「プログラマのための Docker 教科書」という本を最近読んだのですが、この本が超絶分かりやすかったです。Docker の理解や使い方の学習が一気に進みました。
その他、参考にさせて頂いたサイトを紹介。ありがとうございました。
- – 参考リンク –
- docker-compose で Rails 環境を構築する – Hack Your Design!
- Docker for Mac がずいぶん良いらしいので、Docker で Rails アプリを動かしてみた – えいのうにっき
- 新規RailsプロジェクトをDockerで始める手順 – Qiita
- Dockerでruby/alpineを使ってrails+mysql+redisの環境作成 – Qiita
- Docker の関連記事
- マストドン(Mastodon)のDockerインスタンスをさくらVPSに設置してみた
- Docker for MacでDocker.qcow2のサイズがどんどん大きくなる問題
- Docker入門、VM上でLinuxコンテナ立ち上げ〜基本操作まで
Leave Your Message!