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」と表示される。
結論:まずこれを確認
docker ps -aで同じポートを使うコンテナが残っていないか確認lsof -i :ポート番号でポートを使用しているプロセスを特定- 不要なら停止、必要なら別ポートを使用
トラブルシューティングフロー
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)。
関連するエラー・症状
解決しない場合
- Docker公式ドキュメント - ネットワーク
- 確認すべきログ:
docker logs コンテナ名、journalctl -u docker(Linux) - 次に調べるキーワード: 「docker network inspect」「docker daemon restart」「iptables docker」