MeWrite Docs

Bind for 0.0.0.0:PORT failed: port is already allocated

Dockerコンテナのポートが既に使用されている場合に発生するエラー

概要

Bind for 0.0.0.0:PORT failed: port is already allocated は、Dockerコンテナを起動する際に、指定したポートが既に他のプロセスやコンテナで使用されている場合に発生するエラーです。

エラーメッセージ

Error response from daemon: driver failed programming external connectivity on endpoint container_name: Bind for 0.0.0.0:3000 failed: port is already allocated
Error starting userland proxy: listen tcp4 0.0.0.0:80: bind: address already in use

原因

  1. 他のコンテナが使用中: 同じポートで別のコンテナが起動している
  2. ホストのプロセスが使用中: ホストOSのサービスがポートを使用
  3. コンテナが停止していない: 前回のコンテナが残っている
  4. Docker Compose の重複: 複数のプロジェクトが同じポートを使用

解決策

1. ポートを使用しているプロセスを特定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Linux/macOS
# ポートを使用しているプロセスを確認
lsof -i :3000
netstat -tlnp | grep 3000
ss -tlnp | grep 3000

# macOS
lsof -nP -iTCP:3000 | grep LISTEN

# Windows
netstat -ano | findstr :3000

2. 既存のコンテナを停止・削除

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 実行中のコンテナを確認
docker ps

# 停止しているコンテナも含めて確認
docker ps -a

# 特定のコンテナを停止
docker stop container_name

# コンテナを削除
docker rm container_name

# 停止と削除を同時に
docker rm -f container_name

# すべての停止中コンテナを削除
docker container prune

3. Docker Compose でコンテナを停止

1
2
3
4
5
6
7
8
# docker-compose で起動したコンテナを停止
docker-compose down

# ボリュームも削除
docker-compose down -v

# 特定のサービスを停止
docker-compose stop service_name

4. 別のポートを使用

1
2
3
4
5
# コマンドラインで別のポートを指定
docker run -p 3001:3000 my-app

# ホストのポートを変更(コンテナ内は3000のまま)
docker run -p 8080:3000 my-app
1
2
3
4
5
6
# docker-compose.yml
services:
  web:
    image: my-app
    ports:
      - "3001:3000"  # ホスト:コンテナ

5. ホストのサービスを停止

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 例: Apache がポート80を使用している場合
sudo systemctl stop apache2
sudo systemctl stop nginx

# macOS の場合
sudo lsof -i :80
# PID を確認して kill
sudo kill -9 PID

# プロセスを確認してから停止
ps aux | grep process_name
kill process_id

6. 動的ポート割り当て

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# ランダムな空きポートを使用
docker run -P my-app

# 割り当てられたポートを確認
docker port container_name

# docker-compose で空きポートを使用
# docker-compose.yml
services:
  web:
    image: my-app
    ports:
      - "3000"  # ホストポートを指定しない

7. ポート範囲の指定

1
2
3
4
5
6
# docker-compose.yml
services:
  web:
    image: my-app
    ports:
      - "3000-3005:3000"  # 3000-3005のいずれかを使用

8. Docker ネットワークの確認

1
2
3
4
5
6
7
8
# Docker ネットワーク一覧
docker network ls

# ネットワークの詳細(使用中のIPとポート)
docker network inspect bridge

# 特定のネットワークに接続されているコンテナ
docker network inspect my_network

9. WSL2/Docker Desktop の問題

1
2
3
4
5
6
7
8
# WSL2 で Windows のポートと競合する場合
# Windows 側のプロセスを確認
netstat -ano | findstr :3000

# Hyper-V の予約ポートを確認
netsh interface ipv4 show excludedportrange protocol=tcp

# 予約ポートを避けて使用

Docker Compose での対処

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# docker-compose.yml
version: '3.8'

services:
  web:
    image: nginx
    ports:
      - "8080:80"  # 80ではなく8080を使用
    # または環境変数で指定
    # ports:
    #   - "${HOST_PORT:-8080}:80"

  db:
    image: postgres
    ports:
      - "5433:5432"  # デフォルトの5432を避ける
1
2
# 環境変数でポートを指定
HOST_PORT=3001 docker-compose up

全コンテナをクリーンアップ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# すべてのコンテナを停止
docker stop $(docker ps -aq)

# すべてのコンテナを削除
docker rm $(docker ps -aq)

# 使用していないリソースを削除
docker system prune

# ボリュームも含めて削除(注意: データが消える)
docker system prune -a --volumes

デバッグのコツ

コンテナのポート確認

1
2
3
4
5
6
7
8
# コンテナのポートマッピング
docker port container_name

# コンテナの詳細情報
docker inspect container_name | grep -A 20 "NetworkSettings"

# 実行中のコンテナとポート
docker ps --format "table {{.Names}}\t{{.Ports}}"

接続テスト

1
2
3
4
5
6
7
8
# ポートが応答するか確認
curl http://localhost:3000

# ポートスキャン
nc -zv localhost 3000

# Telnet
telnet localhost 3000

Docker の他のエラー

最終更新: 2025-12-08