- 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
)を作成しています。
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
)を作成。
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
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 にアクセス。
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 で管理するのもありかも