【初心者向け】DockerでRails APIとMySQLの環境構築をする(M1 Mac)

今回の記事では、DockerとDocker Composeを用いた、Rails APIとMySQLの環境構築の手順を解説していきます。

最終的に、rails new <app名> --api -d mysql --skip-bundleコマンドを用いて、以下のようなRailsのデフォルトページを作成し、ブラウザからページが見れることを確認します。

Rails API デフォルトページ

この記事では、メソッドや語句の説明などの細かい知識は説明しません。

DockerやRailsの各手順については、詳しい解説記事へのリンクを適宜掲載しています。

【用語の定義】

  • アプリケーション: ここでは、投稿サービスやSNSサービスなどのWebサービス、Docker Desktop for Mac等のデスクトップアプリの呼び方を「アプリケーション」に統一します。

※ サンプルコード先頭の「$」はここから右側はコマンドだよ!という目印です。「$」以降のコードをターミナルで実行してください。

1. 今回使用する開発環境/バージョン

今回の記事では、以下の開発環境/バージョンを使用して解説します。

  • M1 Mac: Memory 16GB
  • Docker Desktop: v4.53.0
  • Docker Compose: v2.40.3
  • Ruby: v3.4.3
  • Ruby on Rails: v8.0.3(リリースされているRailsバージョンによっては8.0.3以上の可能性もあり)
  • MySQL: v8.4.8

Ruby on Railsに関しては、2025年9月22日(月)時点での最新バージョンを使用しています。

Docker、Docker Composeに関しては、2025年11月27日(木)時点でのDocker Desktopが採用している最新バージョンを使用しています。詳しくは 公式リリース情報 をご覧ください。

Rubyのバージョンに関してはv3.4.3で固定しています。

MySQLに関しては、2026年1月20日(火)にリリースされたv8.4.8を使用しています。

2. Docker Desktop for Macをインストールする

※すでにDocker Desktop for Macをインストール済みの方は、次のステップに進んでください。

Docker Desktop for MacというアプリケーションをMac PCにインストールするだけで、開発環境でDockerを使用する準備が整います。

詳しいインストール方法は、Docker Desktop for Macのインストール手順 を参考にしてください。

それでは次のステップに進み、実際にDocker環境を構築していきます。

3. Docker環境を構築するためのフォルダを用意する

VS Code(Visual Studio Code)を使用して開発を行います(Cursorなどお好きなエディタを使用して問題ありません)。エディタのインストール方法は省略します。

3-1. ターミナルでDesktopに移動する

まずVS Codeを開きます。

次に、画面上部バー「Terminal」内の「New Terminal」をクリックします。

VS Code New terminal

「New Terminal」をクリックすると、VS Code内下部にターミナルが表示されます。

今後のコマンド操作は、このターミナル内で行っていきます。

VS Code Terminal

ターミナルを開くと、カレントディレクトリ(現在のディレクトリ)が~になっています。

lsコマンドを実行すると、カレントディレクトリ内のファイルを見ることができます。

今回はDesktop内にファイルを作成するので、Desktopに移動します。

VS Code Terminal ls

下記コードを実行し、Desktopディレクトリに移動します。

$ cd Desktop
VS Code Terminal cd Desktop

ディレクトリを移動すると、先ほどのカレントディレクトリ~Desktopに変わっています。

これでカレントディレクトリが変更できました。

以下、lsコマンドと同じようにターミナルでコマンドを実行し、手順を進めてください。

3-2. GitとGitHubで管理するためのフォルダを作成する

まずはGitとGitHubで管理するためのGitHubフォルダを作成します。

$ mkdir GitHub

GitHubフォルダ内にターミナルから移動します。

$ cd GitHub

後ほどGitHubフォルダ内で作業をするため、VS Codeはそのまま開いておいてください。

なぜかというと、一度VS Codeを閉じてしまうと、再度Desktop内のGitHubフォルダにVS Codeのターミナルから移動する必要があるからです。

※手動で作成する場合は、Desktop上の画面を2本指でクリックをしてフォルダを作成してください。

4. GitHubで新しいリポジトリを作成する

※ GitHubアカウントを作成していない方は、GitHubアカウント作成方法 を参考に登録してください。

それでは、GitHubでコードを管理するためにリポジトリを作成します。

まずは、自身のGitHubアカウントにアクセスし、「Repositories」内の緑色の「New」ボタンをクリックしてください。

GitHub Repositories

「New」をクリックすると、下記の「リポジトリ作成画面」が表示されます。ここでリポジトリ名の指定やリポジトリの公開設定等を行います。

下記に設定情報を列挙しますので、それに合わせてリポジトリ作成の必要項目を入力し、「Create repository」をクリックしてください。

  • Repository name: rails-api-docker
  • Description: 空白
  • 公開設定: Public
  • Initialize this repository with: 「Add a README file」にチェックを入れる
  • 上記以外: デフォルト設定のまま
GitHub Create a new repository 1
GitHub Create a new repository 2

リポジトリが作成されると、下記のように新しいリポジトリのページが作成されます。

GitHub rails-api-docker repository

5. GitHubからリポジトリをcloneし、Gitで管理できるようにする

※「cloneする」とは、「GitHubのリポジトリを自身のパソコンにコピーする」ようなイメージです。

5-1. 新しく作成したリポジトリのclone用コードを取得する

まずは、「4. GitHubでリポジトリを作成する」で作成したGitHubのrails-api-dockerリポジトリを開いてください。

次に、rails-api-dockerリポジトリ内の緑色の「Code」ボタンをクリックしてください。「Code」ボタンをクリックすると、下記のようなリポジトリのclone方法やダウンロード方法に関する情報が表示されます。

GitHub rails-api-docker clone用Code

表示中の「Local」の「Clone」の「HTTPS」にある、「https://github.com/<自身のユーザー名>/rails-api-docker」というコードをコピーしてください。コピーしたコードはclone時に使用します。

5-2. 自身のパソコンにGitHubリポジトリをcloneする

次に自身のMacへリポジトリをcloneします。

3.2 GitとGitHubで管理するためのフォルダを作成する」で作成した自身のDesktop内にあるGitHubフォルダ内に、VS Codeのターミナルから移動してください(もしくは、先程の開いたままのVS Codeに移動してください)。

移動後ターミナルで、「5.1 新しく作成したリポジトリのclone用コードを取得する」で取得したHTTPS接続用のURLを用いて、下記コードを実行します。

$ git clone https://github.com/<自身のユーザー名>/rails-api-docker

コードを実行すると、「README.md」ファイルの入った「rails-api-docker」フォルダが作成されます。

これで、「rails-api-docker」フォルダで編集を行い、「$ git commit ~」や「$ git push ~」等のコマンドを実行すると、自身のGitHubリポジトリにも変更が反映され、今までのコード履歴を見ることができます。

6. Dockerfile、docker-compose.yml、その他ファイルを作成する

6-1. Dockerfileを作成する

5.2 自身のパソコンにGitHubリポジトリをcloneする」でcloneしたrails-api-dockerファイル内に、下記Dockerfileを作成してください。

FROM ruby:3.4.3-alpine

ENV RUNTIME_PACKAGES="bash tzdata mariadb-dev git make" \
    DEV_PACKAGES="build-base yaml-dev" \
    HOME=/${WORKDIR} \
    LANG=C.UTF-8 \
    TZ=UTC

RUN apk update && \
    apk upgrade && \
    apk add --no-cache ${RUNTIME_PACKAGES} && \
    apk add --virtual build-dependencies --no-cache ${DEV_PACKAGES} && \
    apk add nodejs yarn

RUN mkdir /rails-api-docker
ENV APP_ROOT /rails-api-docker
WORKDIR $APP_ROOT

COPY Gemfile $APP_ROOT
# 以下、コメントアウト
# COPY Gemfile.lock $APP_ROOT
RUN bundle install

COPY . $APP_ROOT

RUN apk del build-dependencies

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh

ENTRYPOINT ["entrypoint.sh"]

CMD ["bundle", "exec", "rails", "server", "-p", "3000", "-b", "0.0.0.0"]

EXPOSE 3000

※ Dockerイメージにはalpine以外にも様々な種類がありますので、気になる方は Dockerイメージの種類 を参考にしてください。

※ Dockerfileの書き方については、Dockerfileの書き方 を参考にしてください。

6-2. entrypoint.shを作成する

entrypoint.shは、コンテナを起動する前に初期処理をしたいときなどに使用することができます。

Dockerfileの作成と同じく、「5.2 自身のパソコンにGitHubリポジトリをcloneする」でcloneしたrails-api-dockerファイル内に、下記entrypoint.shを作成してください。

#!/bin/bash
set -e

echo "Waiting for DB..."

# DBが接続可能になるまで待つ
until nc -z db 3306; do
  sleep 1
done

echo "DB is ready!"

# データベースのマイグレーションを実行
echo "Running database migrations..."
bundle exec rails db:migrate

# コンテナのメインプロセス(DockerfileでCMDと設定されているもの)を実行する
exec "$@"

entrypoint.shについては、Dockerfileの書き方を解説した記事 内で説明しています。

6-3. docker-compose.ymlを作成する

Dockerfileの作成と同じく、「5.2 自身のパソコンにGitHubリポジトリをcloneする」でcloneしたrails-api-dockerファイル内に、下記docker-compose.ymlを作成してください。

「db」がMySQLのコンテナ、「app」がRails APIのコンテナです。

services:
  db:
    image: mysql:8.4.8
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      MYSQL_DATABASE: ${DB_NAME_DEVELOPMENT}
    volumes:
      - db-data:/var/lib/mysql
    ports:
      - "3306:${DB_PORT}"

  app:
    build: .
    environment:
      DB_USER: ${DB_USER}
      DB_PASSWORD: ${DB_PASSWORD}
      DB_HOST: ${DB_HOST}
      DB_NAME_DEVELOPMENT: ${DB_NAME_DEVELOPMENT}
      DB_NAME_TEST: ${DB_NAME_TEST}
      DB_PORT: ${DB_PORT}
      FRONTEND_ORIGIN: ${FRONTEND_ORIGIN}
      RAILS_ENV: ${RAILS_ENV}
    volumes:
      - .:/rails-api-docker
      - log-data:/rails-api-docker/log
    ports:
      - "3000:3000"
    depends_on:
      - db

volumes:
  log-data:
  db-data:

docker-compose.ymlの書き方については、docker-compose.ymlの書き方 を参考にしてください。

6-4. 環境情報を.envに設定する

.envを使用すると、コードの中で環境変数を使用したいときにその情報をまとめて記載しておくことができます。主にデータベースのパスワードなどの秘匿情報を設定するときに活用します。

今回は、Dockerfileとdocker-compose.ymlの設定情報を.envに記載します。

Dockerfileの作成と同じく、「5.2 自身のパソコンにGitHubリポジトリをcloneする」でcloneしたrails-api-dockerファイル内に、下記.envを作成してください。

DB_USER=root
DB_PASSWORD=12345678
DB_HOST=db
DB_NAME_DEVELOPMENT=my_app_development
DB_NAME_TEST=my_app_test
DB_PORT=3306
RAILS_ENV=development

FRONTEND_ORIGIN=http://localhost:3001

※Rails 5.2以降は、「dotenv-rails」を明示的にインストールしなくても、「.env」を作成し環境情報をセットするだけで、プロジェクト内で環境変数を使用することができます。

6-5. Gemfileを作成する

Dockerfileの作成と同じく、「5.2 自身のパソコンにGitHubリポジトリをcloneする」でcloneしたrails-api-dockerファイル内に、下記Gemfileを作成してください(bundle initを使用する方法もあります:https://bundler.io/guides/gemfile.html)。

Railsバージョンを8.0.3(パッチバージョンのバージョンアップを許可する書き方)に指定します。

source "https://rubygems.org"

ruby '3.4.3'

gem "rails", "~> 8.0.3"

Railsバージョンを8.0.2(パッチバージョンのバージョンアップを許可する書き方)にすると、Rails側で自動的に、最新のパッチバージョンに変換してくれます。

ーーー最初に用意するGemfileでrailsを8.0.2に指定ーーー
source "https://rubygems.org"

ruby '3.4.3'

gem "rails", "~> 8.0.2"

ーーーrails newで生成されたGemfileーーー
source "https://rubygems.org"

# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main"
gem "rails", "~> 8.0.3"

・・・省略・・・

※ 2025/11/28(Fri)現在では、8.0.xの最新のパッチバージョンは、8.0.4になります。

ちなみに、Railsのバージョンをイコール(=)で固定しようとすると、内部的にRailsが「~> 指定したRailsバージョン」のように自動的に変換してくれます。

ーーー最初に用意するGemfileでrailsを8.0.1に固定ーーー
source "https://rubygems.org"

ruby '3.4.3'

gem "rails", "= 8.0.1"

ーーーrails newで生成されるGemfileーーー
source "https://rubygems.org"

# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main"
gem "rails", "~> 8.0.1"

・・・省略・・・

以下、参考資料です。

7. rails new <app名> --api -d mysql --skip-bundleでアプリケーションを作成する

7-1. コンテナイメージをビルドする

$ docker compose build

上記ビルドを行わずにrails newコマンドを実行すると、下記エラーが出現します。

bundler: command not found: rails
Install missing gem executables with `bundle install`

7-2. rails new <app名> --api -d mysql --skip-bundle を実行する

今回は、rails new <app名> --api -d mysql --skip-bundleを使用してRuby on Rails環境を構築します。

rails newコマンドは、Railsを使用したアプリケーションの雛形を素早く作成するためのコマンドです。

データベースには、広く使用されており、ドキュメントも豊富なMySQLを選定します。

まず、先ほど「5.2 自身のパソコンにGitHubリポジトリをcloneする」でcloneしたrails-api-dockerフォルダに移動します。

次に、VS Codeのターミナルで以下のコマンドを実行し、アプリケーションを作成します。

$ docker compose run app rails new <app名> --api -d mysql --skip-bundle

今回はmy-appという名前のフォルダを作成するため、<フォルダ名>の部分をmy-appに変更してコマンドを実行します。

$ docker compose run app rails new my-app --api -d mysql --skip-bundle

※docker composeコマンドは、現在のディレクトリにdocker-compose.ymlファイルが存在する場合にのみ実行できます。

コマンドを実行すると、my-appディレクトリ/ファイル群が作成され、以下のような構造になります。

rails-api-docker
├── log
├── my-app
│   ├── その他Railsのファイル/フォルダ群
│   ├── log
│   ├── Gemfile
│   ├── Gemfile.lock
│   ├── Dockerfile
│   └── README.md
├── .env
├── docker-compose.yml
├── Dockerfile
├── entrypoint.sh
├── Gemfile
├── Gemfile.lock
└── README.md

その後、以下の3つの変更を行います。

  1. ルートディレクトリに新しくproductionフォルダを作成する(フォルダ名は任意)
  2. rails new実行時に作成されたDockerfile(Rails7.1から自動生成)を「1.」で作成したproductionフォルダ内に移動する
  3. プロジェクトルートのlog、Gemfile、Gemfile.lock、README.md(あれば)を削除する
  4. my-app内のすべてのファイルやフォルダをルートディレクトリ(rails-api-docker内)に移動する
  5. 空のmy-appフォルダを削除する
  6. Dockerfileのコメントアウト部分(ADD Gemfile.lock $APP_ROOT/)のコメントアウトを解除

【変更後のrails-api-dockerディレクトリ構造】

rails-api-docker
    ├── その他Railsのファイル/フォルダ群
    ├── log
    ├── docker-compose.yml
    ├── Dockerfile
    ├── entrypoint.sh
    ├── Gemfile
    ├── production
    │   └── Dockerfile
    └── README.md
【変更前のDockerfile】
FROM ruby:3.4.3-alpine

・・・省略・・・

# ADD Gemfile.lock $APP_ROOT/

・・・省略・・・
【変更後のDockerfile】
FROM ruby:3.4.3-alpine

・・・省略・・・

ADD Gemfile.lock $APP_ROOT/

・・・省略・・・

最後に、下記コマンドを実行し、$ docker compose runコマンドで立ち上がった不要なコンテナを停止させます。

$ docker compose down

8. Docker環境を構築し、作成したアプリケーションを確認する

手順は以下の3ステップです。コマンドは全てターミナルで実行してください。

  1. $ docker compose buildを実行し、イメージをビルドする
  2. $ docker compose up -dを実行し、コンテナを起動する
  3. $ docker psを実行し、コンテナが起動していることを確認する

※ Dockerにおける「イメージのビルド」とは、Dockerイメージを作成するためのプロセスを指します。イメージは、Dockerコンテナの実行に必要なすべての依存関係、設定、およびアプリケーションの実行に必要なファイルなどを含んだパッケージのことです。簡単にいうと、イメージのビルドは、Docker環境を構築するための準備作業の一部です。

まずは、下記コマンドを使用してイメージをビルドします。

$ docker compose build
VS Code Terminal docker-compose build

次に、下記コマンドを使用してコンテナを起動します。

$ docker compose up -d

up -dコマンドは、コンテナをバックグラウンドで起動してくれるため、コンテナが起動している最中でもターミナルにコマンドを入力し実行することができます。

VS Code Terminal docker-compose up -d

最後に、下記コマンドを実行して、rails-api-dockerコンテナが起動していることを確認してください。

$ docker ps
VS Code Terminal docker ps

コマンドを実行すると、コンテナIDが割り振られ、使用しているイメージの名前、コンテナ内で実行されているコマンド、起動時間などが表示されます。

しかし、この状態でコンテナを起動し、設定したアプリケーションのURLである「localhost:3000」にブラウザからアクセスしても、appコンテナは下記エラーを吐き、立ち上がりません。

ActiveRecord::ConnectionNotEstablished: Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' (2)


Caused by:
Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' (2)

上記エラーを解決するには、database.ymlでのデータベースの設定が必要です。

9. MySQLの設定をdatabase.ymlで行う

9-1. database.ymlの設定

「/config/database.yml」をVS Codeで開いてください。

database.yml内の「development」と「test」欄に、「6-4. 環境情報を.envに設定する」で設定した環境情報を、変数(環境変数)としてセットします。

【変更前】
・・・省略・・・

development:
  <<: *default
  database: my_app_development

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: my_app_test

・・・省略・・・
【変更後】
・・・省略・・
  
development:
  <<: *default
  database: <%= ENV['DB_NAME_DEVELOPMENT'] || 'my_app_development' %>
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV['DB_USER'] || 'root' %>
  password: <%= ENV['DB_PASSWORD'] || '' %>
  host: <%= ENV['DB_HOST'] || 'db' %>
  port: <%= ENV['DB_PORT'] || '3306' %>

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: <%= ENV['DB_NAME_TEST'] || 'my_app_test' %>
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV['DB_USER'] || 'root' %>
  password: <%= ENV['DB_PASSWORD'] || '' %>
  host: <%= ENV['DB_HOST'] || 'db' %>
  port: <%= ENV['DB_PORT'] || '3306' %>

・・・省略・・・

9-2. 古いデータベース設定情報を削除

現在のコンテナのまま、$ docker compose up -dを実行しコンテナを起動させると、下記「ActiveRecord::ConnectionNotEstablished」エラーが出力されます。

ActiveRecord::ConnectionNotEstablished

これは、「9-1. database.ymlの設定」において、host名等を環境変数に置き換えたために発生しています。

「database.yml」の変更を反映させるため、古いコンテナを停止し、コンテナの再ビルド、再起動を行います。

下記手順を実行してください。

  1. コンテナ停止:$ docker compose down
  2. ビルド:$ docker compose build
  3. コンテナ起動:$ docker compose up -d

※ 上記を試してもうまく行かない場合は、コンテナやイメージ、ボリュームの削除を行い、再度上記の手順を試してみてください。

10. データベースを作成する(※すでに作成されている場合スキップ可能です。)

このまま「http://localhost:3000/」にブラウザからアクセスすると、下記「ActiveRecord::NoDatabaseError」エラーが出力されます。

ActiveRecord::NoDatabaseError

上記「ActiveRecord::NoDatabaseError」エラーを解決するには、下記「rails db:create」コマンドを実行します。

$ docker compose exec app rails db:create

もしくは、エラーページ内の「Create database」を押すことでもエラーが解消されます。

「Create database」ボタンが表示されていない場合、rails db:createコマンドを使用してデータベースを作成してください。

11. 作成したアプリケーションを確認する

ブラウザのURLバーに「http://localhost:3000/」と入力し、Enterを押してください。

URLを入力すると、下記のようなRuby on Railsのデフォルトページが表示されるはずです。

Rails API デフォルトページ

環境を終了したい場合は、コンテナ終了用の下記コマンドを実行してください。

$ docker compose down

$ docker compose downコマンドを実行すると、コンテナが終了します。

VS Çode Terminal docker-compose down

環境を終了し「http://localhost:3000/」をリロードすると、先ほどのRuby on Railsのデフォルトページが見れなくなっていることがわかります。

This site can't be reached

これでDockerを用いたRails APIとMySQLの環境構築が終わりました!

終わりに

本記事がDockerの導入や学習を始めるきっかけになれば幸いです。

Docker・Docker Composeとは何かを知りたい方はこちら

「【入門】Dockerとは|仕組みとメリットをわかりやすく解説」のメインビジュアル【初心者向け】Dockerとは|仕組みとメリットをわかりやすく解説 「【初心者向け】Docker Composeとは|仕組みとメリットをわかりやすく解説」のメインビジュアル【初心者向け】Docker Composeとは|仕組みとメリットをわかりやすく解説

Dockerfile・docker-compose.ymlの作り方を知りたい方はこちら

「【初心者向け】Dockerfileとは?書き方をわかりやすく解説(RUN,COPY,ENV,ENTRYPOINTなど)」のメインビジュアル【初心者向け】Dockerfileとは?書き方をわかりやすく解説(RUN,COPY,ENV,ENTRYPOINTなど) 「【初心者向け】docker-compose.ymlとは?書き方をわかりやすく解説(services,image,build,volumesなど)」のメインビジュアル【初心者向け】docker-compose.ymlとは?書き方をわかりやすく解説(services,image,build,volumesなど)

Docker・Docker Composeで環境構築をしたい方はこちら

【初心者向け】DockerでReactの環境構築をする(M1 Mac) 【初心者向け】DockerでRails APIとPostgreSQLの環境構築をする(M1 Mac)

Docker Desktopのインストール方法を知りたい方はこちら

Docker Desktop for Macのインストール方法【画像付きで詳しく解説】