# Docker ポートエラー「address already in use」の解決方法

Docker Compose で開発している際、コンテナ起動時にalready in useエラーが発生し、web コンテナが起動できませんでした。

# エラー内容

Error response from daemon: driver failed programming external connectivity on endpoint web-1 (cceb24cf2e7caecc53649d51f5d74888baffdb5241592c6f1d356cb13ddb80bf): Error starting userland proxy: listen tcp4 0.0.0.0:80: bind: address already in use

このエラーは、ポート 80 が既に使用されているために発生します。

# 解決方法 1:ポート使用プロセスの確認と停止

# ステップ 1:ポート 80 を使用しているプロセスを確認

まず、ポート 80 を使用しているプロセスを特定します。

sudo lsof -i :80

または、netstatコマンドでも確認できます。

sudo netstat -tulpn | grep :80

# ステップ 2:プロセスの停止

ポート 80 を使用しているプロセスを停止します。

sudo kill -9 <PID>

注意

kill -9は強制終了のコマンドです。プロセスが正常に終了しない場合に使用しますが、注意して使用してください。まずはkill <PID>を試してから、必要に応じてkill -9を使用してください。

# ステップ 3:Docker コンテナの再起動

ポート 80 を解放した後、Docker コンテナを再起動します。

docker-compose restart
# または
docker restart <コンテナ名>

# 例:Apache がポート 80 を使用している場合

確認結果の例:

$ sudo lsof -i :80
COMMAND PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
apache2 294     root    4u  IPv6  23972      0t0  TCP *:http (LISTEN)
apache2 304 www-data    4u  IPv6  23972      0t0  TCP *:http (LISTEN)
apache2 305 www-data    4u  IPv6  23972      0t0  TCP *:http (LISTEN)
apache2 306 www-data    4u  IPv6  23972      0t0  TCP *:http (LISTEN)
apache2 307 www-data    4u  IPv6  23972      0t0  TCP *:http (LISTEN)
apache2 308 www-data    4u  IPv6  23972      0t0  TCP *:http (LISTEN)

Apache がポート 80 を使用していることが分かります。

# Apache を停止する方法

Apache サービスを停止します。

sudo systemctl stop apache2
# または
sudo service apache2 stop

# Apache を完全に削除する方法(不要な場合)

Apache が不要な場合は、完全に削除することもできます。

# Apacheサービスを停止
sudo systemctl stop apache2

# Apacheパッケージをアンインストール
sudo apt-get purge apache2 apache2-utils apache2.2-bin apache2-common -y

# 依存関係のクリーンアップ
sudo apt-get autoremove -y

# 設定ファイルの削除(オプション)
sudo rm -rf /etc/apache2

注意

この操作は、システム上の Apache 関連の設定やデータをすべて削除します。Apache を今後も使用する可能性がある場合は、削除せずに停止するだけにしてください。

# 解決方法 2:Docker コンテナのポートを変更

Apache Web サーバーがポート 80 を使用している場合、Docker コンテナのポートを変更して別のポートにバインドすることもできます。

# docker run コマンドの場合

docker run -p 8080:80 <イメージ名>

これにより、コンテナのポート 80 がホストのポート 8080 にマッピングされます。

# docker-compose.yml の場合

docker-compose.ymlファイルを編集します。

version: "3"
services:
  web:
    image: <イメージ名>
    ports:
      - "8080:80" # ホスト:コンテナ

ポートマッピングの形式

"ホストポート:コンテナポート"の形式で指定します。

  • 8080:80 → ホストの 8080 ポートがコンテナの 80 ポートにマッピング
  • 3000:3000 → ホストの 3000 ポートがコンテナの 3000 ポートにマッピング

# 実装時の注意点

Docker コンテナ起動時の「address already in use」エラーの解決方法。

# 解決方法の選択

  1. ポート使用プロセスを停止する(推奨)

    • ポート 80 を使用しているプロセスを確認
    • 不要なプロセスを停止または削除
  2. Docker コンテナのポートを変更する

    • ポート 80 が他のアプリケーションで必要な場合
    • ホストの別のポート(例:8080)にマッピング

# よくある原因

  • Apache がポート 80 を使用している
  • Nginx がポート 80 を使用している
  • 他の Docker コンテナがポート 80 を使用している

# 確認コマンド

# ポート80を使用しているプロセスを確認
sudo lsof -i :80
# または
sudo netstat -tulpn | grep :80

# すべてのポート使用状況を確認
sudo netstat -tulpn

関連情報: Docker 公式ドキュメント - ポートバインディング (opens new window)

同じタグを持つ記事をピックアップしました。