できない.dev

docker compose up が「port is already allocated」で起動できない

コンテナの公開ポートがホスト側で別プロセスに使われていると bind に失敗する。
占有プロセスを止めるか、compose.yaml の ports を別ポートに変える。

#compose#port#network#bind

公開:

要約

Bind for 0.0.0.0:8080 failed: port is already allocatedホスト側のポートが他プロセスで使用中 という意味。
占有プロセスを特定して止めるか、compose.yamlports を別の番号に振り替える。

よくある原因

  1. 別コンテナが同ポートを bind: 古い docker run のコンテナが残っている
  2. compose の残骸: 前回 Ctrl+C で異常終了し、docker compose down を打っていない
  3. ホスト側のネイティブサービス: mysqld / postgresql 等が systemd で起動済み
  4. ports 表記ミス: "80" だけ書いてホスト側の指定が抜けている

解決策

1. 占有プロセスの特定

# Linux / macOS
sudo lsof -i :8080
# Windows (PowerShell)
netstat -ano | Select-String ":8080"

PID を特定し、不要なら kill <PID> または GUI から停止。

2. 残骸コンテナの掃除

docker compose down
docker ps -a
docker rm -f <container>

docker compose down は services / networks をまとめて削除する。

3. ホストポートを変える

services:
  web:
    image: nginx
    ports:
      - "8081:80"   # ホスト 8081 → コンテナ 80

開発端末では空いているポートに振り替えるのが最も早い。

4. 内部通信のみにする

services:
  db:
    image: postgres
    expose:
      - "5432"      # 同 compose 内のサービスだけアクセス可

ホストから直接叩く必要が無いサービスは ports を消し expose に置き換える。

この記事は役立ちましたか?