既存のrailsプロジェクトをDockerで開発する手順

  • 34
    いいね
  • 0
    コメント

docker-composeを使用してrailsの開発環境を作成します。
dockerの各コマンドや、Dockerfile docker-composeについては細かく解説しないので、一通り理解している前提で書いてます。

環境

macOS Sierra

bash
$ 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を参考にカスタマイズします。

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へ接続するためのユーザやパスワードは適宜変更してください。

docker-compose.yml
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属性で変更するようにすると良いかも。

config/database.yml
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で使うようにするための設定は以下の通り

docker-compose.yml
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

ギフハブにソース置いておきますね

https://github.com/kkyouhei/docker-on-rails

参考

https://docs.docker.com/compose/rails/