UbuntuでDocker起動時にポート競合した時の解決方法

UbuntuでDocker起動時にポート競合した時の解決方法

Dockerコンテナを起動した際に「port is already allocated」や「bind: address already in use」などのエラーが発生する場合、ホスト側で同じポートが既に使用されています。特にWebサーバー、データベース、他のDockerコンテナとの競合が原因になることが多くあります。ここではUbuntu環境でDockerのポート競合を確認・解消する方法を詳しく解説します。

ポート競合時によく表示されるエラー

Docker起動時に以下のようなメッセージが表示されます。

docker: Error response from daemon:
driver failed programming external connectivity.

Bind for 0.0.0.0:80 failed:
port is already allocated

または

Error starting userland proxy:
listen tcp4 0.0.0.0:8080:
bind: address already in use

これは指定したポートを別のプロセスが既に利用している状態です。

どのポートが競合しているか確認する

まずDocker起動時のエラーメッセージから対象ポートを確認します。

例えば以下の場合。

-p 8080:80

ホスト側の8080番ポートが競合しています。

現在利用中のポートを確認します。

sudo ss -tulpn | grep 8080

または

sudo lsof -i :8080

実行例。

tcp LISTEN 0 128 0.0.0.0:8080
users:(("nginx",pid=1234))

この場合はnginxが8080番を使用しています。

競合プロセスを特定する

PIDを確認します。

sudo lsof -i :8080

出力例。

COMMAND PID USER
nginx   1234 root

詳細確認。

ps -fp 1234

実行中サービスを特定できます。

不要なサービスを停止する

競合しているサービスが不要であれば停止します。

Nginxの場合。

sudo systemctl stop nginx

Apacheの場合。

sudo systemctl stop apache2

MySQLの場合。

sudo systemctl stop mysql

停止後に再確認。

sudo ss -tulpn | grep 8080

表示されなければポートが解放されています。

Dockerコンテナ同士の競合を確認する

別のコンテナが同じポートを使用している場合があります。

稼働中コンテナ確認。

docker ps

出力例。

0.0.0.0:8080->80/tcp

8080番ポートを既に利用しています。

停止する場合。

docker stop コンテナ名

削除する場合。

docker rm コンテナ名

使用ポートを変更する

最も簡単な解決方法です。

例えば8080番が使用中の場合。

変更前。

docker run -d -p 8080:80 nginx

変更後。

docker run -d -p 8081:80 nginx

ブラウザアクセス先も変更します。

http://サーバーIP:8081

docker-compose利用時の修正方法

docker-compose.ymlで指定しているポートを変更します。

変更前。

services:
web:
ports:
- "8080:80"

変更後。

services:
web:
ports:
- "8081:80"

反映。

docker compose down
docker compose up -d

全ポート利用状況を確認する

現在のリッスンポートを一覧表示します。

sudo ss -tulpn

または

sudo netstat -tulpn

よく競合するポート。

・80(HTTP)
・443(HTTPS)
・3306(MySQL)
・5432(PostgreSQL)
・6379(Redis)
・8080(Webアプリ)
・9200(Elasticsearch)

Docker導入前に確認しておくとトラブルを防げます。

Dockerが占有しているポートを確認する

Docker全体のポート利用状況。

docker ps --format "table {{.Names}}\t{{.Ports}}"

出力例。

NAMES       PORTS
nginx-app   0.0.0.0:8080->80/tcp
mysql-db    0.0.0.0:3306->3306/tcp

どのコンテナがどのポートを使っているか一目で確認できます。

不要なDockerコンテナを削除する

停止済みコンテナを整理します。

docker container prune

未使用ネットワークも削除。

docker network prune

全体クリーンアップ。

docker system prune

不要なリソースが原因のトラブルを防げます。

Dockerサービスを再起動する

ポート解放後も正常に起動しない場合はDockerサービスを再起動します。

sudo systemctl restart docker

状態確認。

sudo systemctl status docker

active (running)になっていれば正常です。

本番環境で注意すべきポイント

本番サーバーでは80番や443番をNginxやApacheが利用していることが一般的です。

そのため以下の構成が推奨されます。

・Nginx → 80/443
・Dockerアプリ → 8080、3000、5000など
・リバースプロキシ経由で公開

例。

docker run -d -p 3000:3000 myapp

Nginxから3000番へ転送することでポート競合を回避できます。

まとめ

Dockerのポート競合エラーは、同じホストポートを別のプロセスやコンテナが利用していることが原因です。

確認手順は以下の順番が効率的です。

・エラーメッセージから競合ポートを確認
・ssやlsofで使用中プロセスを調査
・docker psで他コンテナを確認
・不要サービスを停止
・ポート番号を変更
・Dockerサービスを再起動

特に「sudo ss -tulpn」と「docker ps」を確認すると、多くのポート競合問題を短時間で解決できます。