概要
Vagrantを起動する際にポート番号が他のアプリケーションが使っているためエラーになることがあります。
結論としては、Vagrantで別のポート番号を割り当てればよいのですが、
日ごろWindowsで開発していて、ポート番号を初めて調べたので備忘録のために手順を残します。
現象
vagrant up時に以下のようなエラーが表示される。
Vagrant cannot forward the specified ports on this VM, since they
would collide with some other application that is already listening
on these ports. The forwarded port to 3333 is already in use
on the host machine.
To fix this, modify your current projects Vagrantfile to use another
port. Example, where ‘1234’ would be replaced by a unique host port:
config.vm.network :forwarded_port, guest: 22, host: 1234
Sometimes, Vagrant will attempt to auto-correct this for you. In this
case, Vagrant was unable to. This is usually because the guest machine
is in a state which doesn’t allow modifying port forwarding.
1. Windowsでportをどのアプリケーションが使用しているか調査。
// Windowsコマンドプロンプトを起動してnetstatコマンドで調査
> netstat -nao
TCP 127.0.0.1:3333 0.0.0.0:0 LISTENING XXX // <-PID
...
2. WindowsタスクマネージャでPID XXXのアプリケーションを調べる。
[タスクマネージャ起動]->[詳細]で調べる
3. Vagrantのポート番号を変更する。
Vagrantfileを開き、以下のような記述があるところを修正すれば良いです。
xxxx.vm.network :forwarded_port, guest: 22, host: 3333, id: "ssh", auto_correct: false
しかし、何番にするのがベストなのか、気になったので調べました。
https://ja.wikipedia.org/wiki/TCPやUDPにおけるポート番号の一覧
49151番までは登録済みポート番号とのことで、一見すると49152番以降だと安全そうですが、
49152番以降はOSのエフェメラルポートとして自動的に割り当てられる可能性があるようです。(OSにもよるのでしょうが。)
そうなると逆にバッティングしそうなので、何か別のポートがいいかもしれません。
3333が既に競合しているというだけなので、2223とかにして様子を見ようかな…。
2017/04/06 追記
auto_correctという機能があるらしく、ポート番号が重複した場合に自動的に別のポートを割り当てるようです。
xxxx.vm.network :forwarded_port, guest: 22, host: 3333, id: "ssh", auto_correct: true
例えばポート番号3333で2つのvagrantを起動すると、以下のように自動的に2200番を割り当てます。
Bringing machine 'xxx' up with 'virtualbox' provider...
==> api: Checking if box 'hogehogehoge' is up to date...
==> api: Fixed port collision for 22 => 3333. Now on port 2200.
==> api: Clearing any previously set network interfaces...
==> api: Preparing network interfaces based on configuration...
api: Adapter 1: nat
api: Adapter 2: hostonly
==> api: Forwarding ports...
api: 22 (guest) => 2200 (host) (adapter 1)
api: 80 (guest) => 8808 (host) (adapter 1)
api: 443 (guest) => 14438 (host) (adapter 1)
api: 8000 (guest) => 18000 (host) (adapter 1)
api: 3306 (guest) => 23306 (host) (adapter 1)
==> api: Running 'pre-boot' VM customizations...
...
まとめ
- Windowsでポート番号調べるときには
netstat -nao
を使う。 - エフェメラルポートというものがある。
ポート番号には絶対に衝突しないという選択肢はなさそう。- auto_correct: trueにすると、ポート番号が衝突した場合に自動的に別のポートを割り当てることができる。
2017/04/06 追記
※指摘を受けて修正しました。フィードバックありがとうございます。