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
Code language: PHP (php)

docker-compose.yml

version: '3' services: app: restart: always build: context: . volumes: - .:/app
Code language: JavaScript (javascript)

イメージをビルド

以下のコマンドを実行してビルドします

$ 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
Code language: PHP (php)

実行後こんな感じになれば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
Code language: CSS (css)

プロジェクト作成

`rails new`コマンドで新規プロジェクトを作成します。

今回はカレントディレクトリ配下に直接プロジェクトを作りたいので、本来プロジェクト名が入る箇所には .(カンマ)を入れます。

そしてデータベースにはMySQLを使いたいので -d mysqlを付加します。

コンテナに入った状態で以下のコマンドを実行します

$ rails new . -d mysql
Code language: JavaScript (javascript)

こんなふうになってたら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
Code language: PHP (php)

今の段階でいろんなファイルがホスト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
Code language: PHP (php)

Dockerfile

さっき作ったDockerfileですがちょこっと編集します。

イメージを作る際に bundle installを実行するようにします。こうすることでイメージが作成されるときにbundleが最新の状態になることを担保できます。

FROM ruby:3.0 ENV APP /app RUN mkdir -p $APP COPY . $APP/ WORKDIR $APP RUN bundle install
Code language: PHP (php)

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
Code language: PHP (php)

イメージ再作成

これまでは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
Code language: PHP (php)

さて、 localhost:3000にアクセスしてみましょう。

こんな画面になったら成功です!

最後に

とっても簡単でしたね。

やはりdocker-composeを使うのが個人的にはとても楽です。昨今のウェブサービスはApplicationsサーバとDBがあるパターンがほとんどだと思うので、最初からdocker-composeで構築することを前提としてやった方が最終的に楽になると思います。

以上、簡単ではありましたがRails7 + MySQLの環境をdocker-composeで構築する方法まとめでした。最後までお読みいただきありがとうございました!

再掲

本記事の冒頭にも記載しましたが、

Nginxを使う手法を↓でまとめました。Nginxを使っての環境構築を行いたい、というかたはそちらもチェックしてみてください。

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

Related Posts