LoginSignup
39

More than 5 years have passed since last update.

Rails の開発環境を docker(docker-compose) で構築したい

Last updated at Posted at 2016-12-04
  • ruby 2.3.1p112
  • Rails 5.0.0.1
  • Docker version 1.12.0
  • docker-compose version 1.8.0

Rails の開発環境を docker で作成することがあったので、やり方をまとめました。
本番環境も docker で構築する予定なので、Dockerfile などは development 用のものを作成してます。

プロジェクトの作成

新規プロジェクトを適当に作成します。

$ rails new --skip-bundle --database=mysql demo
$ cd demo

docker-compose.yml

docker-compose を使用する際に必要な設定ファイル docker-compose.yml を用意します。
docker run で叩くコマンドを設定ファイルに記述するようなイメージです。

今回は本番環境も docker で構築するケースを想定しているので、開発環境用のファイル(docker-compose.development.yml)を作成しています。

docker-compose.development.yml
version: '2'
services:
  datastore:
    image: busybox
    volumes:
      - mysql-data:/var/lib/mysql

  db:
    image: mysql:5.7.16
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - '3306:3306'
    volumes_from:
      - datastore

  web:
    build:
      context: .
      dockerfile: Dockerfile.development
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    ports:
      - '3000:3000'
    volumes:
      - .:/demo
    volumes_from:
      - datastore
    depends_on:
      - db

volumes:
  mysql-data:
    driver: local

mysql のデータを永続化するため、datastore/var/lib/mysql を作成して mysql コンテナにマウントしてます。

書き方はリファレンス見ればだいたいわかります。
http://docs.docker.jp/compose/compose-file.html

Dockerfile

こちらも開発環境用のファイル(Dockerfile.development)を作成。

Dockerfile.development
FROM ruby:2.3.1

RUN apt-get update
RUN apt-get install -y build-essential libpq-dev nodejs

RUN mkdir /demo
WORKDIR /demo
ADD Gemfile /demo/Gemfile
ADD Gemfile.lock /demo/Gemfile.lock
RUN bundle install
ADD . /demo

こちらも書き方とかはリファレンス見ればだいたいわかります。
http://docs.docker.jp/engine/reference/builder.html

また、Dockerfile の構築に Gemfile.lock が必要なので作成しておきます

$ touch Gemfile.lock

database.yml

database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: password
  host: db
  socket: /tmp/mysql.sock

development:
  <<: *default
  database: demo_development

test:
  <<: *default
  database: demo_test

production:
  <<: *default
  database: demo_production
  username: demo
  password: <%= ENV['DEMO_DATABASE_PASSWORD'] %>

host に db(mysql コンテナの alias) を指定しておきます。
docker-compose.yml の depends_on 設定のおかげで、web コンテナ内から mysql コンテナを db で指定できます。

build

コンテナを立ち上げます。

$ docker-compose -f docker-compose.development.yml build # image の作成
$ docker-compose -f docker-compose.development.yml run --rm web rake db:create # rake db:create
$ docker-compose -f docker-compose.development.yml up -d # コンテナの起動

検証

今回は mac の docker-machine 上で構築してるので docker-machine の IP アドレスにアクセスして確認する。

$ docker-machine ip
192.168.99.100

ブラウザで 192.168.99.100:3000 にアクセス。
Ruby_on_Rails.png
:grinning: :grinning: :grinning:

rails console

rails console を使いたいときは docker-compose exec コマンドを使用し、起動中の web コンテナ内で実行します。

$ docker-compose -f docker-compose.development.yml exec web rails console 
Loading development environment (Rails 5.0.0.1)
irb(main):001:0> 

その他

docker-compose コマンドにいちいち -f docker-compose.development.yml でファイル指定したくねーって方は環境変数 COMPOSE_FILE にファイルを指定してやればいいそうです。

$ export COMPOSE_FILE=docker-compose.development.yml
$ docker-compose exec web rails console             
Loading development environment (Rails 5.0.0.1)
irb(main):001:0> 

プロジェクト毎に docker-compose.yml が異なると思うので、環境変数を .env で管理するのもありかも

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39