できない.dev

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

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

公開: 更新:

実行例あり(2026-09-17 に実環境で検証)

要約

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

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

よくある原因

  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 に置き換える。

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