Masayan tech blog.

  1. ブログ記事一覧>
  2. 【OS別】ポート使用中エラーの解決法|address already in use を確実に解消する手順

【OS別】ポート使用中エラーの解決法|address already in use を確実に解消する手順

公開日
最終更新日

概要

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コンテナが残っている

docker-compose down を忘れた

別のアプリケーションがポートを使用

Skype が80番ポートを使用

ゾンビプロセスが残っている

異常終了したプロセスが残存

【Windows】ポート使用中を確認してkillする手順

Windowsでは netstat コマンドと taskkill コマンドを使用してポートを解放する。

手順1: コマンドプロンプトを管理者モードで起動

  1. スタートメニューで「cmd」と検索
  2. コマンドプロンプトを右クリック
  3. 「管理者として実行」を選択

重要: 管理者権限がないとプロセスを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コマンドのオプション詳細

オプション

意味

-a

すべての接続とリスニングポートを表示

-o

各接続に関連するプロセスIDを表示

-n

アドレスとポート番号を数値形式で表示

【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は 45324533 である。

手順3: PIDを指定してプロセスをkill

確認したPIDを使用してプロセスを終了させる。

kill -9 <PID>

実行例:

kill -9 4532

複数のPIDがある場合は、スペース区切りで指定できる。

kill -9 4532 4533

lsofコマンドのオプション詳細

オプション

意味

-i

ネットワーク接続を表示

-i:<ポート>

特定のポートを使用しているプロセスのみ表示

-t

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: 以下の原因が考えられる。

  1. 権限不足: 管理者権限(sudo)で実行する
    sudo lsof -i:80  # Mac/Linux
    
  2. IPv6を使用している: -i6 オプションを追加
    lsof -i6:80
    
  3. 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 は強制終了のため、以下のリスクがある。

  • データが保存されずに終了する可能性
  • 一時ファイルが残る可能性

推奨手順:

  1. まず kill <PID>(通常終了)を試す
  2. それでも終了しない場合に 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や複数のアプリケーションを使用する開発環境では、ポート重複は頻繁に発生する。本記事の手順をブックマークしておくことで、エラー発生時に素早く対処できるだろう。