「Address already in use」エラーの原因と対処法|ポート競合の解決方法を環境別に徹底解説
- 作成日 2026.06.17
- mysql
開発中に以下のようなエラーで作業が止まった経験はありませんか?
Error: listen EADDRINUSE: address already in use :::3000
bind: address already in use
Bind for 0.0.0.0:8080 failed: port is already allocated
java.net.BindException: Address already in use
OSError: [Errno 98] Address already in use
これは「指定したポート番号がすでに他のプロセスに使われている」というエラーです。プロセス・サーバー・コンテナを起動するたびに遭遇する高頻度トラブルで、解決方法が分からないと開発が止まってしまいます。
- 昨日まで動いていた開発サーバーが起動しなくなった
- 直前にアプリを終了したのに、再起動でエラーが出る
- Dockerコンテナの起動に失敗する
- どのプロセスがポートを使っているのか分からない
- WindowsとMacで対処方法が違う気がする
- アプリを完全に強制終了する正しい方法が分からない
本記事では、「Address already in use」エラーのすべての原因と対処法を、Linux/Mac/Windowsそれぞれの環境別、Node.js/Python/Java/Docker/MySQL等のアプリケーション別に整理します。ポート使用プロセスの特定方法、安全な停止手順、TIME_WAIT問題、再発防止策、FAQまで完全網羅。この1本で「ポート競合」のトラブル全般が解決します。
- 1. 結論:今すぐ試すべき3ステップ
- 2. まず押さえる:エラーが出る本当の理由
- 3. ポート使用プロセスを特定する(Linux/macOS)
- 4. ポート使用プロセスを特定する(Windows)
- 5. プロセスを停止する方法
- 6. アプリケーション・フレームワーク別の対処
- 7. Docker での「port is already allocated」
- 8. データベースサーバーの対処
- 9. Webサーバーの対処
- 10. TIME_WAIT 状態の問題
- 11. 1024未満のポートと権限
- 12. 再発を防ぐベストプラクティス
- 13. トラブルシューティング・チェックリスト
- 14. よくある質問(FAQ)
- 14.1. Q1. プロセスを停止しても再起動するとまた同じエラーが出ます
- 14.2. Q2. lsofコマンドが見つかりません
- 14.3. Q3. Windowsで netstat -ano が分かりにくいです
- 14.4. Q4. kill -9 とkillの違いは?
- 14.5. Q5. Macで lsof を使うと「Operation not permitted」が出ます
- 14.6. Q6. dockerコンテナ内からホストの開発サーバーに接続できません
- 14.7. Q7. CI/CDパイプラインでポート競合が起きます
- 14.8. Q8. systemd経由で起動したサービスのプロセスを正しく停止するには?
- 14.9. Q9. ポートを自由に予約・解放できる仕組みはありますか?
- 14.10. Q10. ポート番号は何番までなら自由に使えますか?
- 14.11. Q11. WSL2でWindows側のポートと競合します
- 14.12. Q12. ifconfig や netstat が「コマンドが見つかりません」になります
- 15. 参考リンク・関連資料
- 16. まとめ
結論:今すぐ試すべき3ステップ
時間がない方向けに、まず試すべき手順を示します。
ステップ1:ポートを使っているプロセスを特定
# Linux/Mac
lsof -i :3000
# Linux(lsofが無い場合)
ss -tlnp | grep :3000
# Windows
netstat -ano | findstr :3000
ステップ2:プロセスを停止
# Linux/Mac
kill -9 <PID>
# Windows
taskkill /F /PID <PID>
ステップ3:アプリを再起動
エラーが解消されているはずです。それでも解決しない場合は、以下の詳細な原因分析へ進んでください。
まず押さえる:エラーが出る本当の理由
このエラーを理解するには、TCPポートの仕組みを知る必要があります。
TCPポートの基本
サーバーアプリケーションは、特定のポート番号でクライアントからの接続を待ち受けます。OSが1つのポートに対して1つのプロセスのみバインド可能というルールを持っているため:
プロセスA → ポート3000をバインド済み(待ち受け中)
プロセスB → 同じポート3000をバインドしようとする → エラー
エラーメッセージのバリエーション
OS・アプリケーションによって表記が異なりますが、すべて同じ原因です:
| 表記 | 出現環境 |
|---|---|
Address already in use | C/C++、Python、Java等 |
EADDRINUSE | Node.js、libuv |
port is already allocated | Docker |
bind() failed | Apache、Nginx |
Connection in use: xxx | Java Tomcat |
Cannot assign requested address | 別問題(IPバインドエラー) |
原因のカテゴリ
| カテゴリ | 例 | 頻度 |
|---|---|---|
| 同じアプリの2重起動 | nodemonでの再起動失敗、デバッガとアプリ同時起動 | 最多 |
| 前回プロセスがゾンビ化 | クラッシュ後、メモリには残っている | 多 |
| 別アプリがポート使用中 | 別の開発サーバー、システムサービス | 多 |
| Dockerコンテナ起動済み | 同じポートのコンテナが既に動作中 | 多 |
| TIME_WAIT状態 | 接続終了直後の再起動 | 中 |
| 権限不足(1024未満) | 1024未満のポートをroot以外で使用 | 中 |
| 複数IPバインド競合 | 0.0.0.0 と特定IPの衝突 | 少 |
これらを順番にチェックすればOKです。
ポート使用プロセスを特定する(Linux/macOS)
最重要のスキルです。複数のコマンドを使い分けます。
lsof(最も確実)
# 特定ポートを使用中のプロセス確認
lsof -i :3000
# 出力例
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 12345 alice 18u IPv6 0x1234 0t0 TCP *:3000 (LISTEN)
PID(プロセスID)= 12345 がポート3000を使用していると分かります。
lsofの便利な使い方
# プロセス名指定
lsof -i -P -n | grep LISTEN
# TCP接続のみ
lsof -iTCP:3000 -sTCP:LISTEN
# 複数ポートを一度に
lsof -i:3000,8080,5000
# 特定プロセスが開いているポート全部
lsof -i -P -p 12345
netstat(古いが普及)
# Linux
netstat -tlnp | grep :3000
# macOS(オプションが異なる)
netstat -anv | grep LISTEN | grep 3000
# 出力例
tcp6 0 0 :::3000 :::* LISTEN 12345/node
最後の 12345/node がPIDとプロセス名です。
⚠️ netstatは新しい Linux ディストリビューションではデフォルト未インストールになることが増えています。代わりに ss を使ってください。
ss(モダンな後継)
# 特定ポート確認
ss -tlnp | grep :3000
# 全LISTENポート
ss -tlnp
# 出力例
LISTEN 0 511 *:3000 *:* users:(("node",pid=12345,fd=18))
pid=12345 がPIDです。
fuser(プロセスにシグナルも送れる)
# 使用プロセス確認
fuser 3000/tcp
# 出力例
3000/tcp: 12345
# 強制終了まで一気に
fuser -k 3000/tcp
-kオプションは即時 KILL します。便利ですが慎重に。
pgrep / pkill(プロセス名で操作)
# Node.jsプロセスを探す
pgrep -lf node
# Node.jsプロセスを停止
pkill -f "node app.js"
ポート使用プロセスを特定する(Windows)
コマンドプロンプト:netstat
netstat -ano | findstr :3000
出力例:
TCP 0.0.0.0:3000 0.0.0.0:0 LISTENING 12345
TCP [::]:3000 [::]:0 LISTENING 12345
最後の 12345 がPIDです。
PowerShell:Get-NetTCPConnection(推奨)
# ポート使用プロセス確認
Get-NetTCPConnection -LocalPort 3000 |
Select-Object LocalAddress, LocalPort, State, OwningProcess
# プロセス詳細も含めて
Get-NetTCPConnection -LocalPort 3000 |
ForEach-Object {
Get-Process -Id $_.OwningProcess
}
出力例:
Handles NPM(K) PM(K) WS(K) CPU(s) Id ProcessName
------- ------ ----- ----- ------ -- -----------
234 15 25432 32456 1.23 12345 node
プロセス名 → ポートの逆引き
# 全Node.jsプロセスの使用ポート
Get-Process node | ForEach-Object {
Get-NetTCPConnection -OwningProcess $_.Id -ErrorAction SilentlyContinue
}
プロセスを停止する方法
Linux/macOSでの停止
# 通常終了(SIGTERM)- アプリに後処理の時間を与える
kill <PID>
# 例
kill 12345
# 強制終了(SIGKILL)- 即座に停止
kill -9 <PID>
# プロセス名で全て停止
killall node
killall -9 node # 強制
# fuserでまとめて
fuser -k 3000/tcp
優先順位
- まずは通常
kill: 後処理(DBコネクションクローズ等)が走る - 応答しなければ
kill -9: 強制終了
kill -9は最終手段。データ破損のリスクがあるため、まずは通常killを試してください。
Windowsでの停止
# 通常終了
taskkill /PID 12345
# 強制終了(/F付き)
taskkill /F /PID 12345
# プロセス名で
taskkill /IM node.exe /F
# 子プロセスも含めて
taskkill /T /F /PID 12345
PowerShellの場合:
# プロセスID指定
Stop-Process -Id 12345 -Force
# プロセス名指定
Stop-Process -Name node -Force
# 特定ポートを使うプロセスを停止(ワンライナー)
Get-NetTCPConnection -LocalPort 3000 |
ForEach-Object { Stop-Process -Id $_.OwningProcess -Force }
1行で完結させるワンライナー集
# Linux: ポート3000を使うプロセスを強制終了
sudo kill -9 $(lsof -t -i:3000)
# Linux: ssで確認 → kill
ss -tlnp | grep :3000 | grep -oP 'pid=\K[0-9]+' | xargs -r kill -9
# Linux: fuser版
sudo fuser -k 3000/tcp
# macOS: lsofから抽出
sudo lsof -ti:3000 | xargs kill -9
アプリケーション・フレームワーク別の対処
Node.js(Express、Fastify、Next.js等)
よくあるエラー
Error: listen EADDRINUSE: address already in use :::3000
at Server.setupListenHandle [as _listen2] (node:net:1855:16)
対処
# 1. ポート使用プロセスを確認
lsof -i :3000
# 2. プロセス停止
kill -9 <PID>
# 3. 再起動
npm run dev
コード側での対処
// Expressで graceful shutdown を実装
const server = app.listen(3000, () => {
console.log('Server started on port 3000');
});
process.on('SIGTERM', () => {
console.log('SIGTERM received, shutting down...');
server.close(() => {
console.log('Server closed');
process.exit(0);
});
});
process.on('SIGINT', () => {
server.close(() => process.exit(0));
});
これでCtrl+Cやプロセス終了時にポートを確実に解放できます。
nodemon使用時のトラブル
# nodemonがゾンビプロセスを残すことがある
ps aux | grep node
pkill -f node
Python(Flask、Django、FastAPI等)
よくあるエラー
OSError: [Errno 98] Address already in use
対処
# Flaskのデフォルトポート5000
lsof -i :5000
kill -9 <PID>
# Django (runserver) のデフォルトポート8000
lsof -i :8000
kill -9 <PID>
# 起動時に別ポート指定して回避
flask run --port 5001
python manage.py runserver 8001
コード側での対処(Flask)
from flask import Flask
import signal
import sys
app = Flask(__name__)
def shutdown(sig, frame):
print('Shutting down...')
sys.exit(0)
signal.signal(signal.SIGINT, shutdown)
signal.signal(signal.SIGTERM, shutdown)
if __name__ == '__main__':
app.run(port=5000)
Gunicorn / uWSGI 経由の場合
# Gunicornプロセスを探す
pgrep -lf gunicorn
# 全Gunicornを停止
pkill -f gunicorn
# 設定ファイルからリロード
kill -HUP <gunicorn_master_pid>
Java(Spring Boot、Tomcat等)
よくあるエラー
java.net.BindException: Address already in use
APR_TCP_NODELAY: Address already in use: bind
対処
# Spring Boot のデフォルトポート8080
lsof -i :8080
kill -9 <PID>
# Tomcatのプロセス確認
ps aux | grep tomcat
ps aux | grep java
application.propertiesで別ポート
# Spring Boot
server.port=8081
または環境変数:
SERVER_PORT=8081 java -jar app.jar
Tomcatの場合
# Tomcatを正しく停止
$CATALINA_HOME/bin/shutdown.sh
# それでもダメな場合
ps aux | grep tomcat
kill -9 <PID>
Ruby(Rails、Puma、Unicorn等)
よくあるエラー
A server is already running. Check /path/to/tmp/pids/server.pid
Errno::EADDRINUSE: Address already in use - bind(2) for "127.0.0.1" port 3000
対処
# server.pid を確認
cat tmp/pids/server.pid
# プロセスがゾンビなら削除
rm tmp/pids/server.pid
# Pumaプロセス特定
ps aux | grep puma
kill -9 <PID>
# 別ポートで起動
rails server -p 3001
PHP(php-fpm、組み込みサーバー)
# php -S 8000 の場合
lsof -i :8000
kill -9 <PID>
# php-fpm 停止
sudo systemctl stop php-fpm
sudo systemctl restart php-fpm
Go
// graceful shutdown例
package main
import (
"context"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
server := &http.Server{Addr: ":8080"}
go func() {
if err := server.ListenAndServe(); err != http.ErrServerClosed {
log.Fatalf("Server failed: %v", err)
}
}()
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
server.Shutdown(ctx)
}
Docker での「port is already allocated」
Dockerコンテナでも頻発するエラーです。
よくあるエラー
docker: Error response from daemon: driver failed programming external connectivity
on endpoint mycontainer: Bind for 0.0.0.0:3000 failed: port is already allocated.
原因と対処
原因1:既存コンテナが同じポートを使用
# 全コンテナの使用ポート確認
docker ps --format "table {{.Names}}\t{{.Ports}}"
# 既存コンテナ停止
docker stop <container_name>
docker rm <container_name>
原因2:停止済みコンテナがまだ削除されていない
# 停止コンテナも含めて表示
docker ps -a
# 停止コンテナ全削除
docker container prune
原因3:ホスト側の別プロセスが使用中
# ホスト側で確認
lsof -i :3000
# Dockerコンテナ以外のプロセスならkill
原因4:別ポートにマッピングする
# 3000の代わりに3001でマッピング
docker run -p 3001:3000 myapp
Docker Composeの場合
services:
app:
ports:
- "3001:3000" # ホストのポートを変更
Docker Desktopの再起動
どうしても解決しない場合の最終手段:
- macOS: Docker Desktop アイコンから「Restart」
- Windows: Docker Desktop再起動
- Linux:
sudo systemctl restart docker
データベースサーバーの対処
MySQL
# MySQLのデフォルトポート3306
lsof -i :3306
# サービス管理
sudo systemctl status mysql
sudo systemctl stop mysql
sudo systemctl start mysql
# プロセス直接停止
sudo killall mysqld
別ポートで起動:
# /etc/mysql/my.cnf
[mysqld]
port = 3307
PostgreSQL
# PostgreSQLのデフォルトポート5432
lsof -i :5432
# サービス管理
sudo systemctl status postgresql
sudo systemctl restart postgresql
# 安全な停止(コマンドライン)
sudo -u postgres pg_ctl stop -D /var/lib/postgresql/data
Redis
# Redisのデフォルトポート6379
lsof -i :6379
# Redisクライアント経由で停止
redis-cli SHUTDOWN
# サービス管理
sudo systemctl stop redis
Oracle
Oracleのリスナーポート競合は本シリーズの[ORA-12541記事]で詳細解説しています。
lsof -i :1521
lsnrctl stop
Webサーバーの対処
Apache
# Apache のポート80・443
lsof -i :80
lsof -i :443
# サービス管理
sudo systemctl status apache2 # Debian系
sudo systemctl status httpd # RHEL系
sudo systemctl stop apache2
sudo systemctl start apache2
# Apache設定で別ポート使用
# /etc/apache2/ports.conf
Listen 8080
Nginx
# Nginx のポート80・443
lsof -i :80
# サービス管理
sudo systemctl status nginx
sudo systemctl reload nginx # 設定変更の反映
sudo systemctl restart nginx
# Nginx設定で別ポート
# /etc/nginx/sites-enabled/default
server {
listen 8080;
}
IIS(Windows)
# IIS停止
iisreset /stop
# 起動
iisreset /start
TIME_WAIT 状態の問題
接続を終了した直後にすぐ再起動すると、TIME_WAIT状態が残ってバインドできないことがあります。
TIME_WAIT の確認
# TIME_WAIT状態の接続一覧
ss -tan | grep TIME_WAIT
# 特定ポート
ss -tan | grep :3000 | grep TIME_WAIT
TIME_WAIT が出るパターン
- アプリ終了直後に再起動
- クライアントから多数の短時間接続
- ロードバランサ越しのアプリ
対処1:SO_REUSEADDR を有効化
アプリ側でSO_REUSEADDRソケットオプションを有効にすると、TIME_WAIT状態のポートも再バインドできます。
Python例
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('0.0.0.0', 3000))
Node.js(標準で対応済み)
Node.jsのnet.Serverは内部的にSO_REUSEADDRを設定しています。
Java
ServerSocket server = new ServerSocket();
server.setReuseAddress(true);
server.bind(new InetSocketAddress(3000));
対処2:TIME_WAIT タイムアウトを短くする(カーネル設定)
⚠️ システム全体に影響するため、慎重に検討してください。
# Linux
sudo sysctl -w net.ipv4.tcp_fin_timeout=30
# 再利用許可
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
恒久化するには /etc/sysctl.conf に追記。
1024未満のポートと権限
1024未満のポート(80, 443等の「well-known port」)を使うにはroot権限が必要です。
よくあるエラー
Error: listen EACCES: permission denied 0.0.0.0:80
対処1:sudo で起動
sudo node app.js
⚠️ アプリをroot権限で動かすのはセキュリティ的に非推奨。
対処2:1024以上のポートを使ってリバースプロキシ経由
[Nginx (port 80)] → [Node.js app (port 3000)]
Nginxが80番をlistenし、内部でNode.jsアプリ(3000番)に転送。
対処3:CAP_NET_BIND_SERVICE 設定
# Node.jsバイナリに低ポートバインド権限を付与
sudo setcap 'cap_net_bind_service=+ep' $(which node)
# これでnodeコマンドが80番ポートをバインド可能になる(root不要)
対処4:authbind / iptables 転送
# iptablesで 80 → 3000 にリダイレクト
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000
再発を防ぐベストプラクティス
1. Graceful shutdown の実装
すべてのサーバーアプリで SIGINT / SIGTERM をキャッチして、ソケットを確実にクローズする処理を実装します。本記事の各言語例を参考に。
2. アプリ起動スクリプトでポートチェック
#!/bin/bash
PORT=3000
if lsof -i :$PORT > /dev/null 2>&1; then
echo "Port $PORT is in use. Killing existing process..."
lsof -ti:$PORT | xargs kill -9
sleep 1
fi
npm start
3. PIDファイル管理
プロセスIDをファイルに記録し、再起動時に古いプロセスを停止する仕組み。
# 起動時
node app.js & echo $! > /tmp/app.pid
# 停止時
kill $(cat /tmp/app.pid)
rm /tmp/app.pid
4. systemd サービス化
systemd経由でアプリを管理すれば、確実な起動・停止・再起動ができます。
# /etc/systemd/system/myapp.service
[Unit]
Description=My App
After=network.target
[Service]
ExecStart=/usr/bin/node /path/to/app.js
Restart=always
User=appuser
[Install]
WantedBy=multi-user.target
sudo systemctl enable myapp
sudo systemctl start myapp
sudo systemctl restart myapp
5. ポート割り当て規約
チーム開発でポート衝突を防ぐ:
| ポート | 用途 |
|---|---|
| 3000 | フロントエンド開発サーバー |
| 4000 | GraphQL API |
| 5000 | バックエンドAPI |
| 8000 | Django等 |
| 9000 | 別の開発サーバー |
事前にポート割り当てを決めておくと、開発時の衝突を減らせます。
6. Docker Composeでの分離
開発環境はDocker Composeで隔離し、ホストOSのポートと分離します。
services:
app:
ports:
- "127.0.0.1:3000:3000" # ローカル限定
トラブルシューティング・チェックリスト
エラーが出た時に順番にチェック:
- エラーメッセージからポート番号を特定
lsof -i :ポート番号でプロセス確認- そのプロセスは自分のアプリか別アプリか判断
- 不要なら
kill -9 PIDで停止 - アプリを再起動して動作確認
- 再発するなら graceful shutdown 実装
- TIME_WAIT 関連なら
SO_REUSEADDR検討 - どうしても解決しない場合は別ポートで起動
- Docker環境なら
docker psでコンテナ確認 - OS再起動は最終手段
よくある質問(FAQ)
Q1. プロセスを停止しても再起動するとまた同じエラーが出ます
考えられる原因:
- デーモンとして起動している(systemd等が自動再起動)
- PM2やforeverなどのプロセスマネージャが管理中
- Docker Composeで
restart: always設定 - launchd(macOS)が管理中
それぞれの管理ツール経由で正しく停止する必要があります:
# PM2
pm2 stop all
pm2 delete all
# Docker Compose
docker-compose down
# systemd
sudo systemctl stop myapp
Q2. lsofコマンドが見つかりません
# Ubuntu/Debian
sudo apt install lsof
# CentOS/RHEL
sudo yum install lsof
# Alpine
apk add lsof
または ss や netstat で代替できます。
Q3. Windowsで netstat -ano が分かりにくいです
PowerShellのGet-NetTCPConnectionの方が出力が見やすく、PowerShellパイプラインと連携できます:
Get-NetTCPConnection -LocalPort 3000 | Format-Table
Q4. kill -9 とkillの違いは?
kill <PID>: SIGTERMを送信。プロセスは終了処理(DBクローズ等)を実行してから停止kill -9 <PID>: SIGKILLを送信。プロセスを即座に強制停止(クリーンアップなし)
まず通常 kill を試して、応答しない場合のみ -9 を使うのが正しい順序です。
Q5. Macで lsof を使うと「Operation not permitted」が出ます
System Integrity Protection(SIP)が影響している可能性。sudo lsof で再試行してください:
sudo lsof -i :3000
Q6. dockerコンテナ内からホストの開発サーバーに接続できません
ホストのIPアドレス指定が必要:
# Linux
curl http://172.17.0.1:3000
# Mac/Windows Docker Desktop
curl http://host.docker.internal:3000
Q7. CI/CDパイプラインでポート競合が起きます
並列実行のテスト環境でよくあります:
- テストごとにランダムポートを使う設計に変更
- Dockerコンテナ単位で実行環境分離
- Pythonの場合
pytest-xdistで分離 - JavaScriptの場合
jestのrandomizeオプション
Q8. systemd経由で起動したサービスのプロセスを正しく停止するには?
# サービスとして停止
sudo systemctl stop myapp
# 強制停止(kill経由)は非推奨
# sudo kill -9 <PID> # ← これだとsystemdが自動再起動する
サービスを完全に停止するには:
sudo systemctl stop myapp
sudo systemctl disable myapp
Q9. ポートを自由に予約・解放できる仕組みはありますか?
OSのソケットライブラリレベルでは、バインド中だけポートを占有する仕組みです。プロセスを終了すると即座に解放されます(TIME_WAIT除く)。アプリ側でグレースフル・シャットダウンを実装すれば、確実な解放が可能です。
Q10. ポート番号は何番までなら自由に使えますか?
- 0〜1023: Well-known port。標準サービス(HTTPの80等)。root権限必要
- 1024〜49151: Registered port。アプリケーション用に登録されている
- 49152〜65535: Dynamic/Private port。自由利用OK
開発時は 3000、4000、5000、8000、8080 などの空き番号を使うのが慣例です。
Q11. WSL2でWindows側のポートと競合します
WSL2はネットワーク的にホストWindowsと統合されているため、両方で同じポートを使えません。回避策:
# WSL2のIPアドレスを取得
wsl hostname -I
# Windowsから直接WSL2にアクセスする場合は特殊ポートマッピングが必要
# (Windows 11 22H2以降は mirrored モードで改善)
Q12. ifconfig や netstat が「コマンドが見つかりません」になります
Ubuntu 22.04以降、net-toolsがデフォルト未インストール:
sudo apt install net-tools
または、後継ツール ip、ss、lsof を使う方が推奨です。
参考リンク・関連資料
Linux/Mac関連ドキュメント
- lsof(8) manページ – lsofコマンド公式
- ss(8) manページ – ssコマンド公式
- kill(1) manページ – killコマンド公式
- fuser(1) manページ – fuserコマンド公式
Windows関連
- Microsoft Learn – Get-NetTCPConnection – PowerShell公式
- Microsoft Learn – netstat – netstat公式
- Microsoft Learn – taskkill – taskkill公式
ネットワーク基礎
- RFC 793 – Transmission Control Protocol – TCP仕様
- IANA Port Numbers – 公式ポート番号一覧
Docker
- Docker Networking – Dockerネットワーク
- Docker Compose port mapping – Docker Composeネットワーク
プログラム言語別
- Node.js net Documentation – Node.js TCPサーバ
- Python socket Documentation – Pythonソケット
- Java ServerSocket – Java ServerSocket
関連記事(本サイト)
- [UbuntuでIPアドレスを確認する全方法] – ネットワーク確認の網羅
- [wget と curl の違いを徹底比較] – HTTP通信ツール
- [Ubuntuでアンインストールする全方法] – パッケージ管理
- [ORA-12541: TNS no listener エラー対処] – Oracleリスナーポート競合
まとめ
「Address already in use」エラーは開発で最も頻繁に遭遇するトラブルのひとつですが、手順を確立しておけば1分で解決できます。要点を再整理します。
- 3ステップで解決: プロセス特定 → 停止 → 再起動
- ポート確認の基本コマンド:
lsof -i :ポート/ss -tlnp/netstat -ano - プロセス停止: まず
kill、応答しなければkill -9 - Docker特有:
docker ps、コンテナ停止 or ホストポート変更 - TIME_WAIT問題:
SO_REUSEADDRで回避 - 1024未満ポート: 権限注意、リバースプロキシ推奨
- 再発防止: Graceful shutdown、PIDファイル、systemd管理
これらの知識は、Web開発・API開発・サーバー運用・Dockerを使うあらゆる場面で必須です。本記事をブックマークしておけば、ポート競合に遭遇した時の対応が即座に可能になります。
本記事は2026年6月時点の情報をもとに、Ubuntu 22.04/24.04、macOS Sonoma/Sequoia、Windows 11、Docker 24.x での動作確認に基づき作成しています。OS・バージョンによってコマンドオプションが異なる場合があるため、ご利用の環境に応じてご確認ください。
-
前の記事
【完全版】MySQL「ERROR 1045 (28000): Access denied」の原因と対処法 2026.06.17
-
次の記事
git pushが重くて動かないときの対処法 | コマンドで解決しました 2026.06.17
コメントを書く