Madogiwa Blog

主に技術系の学習メモに使っていきます。

DockerでRubyonRailsの環境を構築してみた

f:id:madogiwa0124:20180114153719p:plain

はじめに

Dockerの勉強会に参加して少し、Dockerについて勉強しました。

tec.connpass.com

せっかく勉強したので、Raisの開発環境をDockerで構築してみました(._.)

まだまだわからないことだらけですが、とりあえず開発環境をDockerコンテナ上に構築・実行確認とherokuへのデプロイまで確認出来たので、手順をメモしてみますφ(._.)

※ちなみに下記ページを大変参考にさせて頂きました・・・!

qiita.com

DockerFile等を含んだ形でgithubサンプルソースをpushしているので、ソースだけ見たい方はこちらへ。

github.com

環境

私の環境

ちなみに私のローカル環境は、こんな感じです!

構成 内容
ローカル Mac OSX Yosemite
Docker 17.12.0-ce-mac47

Docker

Dockerとは

DockerとはRubyやPosgresといったミドルウェアをDocker上にコンテナとして構築出来るものです。

似たような技術として仮想環境がありますが、下記のようなメリットがあり、最近注目されている技術です。

  • 環境をテキストベースのファイルとして配布出来る。環境の再現性。
  • スクラップ&ビルドが容易
  • DockerがOSレイヤーをラップして、各OSの差分を吸収してくれるためOS環境を気にしなくても良い。

上記説明ではわからない部分が多いと思うので、下記のような記事で確認頂ければと思います。

employment.en-japan.com

Dockerのインストール

MACだったらDockerのインストールはとても簡単です!

下記のインストールページにアクセスし、Get Dockerを押すと安定版のインストーラーが入手出来るので、あとは手順に従えばOKです。 https://store.docker.com/editions/community/docker-ce-desktop-mac

f:id:madogiwa0124:20180114152439p:plain

最後にターミナルからインストールを確認して下記のようになれば、OKです。

$ docker --version
Docker version 17.12.0-ce, build c97c6d6

Dockerを使ってRails開発環境を構築する

目指す環境構成

今回目指す環境はこんな感じで、ベーシックなRailsの環境を目指して行きます!

構成 内容
Ruby 2.4.0
Rails 5.1.4
DB PostgreSQL 10.1
本番環境 Heroku

Docker上にRailsが動作するコンテナとPosgreSQLが動作するコンテナの立てて、ローカルで動作確認を行いHerokuへデプロイしてみたいと思います。

イメージはこんな感じです。 f:id:madogiwa0124:20180114152357p:plain

手順

Railsプロジェクトの作成

まずは、普通にローカルでRailsプロジェクトを作成します。

rails new docker_sample_app

Docker関連ファイルの配置

その後、DockerFile及びdocker-compose.ymlをrootディレクトリ配下に配置します。

DockerFileはコンテナの定義ファイルで、docker-conpose.ymlは、DockerFileの関連を定義したファイルです。

DockerFileでWeb用のコンテナを既存のrubyのimageをベースに定義しています。DB用のコンテナはdocker-compose.ymlで公式のpostgresのイメージを使ってそのまま構築しています。

DockerFile

# ベースイメージの設定
FROM ruby:2.4.0
# 環境変数の設定
ENV APP_ROOT /docker_sample_app
# コンテナ上で関連パッケージのインストール
RUN apt-get update -qq && apt-get install -y nodejs build-essential libpq-dev postgresql-client
# コンテナ上でフォルダを作成
RUN mkdir $APP_ROOT
# 作業ディレクトの設定
WORKDIR $APP_ROOT
# Gemfileをコンテナ上にコピー
ADD Gemfile ${APP_ROOT}/Gemfile
ADD Gemfile.lock ${APP_ROOT}/Gemfile.lock
# コンテナ上でbundle install
RUN bundle install
# rootフォルダ配下をコンテナ上にコピー
ADD . $APP_ROOT

docker-compose.yml

version: '2'
services:
  # DB用のコンテナ
  db:
    image: postgres
    ports:
      - "5432"
    # データをホスト側で保持し、関連付けることで永続化
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
  # Web用のコンテナ
  web:
    # DockerFileの配置フォルダ
    build: .
    # コンテナ起動時に実行されるコマンド
    command: bundle exec rails s -p 3000 -b 0.0.0.0
    ports:
      - "3000:3000"
    # dbとwebを関連付け
    links:
      - db
    # ローカルのルートディレクトリをコンテナ上の作業ディレクトリと関連付け
    volumes:
      - ./:/docker_sample_app
    # 環境変数
    environment:
      DATABASE_USER: postgres
      DATABASE_PASSWORD:
      DATABASE_PORT: 5432
      DATABASE_HOST: db

DB関連ファイルの修正

DBをPosgreSQLに変更

これは、過去の記事にまとめているので参照して頂ければと思います。

madogiwa0124.hatenablog.com

DB設定をDB用のコンテナに合わせて変更

DockerコンテナでDBを構築するにあたって、DBの参照の仕方等を少し工夫する必要があるためにdatabase.ymlファイルを編集します。

default: &default
  adapter: postgresql
  encoding: unicode
  timeout: 5000
  # docker-composeで指定した環境変数の読み込み
  port: <%= ENV.fetch('DATABASE_PORT') { 5432 } %>
  host: <%= ENV.fetch('DATABASE_HOST') { 'localhost' } %>
  username: <%= ENV.fetch('DATABASE_USER') { 'root' } %>
  password: <%= ENV.fetch('DATABASE_PASSWORD') { 'password' } %>
  pool: <%= ENV.fetch('RAILS_MAX_THREADS') { 5 } %>

development:
  <<: *default
  database: docker_sample_app_development

test:
  <<: *default
  database: docker_sample_app_test

production:
  <<: *default
  database: docker_sample_app_production
  username: docker_sample_app
  password: <%= ENV['appname_DATABASE_PASSWORD'] %>

Dockerコンテナの起動

では実際にDocker上に環境を構築していきます。 流れとしては、下記のような形になります。 1. Web用のコンテナとDB用のコンテナを構築 2. DBを作成 3. マイグレーションの実行 4. Dockerコンテナの起動

# Dockerイメージの取得等の初期化処理
$ docker-compose build
# DBの作成とマイグレーションの実行
$ docker-compose run web rake db:create
$ docker-compose run web rake db:migrate
# Web、DB用のコンテナの起動
$ docker-compose up

localhost:3000にブラウザから接続するとRailsのスタートページが見えました!

f:id:madogiwa0124:20180114152508p:plain

Herokuにデプロイ

最後にHerokuにデプロイしてみようと思います。 HerokuへのデプロイはDockerを使わない環境と特に変わりません。

今回は、scaffoldUserモデルを作成後、Herokuへデプロイしてみました。

$ rails generate scaffold user name:string age:integer
$ git add -A
$ git commit -m "scaffold user model"
$ git push heroku master
$ heroku run db:migrate
$ heroku open

無事にherokuにデプロイできました!
https://rails-docker-sample-app.herokuapp.com/users

f:id:madogiwa0124:20180114152524p:plain

おわりに

まだまだDockerのことは理解出来ていない部分が多いですが、なんとかネットの情報を元に環境と立ててデプロイすることが出来ましたφ(..)
Dockerだと失敗しても潰して、もう一回ということが簡単に出来るので、仮想環境の構築よりもストレスは大分少ないんじゃないかなぁと思います…!

Dockerは色々書籍も出ているので、色々と勉強してみようと思いました。 オススメの書籍等あれば、教えてくださいφ(..)

参考

tech.recruit-mp.co.jp

qiita.com