Tech Racho エンジニアの「?」を「!」に。
  • インフラ

Docker入門日誌-その3- Rails開発編

ebiです。前回の内容で終わってもよかったんですけど、せっかくなのでRails編まで書いてみることにしました。

とにかく rails new を目指す

まずは難しい内容を抜きにして最速で rails new を決めていきます。

rails用のイメージを利用する

前回に引き続きKitematicの画面です。何も考えずに rails と検索してみたら、公式イメージがヒットしました。これに決めます。

作成されたコンテナの設定を見ると、RubyとRailsのバージョンが指定してありました。

いや、こんなところ見ずともこのイメージの公式ドキュメントを読めばいいんですけどね。

Kitematicから作った場合は忘れずにポート指定をしておきましょう。

それでは docker exec でコンテナ内に乗り込みます。

あとは rails new するだけ

それっぽいディレクトリに移動して……。はい。rails new

無事完了したので、作ったディレクトリに移動して rails s

ブラウザにURLを打ち込んで……アクセスできました。ね、簡単でしょ?

省略してしまいましたが、実際やるなら前回の手順みたいにちゃんと共有フォルダを指定して、そこで rails new しましょう。なんだか普通にWindowsでRails開発できそうな気がしてきましたね……!!

もうちょっと真面目に環境作り

今までは、ただ用意されていたイメージを引っ張ってきてコンテナ作りをしていたのですが、Dockerでは配布されているイメージを元にオリジナルのイメージを作ったり、コンテナ同士の連携をしたりするのも簡単にできます。

公式のRails環境作りのサンプルにもその内容が含まれていたので、これを参考(そのままやりますけどね)に試していきます。

Dockerfile等を用意する

まずは適当な作業用のディレクトリを用意して、そこに Dockerfile と言う名前でファイルを作ります。拡張子は要りません。

これをエディタで編集して、以下の内容にします。

FROM ruby:2.3.3
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

FROMで元になるイメージを指定しています。その他の大文字で始まる記述も、初期設定として実行するものを定義しているようだと言うのはなんとなく分かると思います。
ちゃんとDockerfile用の命令一覧をどこかで参照して比較してみるともっと分かるはずです。

同様にGemfileを作成して、

source 'https://rubygems.org'
gem 'rails', '5.0.0.1'

Gemfile.lockは空のファイルとして作成します。
最後に docker-compose.yml を作成します。

version: '2'
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

今回はdbとwebの2つのコンテナがあって、dbの方はpostgresイメージを、webの方はDockerfileからbuildしたコンテナを使うと書かれているようです。

buildしていく

Windowsのコマンドプロンプトを起動して、Dockerfile等を用意した作業用のディレクトリに移動したら、以下を実行します。

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

webの方のコンテナを動かして、rails new しちゃいます。実行完了すると、作業ディレクトリがRails仕様になりました。

続いて rails new で作成された config/database.yml を開いて、developmentの部分を以下に書き換えます。

development: &default
 adapter: postgresql
 encoding: unicode
 database: myapp_development
 pool: 5
 username: postgres
 password:
 host: db

終わったら、いよいよ立ち上げです。

docker-compose up -d

失敗しました。

web_1 | bundler: failed to load command: rails (/usr/local/bundle/bin/rails)
web_1 | Bundler::GemNotFound: Could not find gem 'pg (~< 0.18)' in any of the gem sources listed in your Gemfile.

Gemfileが悪そうです。流し読みして必要なさそうだと思って飛ばしてしまった build をしてみます。

docker-compose build

リベンジします。今度は上手くいったのでアクセスしてみます。DBがまだ作られていないので、

はい。db:createをしましょう。

docker-compose run web rake db:create

これでオッケーでしょう。と思ったのですが、上手くいかず。restartしてみるも

C:\Users\ebi\Desktop\rails_docker>docker-compose restart
Restarting railsdocker_web_1 ... done
Restarting railsdocker_db_1 ... done

C:\Users\ebi\Desktop\rails_docker>docker-compose ps
Name Command State Ports
----------------------------------------------------------------------
railsdocker_db_1 docker-entrypoint.sh postgres Up 5432/tcp
railsdocker_web_1 bundle exec rails s -p 300 ... Exit 1

な、なんでだー。お、落ち着いてdocker-compose logsでログを出してみよう……。

web_1 | A server is already running. Check /myapp/tmp/pids/server.pid.
web_1 | =< Booting Puma
web_1 | =< Rails 5.0.0.1 application starting in development on http://0.0.0.0:3000
web_1 | =< Run `rails server -h` for more startup options
web_1 | Exiting

怪しい。pidを消すといいらしいです。こんな感じかな(もちろん直接フォルダからデータ消せばいい気もする)。

docker-compose run web rm tmp/pids/server.pid

リベンジします。

できました。

さてさて、ここまで docker-compose web run を繰り返してたので、そのたびにコンテナが増えていました……。rails new とかのコマンドを実行したいだけだったら--rmオプションを付ける癖を身に付けるべきなのでしょう。

まとめ

Dockerを使ってRails開発をする想定で環境構築をしてみました。
すぐ使える便利なイメージを拾ってきたリ、Dockerfileを使って新しいイメージを作ってみたり、Docker Composeを利用して複数コンテナの連携をしてみたり、と基本的なことは一通り試せました。

Dockerを今すぐ実務に生かせるか、と言うとまだ不安だらけですが最初の一歩を踏み出すいいきっかけにはなりました。
公式のチュートリアルやDockerで~~してみましたみたいな記事も世の中にはたくさんあるようなので、もう少し色々試してみようと思います。

関連記事(Docker)



CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。