Ruby
RubyOnRails
docker
docker-compose

初心者のためのdockerでRuby on Railsを動かす方法

DockerもRubyも全く知らない初心者が、Docker for Windowsで色々弄ってみて何とかサマになったので、一緒に作業している同期に共有するためにもメモとしてまとめる感じの記事

Windowsでdockerを動かそうとしたものの、色々手こずって時間を無駄にしてしまったので、システムとして必要な部分が用意できるまでの作業手順をメモ代わりに投稿

Docker for Windowsで「Yay! You're on Rails!」を出すまで

1. docker for Windowsをインストール

導入手順はこの記事では省略。
注意点としてはHyper-Vの有効化を忘れないでください。

--追記--
どうやらdocker for windowsに必要なHyper-Vは、windows proでしか有効化できないようです。proではない方はdocker toolboxを使ってください。

2. RubyとMySQLのイメージをインストール

Dockerが動いていれば、イメージは以下のコマンドで落とせます。

docker pull ruby:2.5.0
docker pull mysql

詳しい説明はこちらの記事で
https://qiita.com/togana/items/30b22fc39fe6f7a188ec

3. Dockerの環境構築

Dockerfile・docker-compose.yml・Gemfile・Gemfile.lockが必要

詳しい書き方は、この記事が分かりやすかったです
https://qiita.com/wMETAw/items/8cb41425a5d0bdace2df

4.Railsアプリを作成

docker-compose run web rails new [app_name] --database=mysql --skip-bundle

5.Docker起動

build & 起動

docker-compose build
docker-compose up -d

build時にbundle installで詰まった場合は、SettingsからShared Drivesを有効化したり、firewallを無効にしたり、Dockerを再起動したり、色々試してみてください。

6.Yay! You're on Rails!

(3で紹介した記事通りにdocker-compose.ymlを設定した場合は)localhost:3000にアクセスすれば「Yay! You're on Rails!」の画面が出るはず

サーバーの起動が確認できた後は、

docker-compose down

でキチンとコンテナを停止させましょう。

ページを作成するまで

localhost:3000にトップページを作る場合の話

1.controllerの作成

これでlocalhost:3000/home/topが自動生成される

rails g controller home top
# rails g controller コントローラ名 アクション名

2.viewの作成

./app/views/homeの中にあるtop.html.erbがHTMLソース(厳密にはHTMLではないが)
表示したいようにtop.html.erbを編集する

3.routingの設定

./configの中にあるroute.rbを以下のように編集する

Rails.application.routes.draw do
  get "/" => "home#top"

end

これでlocalhost:3000/homeにアクセスした時に、top.html.erbが表示されるようになる

データベースが使えるようになるまで

※参考
https://qiita.com/nak1114/items/1f7d48ff661555726427
https://www.rubylife.jp/rails/ini/index6.html
特に二つ目は凄く分かりやすい記事なので、初学者は読んだ方が良いです。

1. Databaseの永続化

Databaseを永続化させないと、buildする度にデータが吹っ飛びます。
永続化は、docker-compose.ymlのdatabaseコンテナの設定に以下を追加する。

volumes:
    - mysql-data:/var/lib/mysql

portsの設定も追加しましょう

2. Databaseの作成

まずはDBの作成

docker-compose run --rm web rake db:create

これで./dbに色々ファイルが作成される

--追記--
今はrakeコマンドを使うのは古いそうなので、railsコマンドで叩いた方が良いそうです。

docker-compose run --rm web rails db:create

次にmodelの作成

docker-compose run --rm web rails g model [model_name]

これで./db/migrateにマイグレーションファイルが作成される

次にテーブルの定義
作成されたマイグレーションファイルに、テーブルの定義を追記する。

class CreateBooks < ActiveRecord::Migration[5.1]
  def change
    create_table :model_name do |t|
      t.string :name  //ココ
      t.timestamps
    end
  end
end

t.timestampsは色々便利なので、消さない方が良いです。

最後に、マイグレーションファイルに従ってマイグレーション

docker-compose run --rm web rails db:migrate

おわりに

他にも必要そうな事があったら追記しようと思います。

追記 2018/06/13
https://qiita.com/chocode/items/61b91aa0e08637a8ad91
続編を書きました。DBにデータを入力するための入力フォームの作り方です。