はっさんブログ

技術的なまとめ・話題になっているもの・やっていきを配信する

dockerとdocker-composeを使って手軽にRails環境を構築してみる

対象読者

てっとり早く、dockerとdocker-composeを用いてRailsの環境の構築を試したい人

すごく便利です。

前提

Dockerdocker-composeをインストール済み
Ruby 2.4.0Rails 5.1.0

ゴール

localhost:3000を開いていつもの画面が出ること

-> 「Yay! You’re on Rails!」

f:id:usgitan:20170504224349p:plain

Dockerfileを作成

早速やっていきましょう。
まずは適当なディレクトリでDockerfileから作成していきます。

FROM ruby:2.4.0

ENV APP_ROOT /myapp

RUN apt-get update -qq && apt-get install -y nodejs build-essential libpq-dev postgresql-client

RUN mkdir $APP_ROOT
WORKDIR $APP_ROOT

ADD Gemfile ${APP_ROOT}/Gemfile
ADD Gemfile.lock ${APP_ROOT}/Gemfile.lock
RUN bundle install

ADD . $APP_ROOT

Dockerfile では、コメント以外では FROM を一番始めに書く必要があります。
FROM 命令は Docker に対して基となるイメージを伝えます。
RUN 命令はイメージの中で実行するコマンドを指示します。

WORKDIR 命令は Dockerfile で RUN 、 CMD 、 ENTRYPOINT 、 COPY 、 ADD 命令実行時の作業ディレクトリを指定します。

ADD 命令は自分のローカルPCにあるファイルやディレクトリをコンテナ内にコピーします。
ADD ローカル コンテナ でコンテナ内の指定されたパスにローカルにあるファイル・ディレクトリを追加します。

build-essentialC/C++標準開発ツール一式のこと
lib-pqC言語によるPostgresqlインターフェース

.dockerignore

.dockerignoreを用いてコピー対象から外すファイルを指定する

## Rails

public/assets/*
.ruby-version
.env

## Environment normalisation:

.bundle
vendor/bundle
.git*

## log

log/*
tmp/*

## OSX

.DS_Store

## docker

.dockerignore

Gemfileを作成

Railsを読み込むだけのGemfileを作成する必要があります。

$bundle init

source 'https://rubygems.org'

gem 'rails'

空のGemfile.lockを作成

空のGemfile.lockも必要

$ touch Gemfile.lock

docker-compose.ymlを作成

version: '2'
services:
  db:
    image: postgres:alpine
    ports:
      - '5432'
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
  redis:
    image: redis:alpine
    ports:
      - 6379:6379
    volumes:
      - ./data/redis:/data
    command: redis-server --appendonly yes
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - '3000:3000'
    depends_on:
      - db
      - redis

volumesはホスト内のディレクトリをコンテナ内の指定箇所にマウント(関連付け)します。共有です。
depends_onではwebを開始する前にdbredisを実行するようにしています。

アプリの構築

postgresやredisのイメージを取ってくる

$ docker-compose build

$ docker-compose run web rails new . --force --database=postgresql --skip-bundle

config/database.ymlを書き換える

ローカルにもrailsアプリを展開します。

$ rails new . --force --database=postgresql --skip-bundle

その後、cofig/database.ymlを開き、以下のように編集します。

development:
  <<: *default
  database: postgres
  username: postgres
  password:
  host: db

host: dbと指定することによってコンテナ内のpostgresを見るように設定します。

起動する

$ docker-compose up -d

DBを作成

$ docker-compose run web rails db:migrate

ブラウザからlocalhost:3000を覗く

「Yay! You’re on Rails!」

その他

docker-compose logsで実行中のコンテナ内のログを確認
サービス名を指定したい場合は、docker-compose logs dbとすれば、DBコンテナ内のログが見れる。

うまくいかないときは、docker-compose buildからやり直してみたりすると良いかもしれません。

合わせて読みたい

Docker ドキュメント日本語化プロジェクト — Docker-docs-ja 1.13.RC ドキュメント

qiita.com