Laravel 2026.06.25

Laravel開発をOrbStackで爆速化|docker-composeが軽くて速い実戦環境

約18分で読めます

Docker Desktopの重さに悩むLaravel開発者向け。OrbStackへの乗り換えでファイルI/Oが改善し、composer installやViteのHMRが快適になる実戦設定を解説します。

Docker Desktop × Laravelの「重さ」、もう限界じゃないですか?

MacでLaravel開発をしていて、こんな場面に覚えはないでしょうか。

  • composer install を走らせたら vendor/ のマウントで数分待たされる
  • Viteの開発サーバーを起動してもHMRがワンテンポ遅れる
  • コンテナを数本立ち上げるだけでMacのファンが唸り始める
  • Docker Desktopのメモリ使用量がいつの間にか数GBに膨れ上がっている

これらはDockerの設定が悪いわけではなく、macOSとLinuxコンテナの間に挟まるファイルシステムのマウント処理がボトルネックになっているのが根本原因です。特にLaravelプロジェクトは vendor/node_modules/storage/ など大量の小さなファイルを扱うため、この問題が顕著に出やすい。

本記事では、Docker Desktopの代替として注目されている OrbStack をLaravel開発環境に導入する方法を、実際のdocker-compose構成ファイルとともに解説します。既存のCompose構成やLaravel Sailはそのまま使えるので、移行コストはほぼゼロです。


なぜLaravel開発にファイルI/Oの速さが効くのか

Docker Desktopのファイルマウントが遅い理由

Docker Desktopは内部にLinux仮想マシン(VM)を立て、macOS側のファイルシステムとコンテナをgRPCベースのVirtioFSでブリッジしています。このブリッジ経由のI/Oスループットはネイティブの概ね25〜40%程度にとどまると報告されており、ファイル数が多いほど遅延が積み重なります。

Laravelプロジェクトを新規にセットアップしたとき、vendor/ 以下には数千〜1万ファイル超が展開されます。node_modules/ まで含めれば軽く数万ファイルになる。これらをマウント経由で読み書きするたびに、わずかな遅延が何万回も積算されます。

OrbStackが速い理由

OrbStackはApple Virtualization Frameworkを直接活用したMac専用のコンテナランタイムです。VMのオーバーヘッドを極限まで削り込んだアーキテクチャで動作し、ファイルI/Oのスループットは**ネイティブの75〜95%**に達します。

さらにメモリ使用量が50〜70%削減され、コンテナの起動も2秒未満が期待できます。Laravel開発で体感しやすい変化を挙げると次のとおりです。

  • composer install / composer update のマウント書き込みが速くなる
  • php artisan migratephp artisan test の実行が軽くなる
  • Vite開発サーバーが node_modules/ を高速に解決し、HMRのラグが減る
  • PhpStormやVS Codeのファイルインデックス更新が体感できるほど速くなる

CLIは完全にDocker互換なので、今使っているコマンドは一切変更不要です。


Laravelの開発・保守でお困りですか?

アップグレード代行・機能追加・パフォーマンス改善など、お気軽にご相談ください

無料で相談する

実戦設定:Laravel向けdocker-compose構成

プロジェクト構成

my-laravel-app/
├── docker/
│   ├── nginx/
│   │   └── default.conf
│   └── php/
│       └── Dockerfile
├── docker-compose.yml
├── .env
└── (Laravelプロジェクト本体)

docker-compose.yml

services:
  app:
    build:
      context: ./docker/php
      dockerfile: Dockerfile
    volumes:
      - .:/var/www/html
    depends_on:
      - mysql
      - redis
    networks:
      - laravel

  nginx:
    image: nginx:1.25-alpine
    ports:
      - "80:80"
    volumes:
      - .:/var/www/html
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - app
    networks:
      - laravel

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: laravel
      MYSQL_USER: laravel
      MYSQL_PASSWORD: secret
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - laravel

  redis:
    image: redis:7-alpine
    networks:
      - laravel

  node:
    image: node:20-alpine
    working_dir: /var/www/html
    volumes:
      - .:/var/www/html
    command: sh -c "npm install && npm run dev"
    ports:
      - "5173:5173"
    networks:
      - laravel

volumes:
  mysql_data:

networks:
  laravel:
    driver: bridge

php/Dockerfile

FROM php:8.3-fpm-alpine

RUN apk add --no-cache \
    git \
    curl \
    libpng-dev \
    libzip-dev \
    zip \
    unzip \
  && docker-php-ext-install pdo_mysql zip gd

RUN pecl install redis && docker-php-ext-enable redis

COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html

nginx/default.conf

server {
    listen 80;
    server_name _;
    root /var/www/html/public;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

artisanコマンドの実行

# マイグレーション
docker compose exec app php artisan migrate

# シーダー実行
docker compose exec app php artisan db:seed

# テスト実行(Pest / PHPUnit)
docker compose exec app php artisan test

# キャッシュクリア
docker compose exec app php artisan optimize:clear

# Composerパッケージインストール
docker compose exec app composer install

*.orb.local でのアクセス

OrbStackには *.orb.local ドメインへの自動アクセス機能が組み込まれています。コンテナ名に基づいてmDNSが自動設定されるため、/etc/hosts を手動で編集する必要がありません。

たとえば上記のcompose構成であれば、nginx コンテナに対して次のURLでブラウザからアクセスできます。

http://nginx.my-laravel-app.orb.local

Vite開発サーバーには .envVITE_APP_URL を合わせて設定しておくと、HMRのWebSocket接続先も自動解決されます。

# .env
APP_URL=http://nginx.my-laravel-app.orb.local
VITE_APP_URL=http://nginx.my-laravel-app.orb.local

vite.config.ts 側でもサーバーホストを明示しておくと安定します。

import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';

export default defineConfig({
  plugins: [
    laravel({
      input: ['resources/css/app.css', 'resources/js/app.js'],
      refresh: true,
    }),
  ],
  server: {
    host: '0.0.0.0',
    port: 5173,
    hmr: {
      host: 'node.my-laravel-app.orb.local',
    },
  },
});

これで localhost のポート管理から解放され、プロジェクト名をドメインで区別できるようになります。複数のLaravelプロジェクトを並行して動かしているチームには特に便利です。


Laravel Sail / Docker Desktopからの移行手順

移行は拍子抜けするほど簡単です。既存のdocker-compose.ymlもLaravel Sailのcompose構成もそのまま動きます。

flowchart TD
    A[Docker Desktop をアンインストール] --> B[OrbStack をインストール]
    B --> C[orbctl status で動作確認]
    C --> D[docker compose up -d を実行]
    D --> E[既存のCompose構成がそのまま起動]
    E --> F[*.orb.local URLで確認]

Step 1: Docker Desktopを停止・アンインストール

Dockerデーモンを停止してからDocker DesktopアプリをApplicationsフォルダから削除します。コンテナイメージのキャッシュも削除したい場合は先にクリアしておきましょう。

Step 2: OrbStackをインストール

# Homebrewでインストール
brew install orbstack

# またはorbstack.devから.dmgをダウンロード

インストール後にアプリを起動すると、Docker CLIのコンテキストが自動でOrbStackに切り替わります。

Step 3: 動作確認

docker info | grep -i orbstack
# Server: OrbStack ... と表示されればOK

docker compose up -d

Laravel Sailを使っている場合も同様です。./vendor/bin/sail up -d のコマンドはそのまま動作します。Sailが内部で呼び出すdocker composeのバックエンドがOrbStackに切り替わるだけです。


よくある失敗パターンと対処法

*.orb.local にブラウザからアクセスできない

OrbStackのmDNS機能はmacOSのmDNSリゾルバと統合されています。まれに初回起動直後やmacOSのネットワーク設定変更後に名前解決が通らないことがあります。

# OrbStackのネットワークをリセット
orbctl stop && orbctl start

# mDNSキャッシュをフラッシュ
sudo dscacheutil -flushcache

それでも解決しない場合は、念のため /etc/hosts にも 127.0.0.1 nginx.my-laravel-app.orb.local を追記して応急処置できます。

② Vite HMRのWebSocket接続が切れる

vite.config.tshmr.host にコンテナのOrb Local URLを明示していないと、HMRのWebSocketがlocalhost宛に張られてコンテナ外から届かないことがあります。前述の vite.config.ts 設定を確認してください。

③ マイグレーションでMySQLに接続できない

docker compose up -d 直後にすぐ php artisan migrate を叩くと、MySQLのヘルスチェックが完了する前に接続しようとして失敗することがあります。

# docker-compose.ymlのappサービスにhealthcheckを追加
mysql:
  image: mysql:8.0
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
    interval: 5s
    retries: 10
  # ...

app:
  depends_on:
    mysql:
      condition: service_healthy

④ Docker Desktopと共存しようとして競合する

Dockerデーモンは一つしか起動できません。Docker DesktopとOrbStackを同時に有効化すると docker コマンドのコンテキストが混乱します。OrbStackに移行する際はDocker Desktopを完全にアンインストールするか、Docker Desktopの設定から「Start Docker Desktop at login」をオフにしておきましょう。


料金について正直に

OrbStackは個人の非商用利用は無料です(年間収益1万ドル未満の個人プロジェクトが対象)。一方、商用利用は1ユーザーあたり月8ドル(年96ドル)の有料プランが必要です。チームで業務開発に使う場合は、会社の経費として計上する前提でライセンスを確認してください。Docker Desktopも一定規模以上の企業では有料なので、コスト感は大きく変わらないケースが多いでしょう。ライセンス条件の詳細は公式サイト(orbstack.dev)で最新情報を確認することをおすすめします。

項目Docker DesktopOrbStack
Mac専用最適化
CLIドロップイン互換
*.orb.local 自動ドメイン
個人非商用 無料条件付き
商用ライセンス月5ドル〜月8ドル

まとめ:まず動かしてみることが一番早い

Docker DesktopからOrbStackへの移行は、ツールの再インストールとCompose起動のコマンド一発で完了します。既存の構成を書き直す必要はなく、移行コストがほぼゼロな割に、日々のLaravel開発の快適さが体感できるレベルで変わります。

とりわけ composer install やViteのHMR、php artisan test の実行頻度が高い開発者ほど恩恵を感じやすいはずです。*.orb.local による自動ドメイン機能も、複数プロジェクトを並行開発するチームには地味に刺さる機能です。

まずはローカルの開発機1台で試して、体感を確かめてみてください。


Laravelの開発・保守でお困りですか?

アップグレード代行・機能追加・パフォーマンス改善など、お気軽にご相談ください

無料で相談する

この技術、御社の業務にも活かせます

業務システム開発

Laravelを使った業務システムの構築・改修を20年以上の経験でサポートします

200件以上の制作実績 顧客満足度97% 初回相談無料

※ 通常1営業日以内にご返信します

「うちのDocker環境、もう少し整理したい」と思ったら

OrbStackの導入自体はシンプルですが、「既存のcompose構成が複雑で整理したい」「本番のAWS / GCPとローカル環境を揃えたい」「チーム全体の開発環境を統一したい」といった相談は意外と多いです。

環境構築から本番デプロイフローの整備まで、Laravelの開発インフラに関するご相談はお気軽にどうぞ。まずは状況を聞かせていただくだけでも構いません。

この記事をシェア

Laravelの開発・運用、プロに任せませんか?

システム構築からバージョンアップまで、経験豊富なエンジニアがサポートします。 初回相談は無料です。

※ 1営業日以内にご返信いたします

この技術でお困りなら

無料でプロに相談できます

相談する
AIに無料相談