エンジニア初心者がPHP/Laravelを学ぶ 仕事

Docker Compose 起動時のポート競合エラーとその解決方法

エラー概要

Docker Compose を使用してコンテナを起動しようとした際に、以下のエラーが発生した。

PS C:\projects\calendar> docker-compose up -d  
[+] Running 2/3
 ✔ Container phpmyadmin    Created                                                                                                              0.1s 
 ✔ Container calendar_app  Started                                                                                                              0.7s 
 - Container calendar_db   Starting                                                                                                             0.7s 
Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306 -> 0.0.0.0:0: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.

これは、MySQLコンテナが使用しようとしている ポート3306 が既に別のプロセスによって使用されているため発生してる。

ポートの使用状況を確認する

エラーの原因を特定するために、3306ポート の使用状況を確認。

1. netstat コマンドでポートの使用状況を確認

PS C:\projects\calendar> netstat -ano | findstr ":3306"

出力結果:

TCP         0.0.0.0:3306           0.0.0.0:0              LISTENING       16736
TCP         0.0.0.0:33060          0.0.0.0:0              LISTENING       16736
TCP         [::]:3306              [::]:0                 LISTENING       16736
TCP         [::]:33060             [::]:0                 LISTENING       16736

ポート 3306 を PID 16736 のプロセスが使用していることが分かる。

2. tasklist コマンドでプロセスを特定

tasklist /FI "PID eq 16736"

出力結果:

イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
mysqld.exe                   16736 Console                    1      1,752 K

mysqld.exe (MySQL サーバー) が ポート3306 を使用していることが判明。

解決策

タスクマネージャーから mysqld.exe を終了

結果

ポート競合の問題を解決し、docker-compose up -d を実行すると、全てのコンテナが正常に起動。

PS C:\projects\calendar> docker-compose up -d
[+] Running 3/3
 ✔ Container calendar_app  Running                                                                                                              0.0s 
 ✔ Container calendar_db   Started                                                                                                              0.4s 
 ✔ Container phpmyadmin    Started

まとめ

  • ポート競合エラー は、ホストマシンで既に使用されているポートをコンテナが使用しようとすると発生する。
  • netstat -ano | findstr ":3306" で使用中のプロセスを特定する。
  • tasklist /FI "PID eq " でプロセス名を確認する。
  • 必要に応じて docker-compose down** → **docker-compose up -d でコンテナを再起動する。

-エンジニア初心者がPHP/Laravelを学ぶ, 仕事