# 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」エラーの解決方法。
# 解決方法の選択
ポート使用プロセスを停止する(推奨)
- ポート 80 を使用しているプロセスを確認
- 不要なプロセスを停止または削除
Docker コンテナのポートを変更する
- ポート 80 が他のアプリケーションで必要な場合
- ホストの別のポート(例:8080)にマッピング
# よくある原因
- Apache がポート 80 を使用している
- Nginx がポート 80 を使用している
- 他の Docker コンテナがポート 80 を使用している
# 確認コマンド
# ポート80を使用しているプロセスを確認
sudo lsof -i :80
# または
sudo netstat -tulpn | grep :80
# すべてのポート使用状況を確認
sudo netstat -tulpn