docker-composeでRuby3+Rails7+MySQLの環境構築を行う方法まとめ

はじめに

待ちに待った 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.ymldbのところに書いた設定を書いていきます。

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を使っての環境構築を行いたい、というかたはそちらもチェックしてみてください。

Ruby、Rails、Dockerの書籍のご紹介

Related Posts