【Docker】port is already allocated エラーの原因特定と解決法をOS別に解説

Dockerエラー対処

「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 を活用して、ポート競合を未然に防ぐ

Dockerの基礎を動画で体系的に学びませんか?

実務で使う基礎だけを3時間に凝縮。環境構築から丁寧に解説しています。

Udemy Docker入門講座 クーポン割引で講座を見る →

コメント

タイトルとURLをコピーしました