目次
概要
Dockerコンテナやローカルサーバーを起動しようとした際に、「address already in use」というエラーが表示されて起動できない経験はないだろうか。これはポート番号が他のプロセスによって既に使用されているために発生するエラーである。
本記事では、Windows・Mac・Linux環境別に、ポート使用中エラーを確実に解消する手順を解説する。
対象読者
Docker利用者、Web開発者、ローカル開発環境を構築するエンジニア 動作確認環境: Windows 10/11、macOS、Linux(Ubuntu/CentOS)
ポート使用中エラーとは
エラーメッセージの例
Dockerコンテナやローカルサーバーを起動する際、以下のようなエラーが表示されることがある。
ERROR: for コンテナ名 Cannot start service:
Ports are not available: listen tcp 0.0.0.0:80: bind: address already in use
このエラーは、既に他のプロセスが同じポート番号を使用しているために発生する。
エラーが発生する主な原因
原因 | 具体例 |
|---|---|
以前起動したサーバーが停止していない | Apache、Nginx が起動中 |
Dockerコンテナが残っている |
|
別のアプリケーションがポートを使用 | Skype が80番ポートを使用 |
ゾンビプロセスが残っている | 異常終了したプロセスが残存 |
【Windows】ポート使用中を確認してkillする手順
Windowsでは netstat コマンドと taskkill コマンドを使用してポートを解放する。
手順1: コマンドプロンプトを管理者モードで起動
- スタートメニューで「cmd」と検索
- コマンドプロンプトを右クリック
- 「管理者として実行」を選択
重要: 管理者権限がないとプロセスをkillできないため、必ず管理者モードで実行すること。
手順2: 対象ポートのPIDを確認
以下のコマンドで、指定したポート番号を使用しているプロセスのPID(プロセスID)を確認する。
netstat -aon | find ":<ポート番号>"
実行例(80番ポートの場合):
netstat -aon | find ":80"
出力例:
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4532
TCP [::]:80 [::]:0 LISTENING 4532
最後の数字 4532 がPIDである。
手順3: PIDを指定してプロセスをkill
確認したPIDを使用してプロセスを終了させる。
taskkill /pid <PID> /f
実行例:
taskkill /pid 4532 /f
出力例:
成功: PID 4532 のプロセスは強制終了されました。
/f オプションは強制終了を意味する。プロセスが応答しない場合でも確実に終了できる。
netstatコマンドのオプション詳細
オプション | 意味 |
|---|---|
| すべての接続とリスニングポートを表示 |
| 各接続に関連するプロセスIDを表示 |
| アドレスとポート番号を数値形式で表示 |
【Mac / Linux】ポート使用中を確認してkillする手順
Mac・Linuxでは lsof コマンドと kill コマンドを使用する。
手順1: ターミナルを起動
Macの場合:
- Spotlight検索(⌘ + Space)で「ターミナル」と入力
- またはアプリケーション → ユーティリティ → ターミナル
Linuxの場合:
- Ctrl + Alt + T でターミナルを起動
手順2: 対象ポートを使用しているプロセスを確認
lsof(List Open Files)コマンドで、指定したポートを使用しているプロセスを確認する。
lsof -i:<ポート番号>
実行例(80番ポートの場合):
lsof -i:80
出力例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 4532 masayan 6u IPv4 12345 0t0 TCP *:http (LISTEN)
nginx 4533 masayan 6u IPv4 12345 0t0 TCP *:http (LISTEN)
この場合、PIDは 4532 と 4533 である。
手順3: PIDを指定してプロセスをkill
確認したPIDを使用してプロセスを終了させる。
kill -9 <PID>
実行例:
kill -9 4532
複数のPIDがある場合は、スペース区切りで指定できる。
kill -9 4532 4533
lsofコマンドのオプション詳細
オプション | 意味 |
|---|---|
| ネットワーク接続を表示 |
| 特定のポートを使用しているプロセスのみ表示 |
| PIDのみ表示(killと組み合わせて使う) |
ワンライナーで一括kill
PIDを確認してからkillする手順を1行で実行することもできる。
kill -9 $(lsof -t -i:<ポート番号>)
実行例:
kill -9 $(lsof -t -i:80)
lsof -t はPIDのみを出力するオプションで、$() で囲むことでその結果を kill コマンドに渡している。
よくある質問(FAQ)
Q1: 「address already in use」エラーが出るが、lsof / netstat で何も表示されない
A: 以下の原因が考えられる。
- 権限不足: 管理者権限(sudo)で実行する
sudo lsof -i:80 # Mac/Linux - IPv6を使用している:
-i6オプションを追加lsof -i6:80 - Dockerコンテナが使用中: 起動中のコンテナを確認
docker ps docker-compose down
Q2: killしてもすぐに同じプロセスが復活する
A: 以下の可能性がある。
- 自動起動設定: systemd や launchd で自動起動が設定されている
- 親プロセスが再起動: 親プロセスが子プロセスを自動的に再起動している
対処法:
# systemdの場合(Linux)
sudo systemctl stop nginx
sudo systemctl disable nginx
# launchdの場合(Mac)
sudo launchctl unload /Library/LaunchDaemons/com.example.plist
Q3: どのポート番号を使用しているか分からない
A: エラーメッセージからポート番号を確認する。または、すべての待機ポートを一覧表示する。
Windows:
netstat -ano | findstr LISTENING
Mac/Linux:
lsof -i -P | grep LISTEN
Q4: 特定のプログラム名からポートを確認したい
A: プログラム名を指定して検索する。
Windows:
netstat -ano | findstr "nginx"
Mac/Linux:
lsof -i -P | grep nginx
Q5: kill -9 は危険だと聞いたが大丈夫か?
A: kill -9 は強制終了のため、以下のリスクがある。
- データが保存されずに終了する可能性
- 一時ファイルが残る可能性
推奨手順:
- まず
kill <PID>(通常終了)を試す - それでも終了しない場合に
kill -9 <PID>を使用
# 1. 通常終了を試す
kill 4532
# 2. 5秒待っても終了しない場合、強制終了
kill -9 4532
トラブルシューティング
ケース1: 「アクセスが拒否されました」というエラー
症状:
ERROR: Access is denied.
原因: 管理者権限がない
解決策:
- Windows: コマンドプロンプトを「管理者として実行」
- Mac/Linux:
sudoを付けて実行sudo kill -9 4532
ケース2: Dockerコンテナを停止したのにポートが解放されない
原因: コンテナは停止しているが削除されていない、またはネットワークが残っている
解決策:
# すべてのコンテナを停止・削除
docker-compose down
# 不要なネットワークも削除
docker network prune
# すべてを一括削除(注意: 全コンテナが削除される)
docker system prune -a
ケース3: ポートを変更して回避したい
解決策: アプリケーションの設定またはdocker-compose.ymlでポート番号を変更する。
docker-compose.yml の例:
services:
web:
ports:
- "8080:80" # ホストの8080番を使用(80番の代わり)
これで、ブラウザから http://localhost:8080 でアクセスできる。
まとめ
本記事では、「address already in use」エラーを解決するために、Windows・Mac・Linux環境別にポート使用中のプロセスを確認してkillする手順を解説した。
重要なポイント:
- Windows:
netstat -aonでPID確認 →taskkill /pid <PID> /fでkill - Mac/Linux:
lsof -i:<port>でPID確認 →kill -9 <PID>でkill - 管理者権限で実行することが重要
kill -9の前に通常のkillを試すことを推奨
Dockerや複数のアプリケーションを使用する開発環境では、ポート重複は頻繁に発生する。本記事の手順をブックマークしておくことで、エラー発生時に素早く対処できるだろう。