はじめに
待ちに待った Rails7
がとうとう正式リリースされましたね。
↓画像をクリックするとサイトに飛べます

色々と紹介したいのですが、本記事はRails7の紹介をする記事ではありません。本記事はリリースしたてのRails7の開発環境を docker-compose
で作る方法をまとめていきます。まず、この記事でやることやらないことについてまとめます。
2022/01/16追記
Nginxを使う手法を↓でまとめました。Nginxを使っての環境構築を行いたい、というかたはそちらもチェックしてみてください。
やること&やらないこと
- Ruby3+を使う
- Rails7を使う
- ホストPCにRubyはインストールしない
- ホストPCにRails7はインストールしない
- MySQLを使う
本記事では以上のことを念頭に置いて環境を作っていきたいと思います。
筆者の環境
筆者のPCはこんな感じになっています
- M1 Mac BigSur 11.4
- docker-compose 1.29.2
- Docker 20.10.7
でははじめていきましょう!
Ruby3のイメージを作る
Rails7はRuby2.7以上じゃないと動かないので2.7以上の環境を作ります。今回は結構最新に近い3を使っていきます。
また、あとでdocker-composeで動かすことを想定して最初からdocker-composeで作業していきます。
Dockerfile
FROM ruby:3.0
ENV APP /app
RUN mkdir -p $APP
COPY . $APP/
WORKDIR $APP
docker-compose.yml
version: '3'
services:
app:
restart: always
build:
context: .
volumes:
- .:/app
イメージをビルド
以下のコマンドを実行してビルドします
$ docker-compose build
イメージの一覧に作成したイメージがあれば成功です。下記のコマンドでイメージの一覧を出力できます。
ちなみに今回筆者は sample_rails7
というディレクトリ内で作業をしているので以下のような出力になっています
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sample_rails7_app latest 330415c63128 2 minutes ago 830MB
Rails7インストール
dockerのコンテナ内に入ってRails7をインストールします。
# コンテナに入る
$ docker-compose run app sh
# Rails7インストール
$ gem i -v 7.0 rails
実行後こんな感じになればOKです。
...
...
Successfully installed mail-2.7.1
Successfully installed actionmailer-7.0.0
Successfully installed actionmailbox-7.0.0
Successfully installed websocket-extensions-0.1.5
Building native extensions. This could take a while...
Successfully installed websocket-driver-0.7.5
Building native extensions. This could take a while...
Successfully installed nio4r-2.5.8
Successfully installed actioncable-7.0.0
Successfully installed rails-7.0.0
36 gems installed
プロジェクト作成
`rails new`コマンドで新規プロジェクトを作成します。
今回はカレントディレクトリ配下に直接プロジェクトを作りたいので、本来プロジェクト名が入る箇所には .
(カンマ)を入れます。
そしてデータベースにはMySQLを使いたいので -d mysql
を付加します。
コンテナに入った状態で以下のコマンドを実行します
$ rails new . -d mysql
こんなふうになってたらOKです。
...
...
Import Turbo
append app/javascript/application.js
Pin Turbo
append config/importmap.rb
Run turbo:install:redis to switch on Redis and use it in development for turbo streams
Create controllers directory
create app/javascript/controllers
create app/javascript/controllers/index.js
create app/javascript/controllers/application.js
create app/javascript/controllers/hello_controller.js
Import Stimulus controllers
append app/javascript/application.js
Pin Stimulus
append config/importmap.rb
今の段階でいろんなファイルがホストPCにも作成されたかと思います。
これでプロジェクトが作られましたね。次の段階にいきましょう。
色々設定する
さて、サーバを起動する準備をしていきます。
docker-compose.yml
mysql
を使いたいのでrubyと同じくdockerhubから落としてきます。今回は MySQL 8.0.25
を使います。
また、M1 Macなので platform
の指定を付けるのを忘れないでください。
version: '3'
services:
app:
restart: always
build:
context: .
volumes:
- .:/app
command: rails s -b 0.0.0.0 -p 3000
ports:
- 3000:3000
depends_on:
- db
db:
restart: always
image: mysql:8.0.25
platform: linux/amd64
environment:
MYSQL_DATABASE: app_development
MYSQL_USER: appuser
MYSQL_ROOT_PASSWORD: asf#aks3AFja
MYSQL_PASSWORD: asf#aks3AFja
TZ: 'Asia/Tokyo'
MYSQL_ROOT_HOST: "%"
tty: true
command: mysqld --character-set-server=utf8mb4 --explicit_defaults_for_timestamp=true --default-authentication-plugin=mysql_native_password
ports:
- 3306:3306
Dockerfile
さっき作ったDockerfileですがちょこっと編集します。
イメージを作る際に bundle install
を実行するようにします。こうすることでイメージが作成されるときにbundleが最新の状態になることを担保できます。
FROM ruby:3.0
ENV APP /app
RUN mkdir -p $APP
COPY . $APP/
WORKDIR $APP
RUN bundle install
config/database.yml
DBの設定をします。
docker-compose.yml
の db
のところに書いた設定を書いていきます。
hostにはdocker-compose.ymlのサービス名 db
を書きます。
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: appuser
password: asf#aks3AFja
host: db
イメージ再作成
これまではRails7プロジェクトを作成する用のイメージを作りましたが、今回はすでにRails7があることを前提としてイメージを作成します。
といってもコマンドは同じです。
$ docker-compose build
さて、これで全ての準備が完了です。サーバを起動してみましょう!!
サーバ起動
あとはもう簡単です。以下のコマンドで環境を立ち上げるだけですね。
$ docker-compose up
こういうのが見えたら成功です。
app_1 | Puma starting in single mode...
app_1 | * Puma version: 5.5.2 (ruby 3.0.3-p157) ("Zawgyi")
app_1 | * Min threads: 5
app_1 | * Max threads: 5
app_1 | * Environment: development
app_1 | * PID: 1
app_1 | * Listening on http://0.0.0.0:3000
app_1 | Use Ctrl-C to stop
さて、 localhost:3000
にアクセスしてみましょう。
こんな画面になったら成功です!

最後に
とっても簡単でしたね。
やはりdocker-composeを使うのが個人的にはとても楽です。昨今のウェブサービスはApplicationsサーバとDBがあるパターンがほとんどだと思うので、最初からdocker-composeで構築することを前提としてやった方が最終的に楽になると思います。
以上、簡単ではありましたがRails7 + MySQLの環境をdocker-composeで構築する方法まとめでした。最後までお読みいただきありがとうございました!
再掲
本記事の冒頭にも記載しましたが、
Nginxを使う手法を↓でまとめました。Nginxを使っての環境構築を行いたい、というかたはそちらもチェックしてみてください。