Docker で Laravel + React を構築する手順
Laravel(バックエンド)と React(フロントエンド)を Docker で構築する手順を書きます。
目次
- プロジェクトのディレクトリ構成
 - Docker 環境のセットアップ
 - Laravel のセットアップ(バックエンド)
 - React のセットアップ(フロントエンド)
 - Docker Compose でコンテナを起動
 - フロントエンドから Laravel API を叩く
 - トラブルシューティング
 - 詰まったポイント
 - まとめ
 
プロジェクトのディレクトリ構成
まず、以下のようなディレクトリ構成でプロジェクトを作成します。
my-project/
 ├── back/             # Laravel (API)
 │   ├── app/
 │   ├── bootstrap/
 │   ├── config/
 │   ├── database/
 │   ├── public/       # Apache/Nginx で公開
 │   ├── resources/
 │   ├── routes/
 │   ├── .env
 │   ├── Dockerfile    # Laravel 用 Dockerfile
 │   ├── composer.json
 │   ├── artisan
 ├── front/            # React (フロントエンド)
 │   ├── src/
 │   ├── public/
 │   ├── Dockerfile    # React 用 Dockerfile
 │   ├── package.json
 ├── docker-compose.yml # Docker Compose 設定
 ├── nginx/            # Nginx の設定(本番環境用)
 │   ├── default.conf
Docker 環境のセットアップ
まずは docker-compose.yml を作成し、Laravel(PHP + Apache + MySQL)と React(Node.js)を動かせるようにします。
📌 docker-compose.yml
version: "3.8"
services:
  # Laravel API (Apache + PHP-FPM)
  back:
    container_name: laravel_back
    build: ./back
    volumes:
      - ./back:/var/www/html
    environment:
      TZ: Asia/Tokyo
    ports:
      - "9000:80" # 外部 9000 → コンテナ内 80(Apache)
    depends_on:
      - db
    tty: true
    stdin_open: true
  # MySQL
  db:
    image: mysql:5.7
    container_name: laravel_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: laravel
      MYSQL_USER: laravel
      MYSQL_PASSWORD: secret
    ports:
      - "13306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
  # React フロントエンド
  front:
    container_name: react_front
    build: ./front
    volumes:
      - ./front:/app
      - /app/node_modules # node_modules はコンテナ内で管理
    ports:
      - "3000:3000"
    depends_on:
      - back
    stdin_open: true
    tty: true
volumes:
  mysql_data:
Laravel のセットアップ
次に、Laravel の Docker 環境を作成します。
📌 back/Dockerfile
FROM php:8.2-apache
# 必要なパッケージをインストール
RUN apt-get update && apt-get install -y \
    libxml2-dev libzip-dev unzip git curl \
    && docker-php-ext-install pdo pdo_mysql zip
# Apache の設定(mod_rewrite を有効化)
RUN a2enmod rewrite
# Composer をインストール
COPY  /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/html
COPY . .
# Laravel のセットアップ
RUN composer install --no-scripts --no-dev --prefer-dist
RUN php artisan key:generate
RUN php artisan config:cache
# 権限設定
RUN chown -R www-data:www-data /var/www/html
RUN chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache
EXPOSE 80
React のセットアップ
React 用の Dockerfile を作成します。
📌 front/Dockerfile
FROM node:18
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
📌 front/package.json
{
  "name": "front",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "react-scripts": "5.0.1"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build"
  }
}
📌 front/src/index.js
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);
Docker Compose でコンテナを起動
docker-compose up -d --build
1.すべてのコンテナが正常に動作しているか確認
docker ps
2.Laravel API が動いているか確認
curl http://localhost:9000/api/hello
3.React アプリにアクセス
- フロントエンドから Laravel API を叩く
📌 front/src/App.js 
import React, { useEffect, useState } from "react";
function App() {
  const [message, setMessage] = useState("");
  useEffect(() => {
    fetch("http://localhost:9000/api/hello")
      .then((res) => res.json())
      .then((data) => setMessage(data.message))
      .catch((err) => console.error("Error fetching API:", err));
  }, []);
  return (
    <div>
      <h1>React + Laravel API</h1>
      <p>{message}</p>
    </div>
  );
}
export default App;
✅ ブラウザで http://localhost:3000 にアクセスすると、Laravel API のデータが表示される!
詰まったポイント & 解決策
途中詰まったポイントをまとめました!💡
❌ docker-compose up で Cannot start service db: Ports are not available
docker-compose.yml の ports を 13306:3306 に変更
❌ Laravel の php artisan コマンドが動かない
✅ 解決策
docker exec -it laravel_back bash
composer install --no-scripts
php artisan key:generate
php artisan config:cache
❌ React が npm start でエラー
✅ 解決策
docker run --rm -v $(pwd)/front:/app -w /app node:18 bash -c "rm -rf node_modules package-lock.json && npm install"
そして、Docker コンテナを再起動
docker-compose down
docker-compose up -d --build
❌ React の画面が真っ白
✅ 解決策
ブラウザの F12 → Console を確認
src/index.js を修正
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);
❌ Uncaught TypeError: react_dom__WEBPACK_IMPORTED_MODULE_1__.render is not a function
✅ 解決策
React 18 では ReactDOM.render() の代わりに createRoot() を使用!
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);
まとめ
✅ docker-compose up -d --build で Laravel + React を起動
✅ http://localhost:3000 で React アプリを表示
✅ http://localhost:9000/api/hello で Laravel API が動作
✅ React から Laravel API を fetch で取得
Discussion