とりあえず動くRails開発環境をDockerで構築する

qlog公式からのメッセージ:ログインをしていなくてもいいねを押すことができます!

Windows10で構築

ruby 3.2.2
Rails 7.1.0
mysql 8.1.0

Railsアプリの作成

rubyのコンテナを作成してRails new を実行し、Railsアプリを作成する
Windowsにrubyをインストールしている場合はコンテナ不要で、コマンドプロンプトでrails newする


作業フォルダを作る

mkdir work
cd work

rubyイメージのプルとコンテナ生成

docker run -it -v .:/apl -w /apl --name ruby ruby:3.2.2

コンテナ生成時にrubyが実行されてコマンドが打てない。(rubyを終了するとコンテナも終了する)
コマンドプロンプトをもう一つ立ち上げ、このフォルダまで移動して次のコマンドを打つ

railsのインストールとアプリ生成

docker exec ruby gem install rails
docker exec ruby rails new RailsTest --database=mysql

アプリ名はRailsTest
作業フォルダにRailsアプリのフォルダが出現する

rubyの削除

rubyコンテナとイメージはもう使用しないので削除

docker stop ruby
docker rm ruby
docker rmi ruby:3.2.2

docker-compose.ymlの作成

Railsアプリのフォルダに入り、docker-compose.ymlを作成する

# RailsTest/docker-compose.yml
version: '3.9'

services:
  db:
    image: mysql:8.1.0
    container_name: rails-db
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - "3306:3306"
    volumes:
      - ./mysql_data:/var/lib/mysql 

  web:
    build: .
    container_name: rails-web
    volumes:
      - .:/rails
    ports:
      - 3000:3000
    depends_on:
      - db  
volumes:
  mysql_data:

Dockerfileの編集

Rails newの時にDockerfileが作成されているので、以下の部分を変更する

# RailsTest/Dockerfile
# 11行目
ENV RAILS_ENV="production"
    BUNDLE_DEPLOYMENT="1" \
    BUNDLE_PATH="/usr/local/bundle" \
    BUNDLE_WITHOUT="development"

↓

ENV RAILS_ENV="development"

production環境は暗号化キーの設定などが必須で面倒なので変える

# RailsTest/Dockerfile
# 62行目

CMD ["./bin/rails", "server"]

↓

CMD ["./bin/rails", "server", "--binding", "0.0.0.0"]

ホストからルートされた通信を受け取れるように変更

# RailsTest/Dockerfile
# 55行目

USER rails:rails # 行ごと削除

ユーザー"rails"はdevelopment.logの書き込み権限がないのでアプリ起動時に落ちる
管理者ユーザーで実行するためにユーザーを指定しない

database.ymlの編集

docker-compose.ymlの内容に合わせてデータベースの設定を行う

# RailsTest/config/database.yml

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password # ココ
  host: db # ココ

コンテナの生成

cd RailsTest
docker-compose up -d

初回起動時はデータベースの作成などがあるので起動するまで少し待つ

ブラウザからアクセスする

http://localhost:3000/
Rails 7.1.0の初期画面が表示される

DBにアクセスする

MySQL Workbenchからアクセスできる

HostName : 127.0.0.1
Username : root
Port : 3306
Password : password

変更する場合はdocker-compose.ymlとdatabase.ymlを合わせる

以下メモ


webコンテナに入るコマンド

docker exec -it rails-web bash

コンテナ名のrails-webはdocker-compose.ymlのcontainer_nameで定義している

モデル・コントローラーの生成やテーブル生成コマンドはwebコンテナの中で実行する

コード修正の反映

コンテナを再起動すると、コードの修正が反映される

コマンドプロンプトを立ち上げ、以下のコマンドでwebコンテナを再起動する

docker restart rails-web

テーブルの作成

modelの生成コマンドを実行

webコンテナに入り、以下のコマンドでmigrationファイルを生成する

# usersテーブルを作成したい
./bin/rails g model user

RailsTest/db/migrateにファイルが作成される
このファイルにテーブルレイアウトを定義する

テーブルレイアウトの定義

# RailsTest/db/migrate/20231008074315_create_users.rb
class CreateUsers < ActiveRecord::Migration[7.1]
  def change
    create_table :users do |t|
      t.string :name
      t.string :adress
      t.integer :age
      t.timestamps
    end
  end
end

テーブルの作成

webコンテナで以下のコマンドを実行するとusersテーブルが作成される

./bin/rails db:migrate

vranometria