🚦

【ポート競合対策】個人開発でローカル環境のポート番号割り当ての工夫

に公開

はじめに

ローカルで複数の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

4. .envdocker-compose.ymlでポート番号を整理

以下のようにポート番号を意図的にずらす設計を取り入れる:

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スキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
https://onewedge.co.jp/

GitHubで編集を提案

Discussion