docker compose up が「port is already allocated」で起動できない
コンテナの公開ポートがホスト側で別プロセスに使われていると bind に失敗する。
占有プロセスを止めるか、compose.yaml の ports を別ポートに変える。
公開: 更新:
要約
Bind for 0.0.0.0:8080 failed: port is already allocated は ホスト側のポートが他プロセスで使用中 という意味。
占有プロセスを特定して止めるか、compose.yaml の ports を別の番号に振り替える。
実行例
ホストの 34567 番を別コンテナに先に公開させた状態で docker compose up -d を実行すると、ネットワークとコンテナの作成までは進んだうえで起動時に Bind for 0.0.0.0:34567 failed: port is already allocated で失敗し、終了コード 1 になった。docker ps --filter publish=34567 で占有しているコンテナ名を確かめ、ports のホスト側を 34568 に変えると同じコマンドが終了コード 0 で通り、docker compose down でコンテナとネットワークがまとめて片付いている。
$ docker compose up -d
Network compose-port-demo_default Creating
Network compose-port-demo_default Created
Container compose-port-demo-web-1 Creating
Container compose-port-demo-web-1 Created
Container compose-port-demo-web-1 Starting
Error response from daemon: failed to set up container networking: driver failed programming external connectivity on endpoint compose-port-demo-web-1 (7f4c6f32e366b967948625f3db3fc2ffb5fd02627a71c5b35a023fc98ad243eb): Bind for 0.0.0.0:34567 failed: port is already allocated
$ echo $?
1$ docker ps --filter publish=34567 --format "{{.Names}}\t{{.Ports}}"
port-demo-blocker 0.0.0.0:34567->80/tcp, [::]:34567->80/tcp$ cat compose.yml
services:
web:
image: alpine:3
command: ["sleep", "120"]
ports:
- "34568:80"$ docker compose up -d
Container compose-port-demo-web-1 Recreate
Container compose-port-demo-web-1 Recreated
Container compose-port-demo-web-1 Starting
Container compose-port-demo-web-1 Started
$ echo $?
0$ docker compose ps --format "{{.Service}}\t{{.Ports}}"
web 0.0.0.0:34568->80/tcp, [::]:34568->80/tcp$ docker compose down
Container compose-port-demo-web-1 Stopping
Container compose-port-demo-web-1 Stopped
Container compose-port-demo-web-1 Removing
Container compose-port-demo-web-1 Removed
Network compose-port-demo_default Removing
Network compose-port-demo_default Removed— 2026-09-17 時点の出力
検証環境
- 検証日
- 実行環境
local host (Windows 11 Home, Docker 29.1.3)- バージョン
- Node.js 22.14.0
- npm 10.9.2
- Git 2.48.1.windows.1
- Docker 29.1.3
この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。
よくある原因
- 別コンテナが同ポートを bind: 古い
docker runのコンテナが残っている - compose の残骸: 前回
Ctrl+Cで異常終了し、docker compose downを打っていない - ホスト側のネイティブサービス:
mysqld/postgresql等が systemd で起動済み - 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 に置き換える。