Vagrant 網絡設置
基本用法
如何配置
Vagrant 的網絡配置是通過在 Vagrantfile
中調用 config.vm.network
方法來實現的,例如:
# 2 是版本號的意思
Vagrant.configure("2") do |config|
# 配置網絡端口轉發,配置生效后,可從宿主機8080端口訪問
config.vm.network "forwarded_port", guest: 80, host: 8080
end
上面可理解為:調用 config.vm 對象的 network 方法,方法的參數有三個:
- 字符串 "forwarded_port"
- 命名參數 guest,值為80
- 命名參數 host,值為8080
若干知識點
- 可以通過多次調用
config.vm.network
來聲明多種網絡定義 - 檔調用命令
vagrant up
或vagrant reload
的時候網絡會自動啟用 - 可通過
config.vm.hostname
屬性設置主機名
三種網絡配置方式
端口轉發 forwarded_port
Vagrant.configure("2") do |config|
config.vm.network "forwarded_port", guest: 80, host: 8080
end
關於端口沖突的問題
如果出現端口沖突,可以過設置 auto_correct: true
來自動修正,修正的信息會打印在 vagrant up
或 vagrant reload
的輸出中。
Vagrant.configure("2") do |config|
config.vm.network "forwarded_port", guest: 80, host: 8080, auto_correct: true
end
除此之外,還可設置一個可用的端口范圍,讓Vagrant在遇到端口沖突時從你指定的范圍去應用一個端口:
Vagrant.configure("2") do |config|
config.vm.network "forwarded_port", guest: 80, host: 8080, auto_correct: true
config.vm.usable_port_range = 8000..8999
end
私人網絡 private_network
私人網絡就是NAT的方式,只有宿主機能通過虛擬機的ip訪問到虛擬機,但是(除了宿主機之外的)其他主機是無法訪問到虛擬機的。
下面是配置虛擬機網絡連接方式為 private_network
,虛擬機通過DHCP方式自動獲取ip,從vagrant up
的信息可以看出其實就是NAT
,hostonly
也可以理解到是只有宿主機能訪問虛擬機:
# 查看 Vagrantfile 配置
$ cat Vagrantfile
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu:18.04"
# :private_network 可以寫成 "private_network"
config.vm.network :private_network, type: "dhcp"
end
# 啟動虛擬機
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat(這里)
default: Adapter 2: hostonly(還有這里)
# ssh 連接到虛擬機
$ vagrant ssh
# 查看虛擬機 ip
$ ifconfig
# ......
enp0s8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.28.128.3 netmask 255.255.255.0 broadcast 172.28.128.255
inet6 fe80::a00:27ff:fedc:2366 prefixlen 64 scopeid 0x20<link>
# ......
# 可以從宿主機上ping過去試試,能ping通表示配置沒問題
也可以設置靜態的ip:
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu:18.04"
# type: "static" 可以不寫
config.vm.network :private_network, type: "static", ip: "192.168.55.2"
end
但是必須注意:
設置靜態ip時候注意不要設置成 .1
,如:192.168.1.1
、192.168.55.1
、192.168.77.1
,因為 .1
通常預留來做路由的,vagrant up
或 vagrant reload
時候也會有相應的提示信息:
$ vagrant reload
==> default: You assigned a static IP ending in ".1" to this machine.
==> default: This is very often used by the router and can cause the
==> default: network to not work properly. If the network doesn't work
==> default: properly, try changing this IP.
如何從虛擬機ping宿主機?
參考:Vagrant ping or curl from guest to host machine
-
如果虛擬機設置的是靜態 ip,如
192.168.55.2
,那么可以通過預留的192.168.55.1
來 ping 通宿主機 -
可以在虛擬機中執行
ip route show
查看路由信息得知:vagrant@ubuntu-bionic:~$ ip route show default via 10.0.2.2 dev enp0s3 proto dhcp src 10.0.2.15 metric 100 10.0.2.0/24 dev enp0s3 proto kernel scope link src 10.0.2.15 10.0.2.2 dev enp0s3 proto dhcp scope link src 10.0.2.15 metric 100 192.168.55.0/24 dev enp0s8 proto kernel scope link src 192.168.55.2 vagrant@ubuntu-bionic:~$ ping 10.0.2.2 PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data. 64 bytes from 10.0.2.2: icmp_seq=1 ttl=64 time=0.176 ms 64 bytes from 10.0.2.2: icmp_seq=2 ttl=64 time=0.274 ms
-
可以直接 ping 宿主機的 ip(我自己機器能行,但其它機器上沒測試過)
公共網絡 public_network
# 配置公共網絡
$ cat Vagrantfile
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu:18.04"
config.vm.network "public_network", ip: "192.168.55.2"
end
# 啟動虛擬機
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ubuntu:18.04'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: network_default_1614743427484_66744
==> default: Clearing any previously set network interfaces...
==> default: Available bridged network interfaces:
1) eno1
2) wlp4s0
3) docker0
4) br-ed585c0c0346
5) vethbf396bd
6) veth7ce7b74
7) vpn_a
==> default: When choosing an interface, it is usually the one that is
==> default: being used to connect to the internet.
==> default:
default: Which interface should the network bridge to? 1
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
default: Adapter 2: bridged
# ssh 進入虛擬機
$ vagrant ssh
# 在虛擬機中查ip
vagrant@ubuntu-bionic:~$ ifconfig
enp0s8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.55.2 netmask 255.255.255.0 broadcast 192.168.55.255
inet6 fe80::a00:27ff:fe6e:193b prefixlen 64 scopeid 0x20<link>
ether 08:00:27:6e:19:3b txqueuelen 1000 (Ethernet)
RX packets 38686 bytes 2384911 (2.3 MB)
RX errors 0 dropped 35952 overruns 0 frame 0
TX packets 15 bytes 1146 (1.1 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0