DockerでRailsとMySQLの環境構築
はじめに
こんにちは。データ事業二部マネージャーの栁原雄基です。
学生時代は宇宙物理学の分野に身を置き、宇宙の神秘と対話しておりました。
現在は常にクライアントとの対話を心がけ、よりよいソリューション提供に努めております。
本記事ではdockerを利用したRuby on Rails + MySQLの開発環境の構築の手順を説明いたします。
今回ご紹介する方法は、開発に利用するため構成です。
運用に利用する場合はこれとは違った設定になります。
そちらは今後紹介できたらと考えています。
利用した環境は以下です。
・マシン : MacBook Pro (Retina, 13-inch, Early 2015)
・OS : OS X El Capitan Version 10.11.6
背景
ある案件では、Ruby on RailsとMySQLで構成された社内ツールを提供しております。
以前はVirtualBoxで上記ツールの開発環境を作り開発を行っていました。
その頃は、自分のノートPCに仮想環境を作り、rbenvを導入し、何故かこのgemインストールできない???あーMySQLも入れなきゃ…とやっていました。
そうすると気がついたら日が暮れている…ということもしばしば。
これに共感される方も多いかと思います。
それにくらべるとDockerによる仮想環境は比較的パフォーマンスがよく、他の作業者への共有も容易です。
環境をgitだけで共有出来る点がよいですね。
virtualboxの頃は、boxを作ってs3にアップしたりとか面倒でしたが。
僕も社用PCの乗り換えをきっかけにDockerを始めることにしました。
Dockerの詳しい説明は他の記事に譲ることにし、具体的な作業を説明します。
作業手順
作業手順は以下の通りです。
今回の目指す環境がrailsとmysqlが連携したものであるためdocker-composeを利用します。
1, docker-compose.yml作成
2, Dockerfile作成
3, ビルド及び起動とデータ投入
試行錯誤の末、以下の構成になりました。
以下で作成する2ファイルは、既存のrailsプロジェクトのルートディレクトリに置かれる想定です。
これによりgitの管理に含まれます。
docker-compose.yml作成
docker-composeは複数のイメージを連携してコンテナを作成するときに利用します。
念のため補足しますと、コンテナ(Dockerコンテナ)とは、イメージ(Dockerイメージ)から作られる実体ということになります。
オブジェクト指向の考え方における、クラスとインスタンスということですね。
料理で言えば、レシピと作られた料理の現物という関係になります。
今回はrailsのイメージとmysqlのイメージを利用するのでこれが必要です。
構成は以下のdocker-compose.ymlで定義します。
version: '3'
services:
mysql:
image: "mysql:5.7"
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
environment:
MYSQL_DATABASE: "***_web_development"
MYSQL_ROOT_PASSWORD: "***"
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
rails:
build: .
depends_on:
- mysql
volumes:
- .:/usr/src/app
- vendor_bundle:/usr/src/app/vendor/bundle
ports:
- "3000:3000"
entrypoint:
- bin/rails
- s
- -b
- 0.0.0.0
volumes:
mysql_data:
driver: local
vendor_bundle:
driver: local
上のファイルをいくつかに分けて説明していきます
以下の記述はdocker-composeの記法のバージョンを表しています。
今回はバージョン3を利用します。
version: '3'
以下の「services:」の記述は利用するイメージとその設定の諸々を指定しています。
イメージのバージョンは、今回はプロジェクトに合わせmysqlの5.7、railsの4.2.5.1に指定します。railsのバージョンは「build: .」という記述により以下で説明するDockerfileで指定されます。
あとはコード内に細かな解説を載せます。
同じ構成のアプリケーションの環境構築したことのある方には見覚えのある項目も多いかと思います。
services:
mysql:
image: "mysql:5.7"
ports: # ポート3306を利用する
- "3306:3306"
volumes: # 永続化のため
- mysql_data:/var/lib/mysql
environment: # 環境変数を指定
MYSQL_DATABASE: "***_web_development" # デフォルトdbを指定
MYSQL_ROOT_PASSWORD: "***" # ユーザーrootならばこれでパスワードを指定する
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
rails: #
build: .
depends_on: # 上のmysqlの起動を待ってrailsを起動
- mysql
volumes:
- .:/usr/src/app
- vendor_bundle:/usr/src/app/vendor/bundle
ports: # ポート3000を利用
- "3000:3000"
entrypoint: # 後述コマンド「docker-compose up」でコマンド「bin/rails s -b 0.0.0.0」が実行される
- bin/rails
- s
- -b
- 0.0.0.0以下の「volumes:」の記述は、「services:」に登場する「volumes:」で必要になります。
mysql_dataとvendor_bundleの2つがあります。この目的は以下のとおりです。
1. mysql_data: MySQLが持つデータを、コンテナの外側に置くため
2. vendor_bundle: 「bundle install」で生成されるファイルをコンテナの外側に置くため
volumes:
mysql_data:
driver: local
vendor_bundle:
driver: local
Dockerfile作成
以下のDockerfileはrailsのコンテナをビルドを定義しています。
上のdocker-compose.ymlに、「build: .」と書いてあるので、Dockerfileを読み込むことになります。
FROM rails:4.2.5.1
# mysqlとの連携のために必要なものをインストール
# rmはキャッシュを削除し、イメージのデータ量を削減するため
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
mysql-client \
libmysqlclient-dev \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /usr/src/app
# bundle updateで使うためにコンテナ内に2つのファイルをコピー
COPY Gemfile Gemfile
COPY Gemfile.lock Gemfile.lock
RUN gem install bundler \
&& bundle install --path vendor/bundle
ビルド及び起動とデータ投入
以下のコマンドで、イメージをビルド、及びコンテナを起動できます。
$ docker-compose build # イメージのビルド ... $ docker-compose up # コンテナの起動 ...
コンテナが起動したら、別のターミナルを開き、以下のコマンドを叩くことでdbへのデータを投入します。
(db:createが必要ないのは、ビルド時点でデータベースが作成されているため)
$ docker exec -t <対象のコンテナID> bin/rake db:migrate db:seed
ブラウザから「https://localhost:3000/」にアクセスするとアプリケーションが起動していることが確認できるでしょう。
ちなみに、
$ docker ps
で起動中のコンテナのIDの一覧を表示できます。
このコマンドで調べたIDを上の<対象のコンテナID>に入れましょう。
まとめ
いかがでしたでしょうか。
docker-composeを利用したmysqlコンテナとrailsコンテナの連携起動の方法を説明いたしました。
最初の環境構築は手間取ることもありますが、今後は他の作業者が同様の環境を用意するのには10分もかからないでしょう。
dockerおすすめです。