Vagrant
VirtualBox

Vagrantが自動設定したポートフォワードを一覧表示するプラグイン「vagrant-fwdports」

More than 5 years have passed since last update.


目的

Macなどでvagrant sshしているとあまり気にしないかもしれませんが、

Vagrantで複数のVMを起動していたりすると、自動設定しているポートフォワードって

ゲストの何番がホストの何番になってるんだっけ?ということがあります。

そんなちょっとした不便を解決するため、「vagrant-fwdport」というVagrantのプラグインを作りました。

vagrant-fwdportsをインストールすると、vagrant fwdportsというコマンドを実行することで、

現在のVagrant VMがどのようなポートフォワード設定になっているかをコンソールに表示します。

なお、このプラグインはProviderがVirtualBoxのVMにのみ対応しています。

ちなみに、私が検証した環境はVagrant 1.4.1、VirtualBOX 4.3.6です。


インストール


2014/1/16追記

Rubygems.orgにpushしたので、現在はvagrant plugin install vagrant-fwdportsでインストール可能ですが、以下のソースから導入する方法も残しておきます。


READMEにも書いてありますが、

つたない英語なので日本語で書き直します。

まず、GitHubからクローンします。

git clone https://github.com/ariarijp/vagrant-fwdports.git

クローンが終わったら、vagrant-fwdportsディレクトリに移動します。

cd vagrant-fwdports

次に、Gemをビルドします。

rake build

最後に、vagrant-fwdportsをインストールします。

[version]はビルドされたgemファイルにあわせて修正してください。

vagrant plugin install ./pkg/vagrant-fwdports-[version].gem


使い方

VMを起動した状態で、Vagrantfileがあるディレクトリーに移動し、以下のコマンドを実行します。

vagrant fwdports

単一のVMであれば以下のように表示されます。

+--------------------------------------+--------------+---------------------+------------+-----------+

| machine.id | machine.name | forwarded_port_name | guest_port | host_port |
+--------------------------------------+--------------+---------------------+------------+-----------+
| 7f4b1865-c6e9-45e7-8044-2c6a080440ee | default | ssh | 22 | 2222 |
+--------------------------------------+--------------+---------------------+------------+-----------+

マルチVMであれば以下のように表示されます。

+--------------------------------------+--------------+---------------------+------------+-----------+

| machine.id | machine.name | forwarded_port_name | guest_port | host_port |
+--------------------------------------+--------------+---------------------+------------+-----------+
| aa0d0f4c-80bd-44f3-80f4-b2a6febecc8f | web | ssh | 22 | 2222 |
| c2ea05d3-f9ba-4b60-b8f9-6829b0c88123 | db | ssh | 22 | 2200 |
+--------------------------------------+--------------+---------------------+------------+-----------+

単一のVMで以下のような設定をVagrantfileに書いた場合の出力例です。


Vagrantfile

config.vm.network :forwarded_port, guest: 80, host: 8080

config.vm.network :forwarded_port, guest: 3306, host: 13306
config.vm.network :forwarded_port, guest: 5678, host: 15678
config.vm.network :forwarded_port, guest: 3000, host: 13000

+--------------------------------------+--------------+---------------------+------------+-----------+

| machine.id | machine.name | forwarded_port_name | guest_port | host_port |
+--------------------------------------+--------------+---------------------+------------+-----------+
| 7f4b1865-c6e9-45e7-8044-2c6a080440ee | default | ssh | 22 | 2222 |
| 7f4b1865-c6e9-45e7-8044-2c6a080440ee | default | tcp13000 | 3000 | 13000 |
| 7f4b1865-c6e9-45e7-8044-2c6a080440ee | default | tcp13306 | 3306 | 13306 |
| 7f4b1865-c6e9-45e7-8044-2c6a080440ee | default | tcp15678 | 5678 | 15678 |
| 7f4b1865-c6e9-45e7-8044-2c6a080440ee | default | tcp8080 | 80 | 8080 |
+--------------------------------------+--------------+---------------------+------------+-----------+

極端な例ですが、Web3台、DB2台で8080ポート、3306ポートが衝突してしまうような設定の場合はこのようになります。


Vagrantfile

config.vm.define "web01" do |web|

web.vm.box = "base"
web.vm.network :forwarded_port, guest: 80, host: 8080, auto_correct: true
end

config.vm.define "web02" do |web|
web.vm.box = "base"
web.vm.network :forwarded_port, guest: 80, host: 8080, auto_correct: true
end

config.vm.define "web03" do |web|
web.vm.box = "base"
web.vm.network :forwarded_port, guest: 80, host: 8080, auto_correct: true
end

config.vm.define "db01" do |db|
db.vm.box = "base"
db.vm.network :forwarded_port, guest: 3306, host: 3306, auto_correct: true
end

config.vm.define "db02" do |db|
db.vm.box = "base"
db.vm.network :forwarded_port, guest: 3306, host: 3306, auto_correct: true
end


+--------------------------------------+--------------+---------------------+------------+-----------+

| machine.id | machine.name | forwarded_port_name | guest_port | host_port |
+--------------------------------------+--------------+---------------------+------------+-----------+
| fb40528e-ebef-4361-bce9-0b430a8b346b | web01 | ssh | 22 | 2222 |
| fb40528e-ebef-4361-bce9-0b430a8b346b | web01 | tcp8080 | 80 | 8080 |
| 70cfa478-9590-4f8e-a1f5-128299ec0e99 | web02 | ssh | 22 | 2200 |
| 70cfa478-9590-4f8e-a1f5-128299ec0e99 | web02 | tcp8080 | 80 | 2201 |
| 2af2a3b8-8a44-4571-9ecd-e7a92d3f1b43 | web03 | ssh | 22 | 2202 |
| 2af2a3b8-8a44-4571-9ecd-e7a92d3f1b43 | web03 | tcp8080 | 80 | 2203 |
| f973f02f-1b7d-4e8d-8e46-9ef5691a0e6a | db01 | ssh | 22 | 2204 |
| f973f02f-1b7d-4e8d-8e46-9ef5691a0e6a | db01 | tcp3306 | 3306 | 3306 |
| efc6599d-8320-4e80-8650-76607ec9460c | db02 | ssh | 22 | 2205 |
| efc6599d-8320-4e80-8650-76607ec9460c | db02 | tcp3306 | 3306 | 2206 |
+--------------------------------------+--------------+---------------------+------------+-----------+


まとめ

なるべくポートが衝突しないようにホスト側のポート番号を割り振っても、8080番などは奪い合いになることが多くなります。

衝突したポートを自動で振り替えてくれるのは好きなVagrantの機能のひとつなので、こんなツールと一緒にうまく付き合えるといいと思ってます。