ローカルでDockerを使ってRails 7.0 + MySQL 8.0の立ち上げ

今回やりたいこと

  • ローカルでRailsのお試し用アプリを作成したい
    • Railsはこの記事作成時の最新版7.0.4を採用
    • また、Rails 7.0以上ではrubyのバージョンは3.0以上が望ましいとのことで最新の安定版の3.1を採用
    • MySQLは8.0を採用
  • Dockerを使いたい
  • Githubを使って管理

!!!注意!!!

ローカルで動かしてみて今のところ問題が出ていないだけで足りない部分もあるかもしれません。かなり最低限しか書いていないと思うので

動かしていく中で追加や修正が必要そうな部分があり次第適宜修正しますが、間違っている点などありましたら、お手数ですがコメント等でそっと教えてていただけたらと思います

私の環境

Macbook OS: Monterey 12.6.1

Docker: 20.10.21

Docker Compose: 2.12.2

前準備

  1. GitHubで管理したいのでGitHubのサイトからリポジトリを作成
  2. ローカルにリポジトリをクローン(自分の場合はGithub Desktopを使用しました)
  3. ここまででGitHubでの管理の準備が完了

DockerでRailsの立ち上げまで

1. コンソールでクローンしてきたリポジトリまで移動

2. 立ち上げに必要なファイルを作成

コンソールでファイル作成のコマンドを実行

$ touch {docker-compose.yml,Dockerfile,Gemfile,Gemfile.lock}

※ ちなみに、ファイルの間にスペース空けるとエラーになるので注意

3. Dockerfileの作成

# まずベース・イメージを指定
FROM ruby:3.1

# mysqlのためにdefault-mysql-clientをインストール
RUN apt-get update && apt-get install -y default-mysql-client

# 作業ディレクトリの作成&指定
WORKDIR /app
# GemfileとGemfile.lockを作業ディレクトリにコピー
COPY Gemfile Gemfile.lock /app

# gemのインストール
RUN bundle install
# カレントディレクトリのファイルを作業ディレクトリにコピー
COPY . /app

# Rails起動コマンド
CMD ["rails", "server", "-b", "0.0.0.0"]

ちなみに

ちなみにdefault-mysql-clientを無しにするとdocker exec -it rails_app bin/rails dbconsoleを行った際に以下のエラーが出ました

Couldn't find database client: mysql, mysql5. Check your $PATH and try again.

4. Gemfileの作成

今回はRails 7.0.4を使用するので、そのバージョンを指定

source 'https://rubygems.org'
gem 'rails', '7.0.4'

5. docker-compose.ymlの作成

version: '3'
services:
  db:
    # コンテナ名は任意で
    container_name: rails_app_db
    # 使いたいmysqlのバージョンを指定。今回は8.0を使用
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: root
    ports:
      - "3306:3306"
    volumes:
      - ./tmp/db:/var/lib/mysql

  app:
    # コンテナ名は任意で
    container_name: rails_app
    build: .
    command: bash -c "bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/app
    ports:
      - "3000:3000"
    depends_on:
      - db

6. Railsプロジェクトの立ち上げ

コンソールでRailsの立ち上げとdocker-composeのビルドのコマンドを実行

$ docker-compose run app rails new . --force --no-deps --database=mysql
$ docker-compose build

--force 既存のGemfileを上書き

--no-deps リンクしたサービスを起動しない

--database=mysql DBにmysqlを指定

7. config/database.ymlにDBの設定を追加

・・・省略
development:
  <<: *default
  database: app_development
  # ここから
  host: db
  username: root
  password: password
  # ここまで
・・・省略
test:
  <<: *default
  database: app_test
  # ここから
  host: db
  username: root
  password: password
  # ここまで
・・・省略

8. DBの作成

コンソールでDB作成のコマンドを実行

$ docker-compose run app rails db:create

9. Dockerイメージの起動

コンソールでdocker composeを立ち上げる

$ docker-compose up

11. 無事作成完了

ブラウザでhttp://localhost:3000/にアクセス

参考ページ

最後に

ローカルでRailsアプリの立ち上げまで完了しました

次は、勉強がてら稼働時間を管理するWebアプリを作ってみる予定です!