docker compose upを実行したところ「Bind for 0.0.0.0:3000 failed: port is already allocated」というエラーが出た。この状況の説明として正しいものはどれか。
解説
このエラーは、ホストマシンのポート3000がすでに他のプロセスに占有されており、Dockerが同じポートをバインド(紐づけ)できないことを意味します。ファイアウォールによるブロックではなく「ポートの競合」が原因であり、コンテナ内部の起動失敗やDockerのポート上限とも無関係です。ファイアウォールが原因の場合は connection refused や timeout 系のエラーになり、コンテナ内部の問題であればアプリケーション固有のエラーログが出ます。ポートバインドの仕組みとホスト側・コンテナ側の区別docker compose.yml で ports: ["3000:3000"] と書いた場合、左側がホスト側ポート、右側がコンテナ側ポートです。Dockerはホスト側のポートを OS のネットワークスタックに対して確保(bind)しようとするため、すでにそのポートを使っているプロセスがあると競合します。つまりエラーが起きるのはコンテナ内部ではなくホスト側のネットワーク層です。競合の原因を特定して解消する手順まず、何がポートを使っているかを調べます。# Linux / macOS lsof -i :3000 # Windows (PowerShell) Get-NetTCPConnection -LocalPort 3000よくある原因は次のとおりです。停止し忘れた別のコンテナ — docker ps で確認し、不要なら docker stop で停止するホスト上で直接動いている Node.js や Rails などの開発サーバー — プロセスを終了するか、Compose 側のホストポートを "3001:3000" のように変更する前回の docker compose up が中途半端に残っている — docker compose down を実行してからやり直す実務で意識しておきたいこと開発チームで複数のサービスを同時に立ち上げる場合、ポート番号の衝突は頻繁に起きます。対策として、サービスごとにホスト側ポートをずらす運用ルールを決めたり、.env ファイルでポート番号を変数化して各メンバーが自由に変えられるようにするのが一般的です。また、ホスト側ポートを省略して "3000" とだけ書くと Docker がランダムな空きポートを割り当てるため、競合自体を回避できます。ただしその場合は docker compose port <service> 3000 で実際のポートを確認する必要があります。