title: “Docker「ポートは既に使用中」エラーの対処法” date: 2026-01-14 draft: true categories: [“runbook”] tags: [“runbook”, “docker”, “port”, “bind”, “address already in use”, “コンテナ”, “ネットワーク”] description: “Dockerでport is already allocated、address already in useエラーが出たときの確認手順と対処法。原因の特定からポート解放まで。”

症状

Dockerコンテナ起動時に「port is already allocated」「Bind for 0.0.0.0:xxxx failed: port is already in use」と表示される。

結論:まずこれを確認

  1. docker ps -a で同じポートを使うコンテナが残っていないか確認
  2. lsof -i :ポート番号 でポートを使用しているプロセスを特定
  3. 不要なら停止、必要なら別ポートを使用

トラブルシューティングフロー

    flowchart TD
    A[ポート使用中エラー] --> B{docker ps -a で<br>該当コンテナあり?}
    B -->|Yes| C[docker rm で削除]
    B -->|No| D{lsof -i :ポート で<br>プロセス特定}
    D -->|Docker関連| E[docker stop/rm]
    D -->|他のプロセス| F{そのプロセスは<br>必要?}
    F -->|Yes| G[別ポートで起動]
    F -->|No| H[プロセスを停止]
    C --> I[再度コンテナ起動]
    E --> I
    G --> I
    H --> I
  

よくある原因

  • 停止済みコンテナが残っている - docker stop しても docker rm していないとポート予約が残る場合がある
  • 別のDockerコンテナが同じポートを使用中 - 複数プロジェクトで同じポートを指定している
  • ホストのサービスがポートを使用中 - nginx、Apache、MySQLなどがホストで直接起動している
  • docker-composeの古いコンテナが残存 - プロジェクト名変更後に旧コンテナが残っている
  • 前回のコンテナが正常終了していない - クラッシュや強制終了でゴミが残っている
  • WSL2/Dockerの同期ずれ - Windows環境でDockerとWSL2の状態が不整合

確認手順

ステップ1: エラーメッセージからポート番号を確認する

エラーメッセージに含まれるポート番号をメモする。

    # エラー例
# Bind for 0.0.0.0:3000 failed: port is already allocated
# この場合、ポート番号は 3000
  

🔍 チェックポイント: ポート番号を正確に把握できていればOK

ステップ2: Dockerコンテナを確認する

    # 実行中+停止済みのコンテナを全て表示
docker ps -a

# 特定ポートを使用しているコンテナを絞り込む
docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep ポート番号
  

🔍 チェックポイント: 該当ポートを使用しているコンテナが見つかれば原因特定

ステップ3: 不要なコンテナを削除する

    # コンテナを停止(実行中の場合)
docker stop コンテナ名またはID

# コンテナを削除
docker rm コンテナ名またはID

# 停止済みコンテナを一括削除(注意して使用)
docker container prune
  

🔍 チェックポイント: docker ps -a で該当コンテナが消えていればOK

ステップ4: ホストのプロセスを確認する

Dockerコンテナが原因でない場合、ホストで直接起動しているプロセスを確認する。

    # Linux/macOS
lsof -i :ポート番号

# または
sudo netstat -tlnp | grep ポート番号

# macOSの場合
sudo lsof -i :ポート番号 -P
  

🔍 チェックポイント: PIDとプロセス名が表示されれば原因特定

ステップ5: 原因プロセスを停止する

    # プロセスを停止(PIDは前ステップで確認した値)
kill PID

# 強制終了が必要な場合
kill -9 PID

# サービスとして動いている場合
sudo systemctl stop サービス名
  

🔍 チェックポイント: 再度 lsof -i :ポート番号 でプロセスが消えていればOK

ステップ6: 別ポートで起動する(代替手段)

原因プロセスが必要な場合、Dockerコンテナ側で別ポートを使用する。

    # docker run の場合
docker run -p 3001:3000 イメージ名

# docker-compose.yml の場合
# ports:
#   - "3001:3000"  # ホスト側を変更
  

🔍 チェックポイント: エラーなくコンテナが起動すればOK

🚨 この結果が出たらヤバい

結果 意味 対処
lsof で何も表示されないのにエラー Docker daemonの状態異常 Docker再起動
削除したはずのコンテナが復活 restart policyが always --restart=no で再作成
同じポートで複数プロセス表示 ネットワーク設定異常 システム再起動を検討

NG行動(やってはいけないこと)

  • kill -9 を最初から使う - 正常終了できるプロセスまで強制終了するとデータ破損のリスクがある
  • 原因を調べずに docker system prune -a - 必要なイメージやボリュームまで消える
  • 本番環境で docker container prune - 停止中でも必要なコンテナを消す可能性がある
  • ポート番号を確認せず別のコンテナを停止 - 関係ないサービスを止めてしまう

よくある質問(FAQ)

Q1: docker-compose で複数プロジェクトが同じポートを使いたい場合は?

A: 同時起動は不可。使わないプロジェクトは docker-compose down で停止するか、.env ファイルでポートを変数化して切り替える。

Q2: WSL2環境で lsof が使えない場合は?

A: WSL2内では ss -tlnp | grep ポート番号 を使用する。Windows側のプロセスは PowerShell で netstat -ano | findstr :ポート番号 を実行。

Q3: コンテナを削除してもポートが解放されない場合は?

A: Docker daemonを再起動する。sudo systemctl restart docker(Linux)または Docker Desktop を再起動(macOS/Windows)。

関連するエラー・症状

解決しない場合