「port is already allocated」エラーとは?
Dockerでコンテナを起動しようとした際に、以下のようなエラーが表示されることがあります。
$ docker run -p 8080:80 nginx
docker: Error response from daemon: driver failed programming external connectivity on endpoint determined_morse
(xxxxxxxxxx): Bind for 0.0.0.0:8080 failed: port is already allocated.
これはホスト側のポート8080がすでに使われているために、新しいコンテナにそのポートを割り当てられないというエラーです。「ポートが被る」「ポート競合」とも呼ばれる、Docker初心者がよく遭遇するトラブルの1つです。
この記事では、エラーの原因を特定する方法と、ケース別の解決手順をわかりやすく解説します。
ポートマッピング(-p オプション)の基本を確認したい方は、先にポートマッピング(-p)の解説記事を読んでおくとスムーズです。
port is already allocated が出る3つの原因
このエラーが出るのは、ホスト側のポートがすでに占有されているときです。主な原因は以下の3つです。
原因1: 既存のDockerコンテナがポートを占有している
最も多いケースです。以前起動したコンテナがそのまま残っていて、同じポートを使っている場合に発生します。停止し忘れたコンテナや、バックグラウンドで動いているコンテナが原因であることがほとんどです。
docker run -d でバックグラウンド起動したコンテナは、ターミナルを閉じても動き続ける点に注意してください。
原因2: Docker以外のホスト側プロセスがポートを使用している
Apache、Nginx、Node.jsなど、Dockerとは無関係のアプリケーションがホスト上で同じポートを使っていることがあります。特にポート80や8080、3000、5432などのよく使われるポートで発生しがちです。
原因3: Docker Desktop再起動後のポート残存
WindowsやMacでDocker Desktopを使っている場合、Docker Desktopの再起動やクラッシュ後にポートが正しく解放されないことがあります。コンテナは停止しているのにポートだけが「ポートが使われている」状態のままになるケースです。
ポート競合の原因を特定する方法【OS別】
Step 1: Dockerコンテナを確認する(共通)
まず、同じポートを使っているDockerコンテナが存在しないか確認しましょう。
# 起動中のコンテナを確認
$ docker ps
CONTAINER ID IMAGE COMMAND PORTS NAMES
a1b2c3d4e5f6 nginx "/docker-entrypoint.…" 0.0.0.0:8080->80/tcp web-old
PORTS 列に 0.0.0.0:8080->80/tcp と表示されていれば、そのコンテナがポート8080を使っています。
停止中のコンテナも含めて確認する場合は -a オプションを付けます。
$ docker ps -a
Dockerの主要コマンドについてはDocker主要コマンドまとめも参考にしてください。
Step 2: ホスト側のポート使用状況を確認する
Dockerコンテナが原因でない場合、ホスト上の別プロセスがポートを占有している可能性があります。OSごとに確認コマンドが異なります。
Linux の場合
# ssコマンドでポート8080を使っているプロセスを確認
$ ss -tlnp | grep 8080
LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* users:(("nginx",pid=1234,fd=6))
# lsofコマンドでも確認可能
$ sudo lsof -i :8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1234 root 6u IPv4 12345 0t0 TCP *:8080 (LISTEN)
Mac の場合
# lsofコマンドで確認
$ lsof -i :8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 5678 user 23u IPv4 0x1234 0t0 TCP *:8080 (LISTEN)
Windows の場合
コマンドプロンプトまたはPowerShellで確認します。
# netstatでポート8080を使っているプロセスを確認
> netstat -ano | findstr :8080
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 5678
# PIDからプロセス名を特定
> tasklist | findstr 5678
node.exe 5678 Console 1 50,000 K
💡 補足 PowerShellでは Get-NetTCPConnection -LocalPort 8080 でも確認できます。
port is already allocated の解決手順【ケース別】
ケース1: 既存のDockerコンテナを停止・削除する
原因がDockerコンテナの場合は、該当コンテナを停止して削除します。
# コンテナを停止
$ docker stop a1b2c3d4e5f6
# コンテナを削除
$ docker rm a1b2c3d4e5f6
停止と削除を一度に行いたい場合は、以下のように -f(強制)オプションを使います。
$ docker rm -f a1b2c3d4e5f6
⚠️ 注意 docker rm -f はコンテナを強制的に削除します。実行中のコンテナに対して使うと、保存されていないデータが失われる可能性があります。
ケース2: ホスト側のプロセスを停止する
Docker以外のプロセスがポートを使っている場合は、そのプロセスを停止します。
# Linux/Mac: PIDを指定してプロセスを終了
$ sudo kill 1234
# Windows: PIDを指定してプロセスを終了
> taskkill /PID 5678 /F
プロセスを停止できない・停止したくない場合は、Dockerコンテナ側のポートを変更して回避することもできます。
# ポートを8081に変更して起動
$ docker run -p 8081:80 nginx
ケース3: Docker Desktop の再起動で解消する
コンテナもホスト側プロセスも見つからないのにエラーが出る場合は、Docker自体にポート情報が残存している可能性があります。
# 全コンテナを停止
$ docker stop $(docker ps -q)
# Docker Desktopを再起動(GUIからRestart)
LinuxでDocker Engineを使っている場合は、以下のコマンドで再起動できます。
$ sudo systemctl restart docker
「port is already allocated」を未然に防ぐ方法
–rm オプションで自動削除する
テストや開発で一時的にコンテナを使う場合は、--rm オプションを付けて起動しましょう。コンテナ停止時に自動で削除されるため、ポートの占有が残りません。
$ docker run --rm -p 8080:80 nginx
Docker Compose でコンテナを管理する
複数のコンテナを使う場合は、Docker Composeで管理すると、docker compose down でまとめて停止・削除できるため、ポート競合のリスクを減らせます。
# compose.yml の例
services:
web:
image: nginx
ports:
- "8080:80"
# 起動
$ docker compose up -d
# 停止・削除(ポートも解放される)
$ docker compose down
使っていないコンテナを定期的に整理する
停止済みのコンテナが溜まっていくと、思わぬポート競合の原因になることがあります。定期的に不要なコンテナを削除しましょう。
# 停止中のコンテナを一括削除
$ docker container prune
💡 補足 docker container prune は停止中のコンテナのみ削除します。起動中のコンテナには影響しません。
まとめ
- 「port is already allocated」は、ホスト側のポートがすでに使われているときに発生するエラー
- 原因は主に「既存コンテナの占有」「ホスト側プロセスの占有」「Docker再起動後の残存」の3つ
docker psで既存コンテナを、ss/lsof/netstatでホスト側プロセスを確認して原因を特定する- 不要なコンテナの停止・削除、またはポート番号の変更で解決できる
--rmオプションや Docker Compose を活用して、ポート競合を未然に防ぐ


コメント