docker composeでRuby on Railsの環境構築をしよう

プログラミング

docker composeでrailsの環境構築

どうも、てーやまです。
今回はdocker compose についてまとめようと思います。

Railsの環境構築では、コンテナ1つに対してアプリケーション1つというのが一般的のようで、Web、DBと分けて2つのコンテナを作成していきます。

docker composeを使うと、そういった複数のコンテナを操作するのが楽で、またコンテナ起動時の設定をYAMLファイルに書いておけば、コマンド1つで設定通りのコンテナを起動することができます。

実際に使ってみて非常に便利だな(特にコンテナ起動時の細かなオプションをいちいち書かなくていい点が)と感じたのでブログに記しておこうと思います。

docker composeの概要

複数のコンテナを管理するのに便利なツールという位置付けです。
プログラミングに例えてみれば、Dockerが言語、composeはフレームワークみたいな感じでしょうか。

基本的に『Docker for Mac』か『Docker for Windows』を使用されていればすでにインストールが済んでいるはずですが、以下のコマンドでインストール済であるか確認することができます。

$ docker-compose --version
docker-compose version 1.25.5, build 8a1c60f6

Linuxの方はこちらを参照してインストールをしてみてください。

docker-compose.ymlの書き方

YAMLファイル(拡張子は.yml)を予め作っておけば、コンテナ起動時に色々なオプションを付けなくて済みます。(例えば{ -i , -t , -v , -p }など)

これらのオプションはコンテナの数が増えると管理が面倒になるので、YAMLファイルにまとめて記載してしまいましょう。

イメージとしてはYAMLファイルが環境変数のようなもので、一度設定しておけばコンテナ起動コマンドを1つ叩くだけで自動的に読み込まれます。

version: '3'
services:
  db:
    image: postgres
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
version: '3'
 → composeのバージョンを指定する
image: postgres
 → postgresのイメージを利用してコンテナ起動
build: .
 → カレントディレクトリのDockerfileを使ってコンテナ起動
command: bundle exec rails s -p 3000 -b '0.0.0.0'
 → webサーバの起動を初期コマンドとする
    volumes:
      - .:/myapp
 → ホストのカレントディレクトリとコンテナのmyappディレクトリをマウントする
    ports:
      - "3000:3000"
 → ホストとコンテナのポート設定
    depends_on:
      - db
 → webが起動する前にdbが起動するようにする指定

Ruby on Railsの環境を構築してみよう

Dockerfileとdocket-compose.ymlを使って、railsの環境構築をしてみます。

カレントディレクトリに『Dockerfile』『docker-compose.yml』『Gemfile』『Gemfile.lock』を作ります。

$ ls
Dockerfile		Gemfile			Gemfile.lock		docker-compose.yml
FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
version: '3'
services:
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

  db:
    image: postgres
    environment:
      - 'POSTGRES_USER=postgres'
      - 'POSTGRES_PASSWORD=postgres'
source 'https://rubygems.org'
gem 'rails', '5.0.0.1'

上記のファイルが用意できたら、Webコンテナ上にアプリケーションを作ります。

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

この場合『docker-compose up』ではなく『run』を使っているのは、コンテナ起動時に『rails new』を実行するためです。このようにコンテナ起動時にタスクを実行したければ『docker-compose run』、コンテナを起動するだけであれば『docker-compose up』と使い分けると良いようです。

source 'https://rubygems.org'


# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.0.0', '>= 5.0.0.1'
# Use postgresql as the database for Active Record
gem 'pg', '~> 0.18'
# Use Puma as the app server
gem 'puma', '~> 3.0'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.2'
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby

rails newによってGemfileが更新されているので、イメージをビルドし直しておきます。

docker-compose build

次に『config/database.yml』を以下のように修正します。

default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  user: postgres
  password: postgres
  pool: 5

# 元々あったpool:はコメント化すること
# database.ymlにpostgresのパスワードが書いてあるため
# セキュアではないが練習なので

修正後にコンテナが停止しているのを確認してから、db:createします。

$ docker-compose run web rake db:create
Starting rails_test3_db_1 ... done
Created database 'myapp_development'
Created database 'myapp_test'

コンテナを起動させてから『http://localhost:3000』にブラウザから接続してみます。

これでDocker composeを使用したRails環境構築は以上です。