できない.dev

Docker で「Bind for 0.0.0.0:8080 failed: port is already allocated」が解消できない

docker run の -p で指定したホストポートを、既存のコンテナや別プロセスが使っているのが原因。
使用中のポートを特定して止めるか、別のホストポートに割り当て直す。

公開: 更新:

実行例あり(2026-08-30 に実環境で検証)

要約

Bind for 0.0.0.0:8080 failed: port is already allocated は、-p ホスト:コンテナ で指定したホスト側ポートが、すでに誰かに使われているときに出ます。

OS は同じポートを二重に貸し出せないため、Docker が公開に失敗しています。

対処は「使っている相手を止める」か「別のポートを使う」の二択です。

実行例

同じホストポートを二重に公開しようとすると docker run は終了コード 125 で止まり、エラー文が Bind for 0.0.0.0:18080 failed: port is already allocated とポート番号まで名指しする。docker ps --filter publish= で先に握っているコンテナを特定し、ホスト側だけ 18081 にずらして起動し直すと、同じイメージが二つ別ポートで並ぶ。

$ docker run -d --name port-a -p 18080:80 alpine:3 sleep 60
2f2c8b5f20c9b951f388804650d0ad04d77a5c1c03aed90cc526454f39f924e2
run の終了コード: 0
$ docker run -d --name port-b -p 18080:80 alpine:3 sleep 60
13ec828e8b156881b250bdc311d84e391b59547520a5756dee68eaf59ed5719e
docker: Error response from daemon: failed to set up container networking: driver failed programming external connectivity on endpoint port-b (8089184cb8c450acc5a9583d8af473d36b36884dffa2eb2fb2593c2710c3ce41): Bind for 0.0.0.0:18080 failed: port is already allocated
 
Run 'docker run --help' for more information
run の終了コード: 125
$ docker ps --filter publish=18080
CONTAINER ID   IMAGE      COMMAND      CREATED         STATUS        PORTS                                       NAMES
2f2c8b5f20c9   alpine:3   "sleep 60"   2 seconds ago   Up 1 second   0.0.0.0:18080->80/tcp, [::]:18080->80/tcp   port-a
$ docker run -d --name port-b -p 18081:80 alpine:3 sleep 60
96b144bc188652f9d414528cc1110379c732f1b98c772f55ed92f894f94699dd
run の終了コード: 0(0 なら解消)
$ docker ps --filter name=port-
CONTAINER ID   IMAGE      COMMAND      CREATED         STATUS                  PORTS                                       NAMES
96b144bc1886   alpine:3   "sleep 60"   1 second ago    Up Less than a second   0.0.0.0:18081->80/tcp, [::]:18081->80/tcp   port-b
2f2c8b5f20c9   alpine:3   "sleep 60"   4 seconds ago   Up 3 seconds            0.0.0.0:18080->80/tcp, [::]:18080->80/tcp   port-a

— 2026-08-30 時点の出力

検証環境

検証日
実行環境
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. 同じホストポートを公開する別のコンテナが起動中。
  2. 前回のコンテナが止まりきらずポートを保持している。
  3. Docker 以外のプロセス(ローカルの開発サーバ等)が同じポートを使っている。

解決策

1. 公開中のコンテナを止める

まずはポートを握っているコンテナを探します。

docker ps                 # PORTS 列で 8080 を公開中のものを確認
docker stop <container_id>

2. ホストのプロセスを特定する

コンテナでなければ、ホスト側のプロセスを調べます。

lsof -i :8080             # Windows は: netstat -ano | findstr :8080

該当プロセスを終了すればポートが空きます。

3. 別のポートに割り当てる

相手を止められないときは、ホスト側のポートをずらします。

docker run -p 8081:8080 myimage

左がホスト、右がコンテナです。
ブラウザからは http://localhost:8081 で開きます。

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