【ポート競合対策】個人開発でローカル環境のポート番号割り当ての工夫
はじめに
ローカルで複数のWebアプリやサービスを開発していると、ポートが競合して接続できない事態に遭遇します。特にDockerやXAMPP、MySQLなどを併用していると頻繁に発生します。本記事では、開発環境でのポート競合を未然に防ぐポート番号の割当の方法をご紹介します。
対象者
- 個人開発エンジニア
- 複数のアプリをローカルで並行開発している方
- ポート競合の解消に時間を取られた経験がある方
結論:ポート割り当てルール(個人用)
私個人のローカル環境におけるポート割り当てルールとして、基本ポート番号に「+1」した番号を開発用に使う方針を採っています。たとえば:
- Webアプリの本来のポートが8000番である場合 → 開発用には8001番を使う
- MySQLのデフォルトが3306番 → 開発用には3307番を使う
このように基本ポートを避けておくことで、XAMPPや他のサービスがデフォルトポートを使っていたとしても干渉せず、開発環境の安定性が高まります。
用途別ポート割り当て一覧
用途 | デフォルトポート | 開発用に使用するポート | 備考 |
---|---|---|---|
Webサーバー | 8000 | 8001 | 標準HTTPを避けるため |
MySQL | 3306 | 3307 | XAMPPなどと競合回避 |
Redis | 6379 | 6380 | 本番と区別しやすくなる |
PostgreSQL | 5432 | 5433 | 複数環境での使い分け |
Mailhog | 1025 | 1026 | テスト用途の衝突回避 |
ポート番号利用における注意点
- 1024未満のポートは「特権ポート」と呼ばれ、管理者権限(root)でなければ利用できません。開発用途では避けるのが一般的です。
- セキュリティ上の理由からも、予期せぬ常駐サービスとの衝突を避けるために、統一したルールを持っておくことが重要です。
そもそもポート番号とは?
ポート番号とは、コンピュータ上で動作する複数のアプリケーションが同時に通信を行えるようにするための“出入り口番号”のようなものです。IPアドレスが「どのコンピュータか」を示すのに対し、ポート番号は「そのコンピュータ上のどのアプリケーションと通信するか」を指定します。
例えば、同じIPアドレスでも、HTTPは80番、HTTPSは443番、MySQLは3306番など、用途ごとにポート番号が決まっており、これにより同じ端末内で複数のサービスが干渉せずに動作できます。
ポート番号の分類と由来
ポート番号は、IANA(Internet Assigned Numbers Authority)という国際機関によって管理されており、以下のように分類されています:
- 0〜1023:ウェルノウンポート(予約済み)。HTTP (80), HTTPS (443), SSH (22)など、広く使われる標準サービス。
- 1024〜49151:登録ポート。特定アプリやサービスでよく使われるが予約ではない。
- 49152〜65535:ダイナミック/プライベートポート。開発や一時的な接続用など自由に使われる範囲。
よく使うポートとその役割
番号 | 用途 | 備考 |
---|---|---|
80 | HTTP | 本番環境などで使われる標準Webサーバーポート。 |
8000 | 開発・デバッグ用 | DjangoやPHPビルトインサーバーなどが使うことが多い。 |
8080 | Webサーバー(HTTP代替) | ApacheやReactなどのフロント開発でよく使われる |
3000 | フロントエンド開発(React, Viteなど) | npm run dev で使われることが多い |
3306 | MySQL | デフォルトのMySQLポート。競合しやすい |
5432 | PostgreSQL | Docker環境などでも重複しやすい |
6379 | Redis | バックエンドやキャッシュ用で利用 |
1025 | SMTPテストサーバー | メール送信確認で使う |
ポート競合対策のTips
1. 使用中ポートの確認(Mac/Linux)
lsof -i :3306
出力例:
mysqld 12345 user 10u IPv4 0x... TCP *:mysql (LISTEN)
このように表示されたら、MySQLがそのポートを使っていると分かります。
2. 使用中ポートの確認(Windows)
netstat -aon | findstr :3306
3. 現在開いているポート一覧(Linux):
netstat -tuln
または:
ss -tuln
.env
やdocker-compose.yml
でポート番号を整理
4. 以下のようにポート番号を意図的にずらす設計を取り入れる:
services:
app:
ports:
- "8081:80"
db:
ports:
- "3307:3306"
このように "8081:80"
と指定した場合、左側の 8081
はローカルマシン(ホスト)のポート番号、右側の 80
はコンテナ(サービス側)のポート番号を意味します。つまり、ホストの8081番にアクセスすると、コンテナ内の80番ポートに接続される、というマッピングになります。
Dockerでのポート衝突を避ける方法
- Docker利用時:ポートマッピングでローカルとコンテナのポートを分ける。
- 複数のMySQLを使う:ホスト側ポートを変えて明確に分離。(例:3306 → 3307)
- 使っていないサービスを止める:XAMPP, PostgreSQLなどが常駐していて不要な場合は停止。
- VS CodeのLive Share/Previewと競合することもある:Previewが3000番台を占有している場合あり。
- セキュリティ面:開発用でもRedisやDBのポートを外部に晒さないよう注意。
おわりに
私自身、複数のLaravelプロジェクトをDockerで同時に立ち上げていた際に、MySQLやMailpitのポート競合で悩まされた経験があります。最初は原因不明の接続エラーに困惑しましたが、最終的に lsof
で調査したところ、他のテスト用コンテナが原因だと判明しました。
ポート番号の使い分けは、小さな工夫で大きなトラブルを防ぐための大切な習慣です。自分に合ったルールを定めることで、ローカル開発をより快適に進められます。本記事が、同じように悩んでいる方の参考になれば幸いです。
株式会社ONE WEDGE
【Serverlessで世の中をもっと楽しく】
ONE WEDGEはServerlessシステム開発を中核技術としてWeb系システム開発、AWS/GCPを利用した業務システム・サービス開発、PWAを用いたモバイル開発、Alexaスキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
Discussion