docker-composeを使用してrailsの開発環境を作成します。
dockerの各コマンドや、Dockerfile docker-composeについては細かく解説しないので、一通り理解している前提で書いてます。
環境
macOS Sierra
$ docker -v
Docker version 1.12.5, build 7392c3b
$ docker-compose -v
docker-compose version 1.9.0, build 2585387
docker for mac install
以前はmacでDockerを使うのにVagrantにdockerを入れて操作していましたが、mac純正の仮想環境xhyveを利用するようになったためVagrantはお役御免となり、だいぶ使いやすくなったようです。
https://docs.docker.com/docker-for-mac/
Dockerfileとdocker-compose.ymlを追加
RailsのプロジェクトルートにDockerfileとdocker-compose.ymlを追加します。
Dockerfile
railsの公式Docker imageは bundle config --global frozen 1 が指定してあり、Gemfileの変更ができなくなっています。
本番などの環境ではその運用方法の方が良いと思いますが、今回は開発環境で使用するため公式のDockerfileを参考にカスタマイズします。
FROM ruby:2.3.3
RUN apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y mysql-client --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /workdir
WORKDIR /workdir
ADD Gemfile /workdir/Gemfile
ADD Gemfile.lock /workdir/Gemfile.lock
RUN bundle install
ADD . /workdir
docker-compose.yml
MySQLへ接続するためのユーザやパスワードは適宜変更してください。
version: '2'
services:
db:
image: mysql:latest
environment:
MYSQL_DATABASE: docker_development
MYSQL_ROOT_PASSWORD: fasjkdl29
MYSQL_USER: hogehoge
MYSQL_PASSWORD: fasjkdl29
ports:
- "3306:3306" # ホストからゲストへポートフォワード
web:
build:
context: .
dockerfile: Dockerfile
command: bundle exec rails s -p 3000 -b '0.0.0.0'
tty: true
stdin_open: true
depends_on:
- db # DB側のコンテナが出来上がってからwebを実行する
ports:
- "3000:3000" # ホストからゲストへポートフォワード
volumes:
- .:/workdir # ソースコード変更したらDocker側も即反映されるように
DBへの接続情報を修正
ユーザ名とパスワードはdocker-compose.ymlのenvironmentで指定した値と同じにする。
hostについてはdocker-compose.ymlのservicesのDBと同じ値にする。
分けたい場合などはlinksを修正すれば/etc/hostsに追加されるのでlinks属性で変更するようにすると良いかも。
default: &default
adapter: mysql2
encoding: utf8
pool: 5
host: db
development:
<<: *default
username: hogehoge
password: fasjkdl29
database: docker_development
production:
<<: *default
database: docker_production
username: docker
password: <%= ENV['DOCKER_DATABASE_PASSWORD'] %>
起動
MySQLの起動に少し時間がかかるため、logにmysql startedみたいなログが出るまで待たれよ。
公式のDockerfileを使用しているので、調べたらまた追記します。
起動したら http://localhost:3000 にてアクセス出来ます。
$ docker-compose up
dockerでbinding.pryを使う
Railsの開発に欠かせないのがpry-byebug
これをDockerで使うようにするための設定は以下の通り
services:
# 省略
web:
tty: true # この二行が必要
stdin_open: true # この二行が必要
このあとソースコードにbinding.pryを追加し、該当の箇所で止まったらdockerのコンテナにattachするとpryにアタッチされる。
$ docker attach 88cdf2efe112
gemを追加したい
gemを追加したり、DBのマイグレーションを行うためにコンテナ内でコマンドを実行したい場合は以下の通り。
$ docker exec 88cdf2efe112 bundle exec rake db:migrate
ギフハブにソース置いておきますね
参考