はじめに
環境構築の過程で下記コマンドを実行したときに発生したエラーについて、同じことが起こった場合、わたわたしないためにも記事に残しておこうと思います。
環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3
1:入力コマンドとログ
docker compose run --rm web gem install rails
👇以下ログ
[+] Running 0/1
⠹ Container hogehoge_app-db-1 Starting 0.2s
Error response from daemon: driver failed programming external connectivity on endpoint hogehoge_app-db-1 (a1bc2877a2b5722de9e46717b1e2cce05ccb2679f6abf470bac3cebb3cce3744): Bind for 0.0.0.0:5432 failed: port is already allocated
2:エラー内容は?
hogehoge_app-db-1コンテナが使用しようとしているポート 5432 がすでに他のプロセスやコンテナによって使用されているため、起動に失敗しているそうです。5432 はPostgreSQLデータベースのデフォルトポートで、他のPostgreSQLインスタンスや他のアプリケーションがこのポートを使っている可能性があるそうです。
・・・データベースごとに、デフォルトのポートというものが存在していることすら知らなかったです👇以下画像参照
3:解決策
3-1:現在ポート5432を使用しているプロセスを確認・停止する
他のPostgreSQLや関連プロセスがポート 5432 を使用している場合、これを確認し、必要に応じて停止する
# ポートを使用しているプロセスを確認
sudo lsof -i :5432
上記コマンドはポート 5432 を使用しているプロセスを表示します。
出力に対して確認した後、そのプロセスを停止します。
プロセスIDは、lsofコマンドの結果から取得できます。
# プロセスを停止
sudo kill -9 <プロセスID>
3-2:Dockerコンテナの設定を変更して別のポートを使用する
PostgreSQLがすでに 5432 を使用している場合、別のポートに変更するのも一つの方法としてあげられます。docker-compose.ymlで5432以外のポートを指定します。
services:
db:
image: postgres
ports:
- "5433:5432" # 5433に変更
これで、ホスト側のポート 5433 を使用し、コンテナ内のPostgreSQLは引き続き 5432 を使用します。
3-3:既存のDockerコンテナを停止・削除する
もし他のDockerコンテナがポート 5432 を使用している場合、そのコンテナを停止または削除することもできるそうです。
docker ps # 実行中のコンテナを確認
docker stop <コンテナID> # 該当するコンテナを停止
docker rm <コンテナID> # 必要に応じて削除
さいごにまとめ
私は解決方法3-3を実行しました。
最近はコマンドを実行するごとにログをちゃんと?確認できるようになったことが過去の私と比べ成長したなと感じています。
まだまだ読み解く力は微々たるものですが継続学習頑張ります。
今回の記事が何か参考になれば幸いです。
