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 migrate・php artisan testの実行が軽くなる- Vite開発サーバーが
node_modules/を高速に解決し、HMRのラグが減る - PhpStormやVS Codeのファイルインデックス更新が体感できるほど速くなる
CLIは完全にDocker互換なので、今使っているコマンドは一切変更不要です。
実戦設定: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開発サーバーには .env の VITE_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.ts の hmr.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 Desktop | OrbStack |
|---|---|---|
| Mac専用最適化 | ||
| CLIドロップイン互換 | ||
| *.orb.local 自動ドメイン | ||
| 個人非商用 無料 | 条件付き | ○ |
| 商用ライセンス | 月5ドル〜 | 月8ドル |
まとめ:まず動かしてみることが一番早い
Docker DesktopからOrbStackへの移行は、ツールの再インストールとCompose起動のコマンド一発で完了します。既存の構成を書き直す必要はなく、移行コストがほぼゼロな割に、日々のLaravel開発の快適さが体感できるレベルで変わります。
とりわけ composer install やViteのHMR、php artisan test の実行頻度が高い開発者ほど恩恵を感じやすいはずです。*.orb.local による自動ドメイン機能も、複数プロジェクトを並行開発するチームには地味に刺さる機能です。
まずはローカルの開発機1台で試して、体感を確かめてみてください。
この技術、御社の業務にも活かせます
業務システム開発
Laravelを使った業務システムの構築・改修を20年以上の経験でサポートします
※ 通常1営業日以内にご返信します
「うちのDocker環境、もう少し整理したい」と思ったら
OrbStackの導入自体はシンプルですが、「既存のcompose構成が複雑で整理したい」「本番のAWS / GCPとローカル環境を揃えたい」「チーム全体の開発環境を統一したい」といった相談は意外と多いです。
環境構築から本番デプロイフローの整備まで、Laravelの開発インフラに関するご相談はお気軽にどうぞ。まずは状況を聞かせていただくだけでも構いません。