この記事を書いたきっかけ
現在、完全未経験からWEBエンジニアを目指してRuby on Railsを学習しています。
学習用のWEBアプリを作成時、環境構築でport is already allocatedのようなエラーが出ることがあり、「前も出たな、、」と都度調べて解決していたため、今回は同じような未経験の初学者向けに簡単にまとめていきたいと思います。
環境
DBはPostgreSQL。
Dockerを使用した環境構築をベースとしています。
Docker以外だとコマンドが変わるため注意してください。
port is already allocatedとはどんなエラー?
例えば、
docker compose run --rm web gem install rails
というコマンドでRailsをインストールしようとすると、
Error response from daemon: failed to set up container networking: driver failed programming external connectivity on endpoint tips-db-1 (ddf1ccba20750114bc440a0bca359951f7618a6958d8cf548c500794c1a16bb2): Bind for 0.0.0.0:5432 failed: port is already allocated
こんな感じでエラー文が出てくるとします。
エラーの意味を簡単にまとめると
5432番ポートが既に使用されているよ!
というエラーです。
PostgreSQLはデフォルトで 5432 番ポートを使われるため、5432番というポート番号が競合してしまっている状態です。
PC(ホスト)側の同じポート番号(5432番)を、複数のプロセスが同時に使うことができません。
早い者勝ちで負けた方がエラーになる感覚です。
起きる状況としては、以前作ったwebアプリや、学習用に環境構築したもの、それらのコンテナがdown状態でないと残っていてぶつかってしまうことがほとんどかと思います。
対処法
2パターンほど具体例をあげていきたいと思います!
パターン1:邪魔なプロセスを止める(おすすめ!)
ターミナルで
docker ps
というコマンドを叩き、5432ポートを使っているコンテナを調べます。
この時、対象のCONTAINER IDをコピー
次に、
docker stop (対象のCONTAINER ID)
のコマンドを叩き、5432ポート使用中のコンテナを一時停止させるという流れです。
こうすることで、エラー原因の、5432ポートを使用しているコンテナがなくなります!
ちなみに、docker stop をしたコンテナは、目的のプロジェクトのディレクトリに戻って docker compose up をすれば、無事に起動しますので安心してください!
パターン2:ポート番号をずらす
現在指定しているポート番号を5432以外の数字にするということです。
# compose.yml
services:
db:
# ...略
ports:
- 5433:5432
のように左側(ホスト側)の番号を5433のようにずらしてあげるだけです。
注意点
database.ymlの port: も 5433と統一して修正しましょう。
ただ、Dockerコンテナ外(自分のPC)からDBを見る場合は 5433 ですが、Railsコンテナ内からDBに接続する場合、実は 5432 のままで動くケースが多いです(ネットワーク構成によります)。
こんがらがってしまう可能性があるため、パターン1の方がおすすめです!
まとめ
環境構築でエラーが出ると焦りますが、エラー文を読み解けば解決のヒントが必ず隠れています。
今回の「ポート重複」はDockerを触っていると何度も遭遇する道なので、この記事が誰かの助けになれば幸いです!
