Vagrant之所以受到開發者和DevOps工程師的歡迎,是因為他們可以在本地系統上繼續使用現有的開發工具(如編輯器、瀏覽器、調試器等)。例如,開發人員可以將客機上的文件同步到本地系統,使用他們最喜歡的編輯器來編輯這些文件,最后再同步回客機上。同樣,如果他們在虛擬機上創建了一個Web應用程序,他們可以從本地系統的Web瀏覽器訪問和測試該應用程序。在本指南中,我們將看到如何在Vagrant中配置網絡,以提供從本地主機系統訪問客人機的功能。
在Vagrant中配置網絡
Vagrant提供以下三種網絡選擇:
1、端口轉發
2、專用網絡(僅主機網絡)
3、公共網絡(橋接網絡)
1、配置端口轉發
默認情況下,我們可以使用ssh通過ssh訪問Vagrant VM vagrant ssh。當我們通過SSH訪問VM時,Vagrant將端口22從來賓計算機轉發到主機中的開放端口。這稱為端口轉發。Vagrant會自動處理此端口轉發過程,而無需任何用戶干預。您還可以轉發您選擇的特定端口。例如,如果將來賓計算機中的端口80轉發到主機上的端口8080,則可以通過導航到主機上的http://localhost:8080來訪問Web服務器。
可以在“ Vagrantfile”中配置端口轉發。轉到您的Vagrant項目目錄,然后在您喜歡的編輯器中打開Vagrantfile。
找到以下行:
Vagrant.configure("2") do |config|
[...]
# config.vm.network "forwarded_port", guest: 80, host: 8080
end
取消注釋,並定義將哪些端口轉發到哪里。在此示例中,我將來賓中的端口80轉發到主機中的端口8080。
Vagrant.configure("2") do |config|
[...]
config.vm.network "forwarded_port", guest: 80, host: 8080
end

現在,使用更新的Vagrantfile重新啟動Vagrant計算機:
$ vagrant reload --provision
您將在輸出中看到配置了端口轉發:

您也可以銷毀VM,然后使用更新的Vagrantfile重新運行它:
$ vagrant destroy <VM-name>
$ vagrant up
現在,使用以下命令SSH登錄到客戶機:
$ vagrant ssh
在其中安裝Apache Web服務器。如果虛擬機基於Deb,請運行:
$ sudo apt install apache2
如果是基於RHEL的系統,請運行以下命令:
$ sudo yum install httpd
啟動Apache服務:
$ sudo systemctl enable --now httpd
現在,在主機系統中打開Web瀏覽器,然后從瀏覽器導航到http://localhost:8080地址。您將在瀏覽器上看到Apache測試頁。

即使我們在主機系統中使用URLhttp://localhost:8080訪問Web服務器,也不會從本地Web服務器提供該服務器。來賓虛擬機正在提供實際的網站(即Apache測試頁),並且所有實際的網絡數據都將發送給來賓。
1.1、如果另一個應用程序正在使用端口8080,該怎么辦?
在前面的示例中,我們將端口80從來賓轉發到主機中的端口8080。換句話說,發送到端口8080的流量實際上已轉發到客戶機上的端口80。如果其他應用程序當前正在使用端口8080怎么辦?運行多個虛擬機時發生端口沖突。您可能在不知不覺中轉發了已使用的端口。別擔心!Vagrant具有檢測端口沖突的內置支持。如果該端口已被其他應用程序使用,則Vagrant會在輸出中報告該端口,因此您可以釋放該端口或使用其他端口。
Vagrant也足夠智能,可以自動查找和糾正端口沖突。如果發現某個端口與另一個端口沖突,它將通過使用任何其他未使用的端口來自動更正它。
要啟用自動校正,請auto_correct: true在Vagrantfile的端口轉發定義中添加一個附加選項。
Vagrant.configure("2") do |config|
[...]
config.vm.network "forwarded_port", guest: 80, host: 8080, auto_correct: true end
默認情況下,Vagrant將在端口2200和端口2250之間選擇自動校正端口。您還可以通過在Vagrantfile中定義以下行來選擇自己的自定義范圍,如下所示。
config.vm.usable_port_range = (2200..2250)
重新啟動Vagrant機器以使更改生效:
1.2、更改網絡協議
默認情況下,Vagrant使用TCP協議進行端口轉發。但是,如果要轉發UDP數據包,則可以使用UDP協議。要使用UDP端口,請在Vagrantfile中添加以下定義:
config.vm.network "forwarded_port", guest: 80, host: 8080, auto_correct: true protocol: "udp"
重新啟動Vagrant VM,以使更改生效。
2、配置專用網絡
在專用或僅主機網絡中,將在主機系統和主機系統上的VM之間創建網絡連接。專用網絡是使用對主機操作系統可見的虛擬網絡適配器創建的。網絡上的其他系統無法與VM通信。主機系統中允許所有網絡操作。
專用網絡還可以充當DHCP服務器,並具有自己的子網。專用網絡中的每個VM將從該IP空間獲得一個IP地址。因此,我們可以使用主機系統中的IP直接訪問VM。
要使用靜態IP地址在Vagrant中配置專用或僅主機網絡,請打開Vagrantfile,找到以下行並將其取消注釋。
config.vm.network "private_network", ip: "192.168.121.60"
在這里,192.168.121.60是虛擬機的IP地址。用您自己的IP替換它。
重新啟動VM,以使更改生效。
如果要通過DHCP自動設置IP地址,請按如下所示修改專用網絡定義:
config.vm.network "private_network", type: "dhcp"
將為虛擬機分配一個隨機IP地址。為了找到虛擬機的IP,您需要使用vagrant sshcommand SSH進入它,然后使用command找到它的IP地址ip。
3、配置公共網絡
在公共或橋接網絡中,所有VM都將與您的主機位於同一網絡中。每個VM將從DHCP服務器(如果在本地網絡中可用)接收其自己的IP地址。因此,所有VM都將像網絡上的另一個物理系統一樣工作,並且它們可以與網絡中的任何系統進行通信。
要配置公共或橋接網絡,請編輯Vagrantfile,找到以下行並取消注釋:
config.vm.network "public_network"
保存並關閉文件。重新啟動VM以應用更改。VM將自動獲取IP地址。
如果要設置靜態IP,只需修改網絡定義,如下所示:
config.vm.network "public_network", ip: "192.168.121.61"
4、設置主機名
您可以使用config.vm.hostname Vagrantfile中的設置定義主機名 。
在您喜歡的編輯器中編輯Vagrantfile並添加/修改以下行:
config.vm.hostname = "myhost.ostechnix.example"
保存並關閉文件。上面的定義將myhost.ostechnix.example 在/etc/hosts文件中添加行。
重新啟動Vagrant VM,以使更改生效。
驗證主機名是否已更改:
[vagrant@myhost ~]$ hostname -f
myhost.osechnix.example
您也可以直接檢查/etc/hosts文件的內容。
$ cat /etc/hosts
樣本輸出:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.1.1 myhost.osechnix.example myhost
5、啟用多個網絡選項
每個網絡選項都有其自身的優勢和劣勢。由於某些原因,您可能希望將所有網絡選項配置到單個VM。如果是這樣,Vagrant可以啟用多個網絡選項。您所要做的只是在Vagrantfile中一個接一個地定義網絡選項,如下所示:
config.vm.hostname = "myhost.ostechnix.example"
config.vm.network "forwarded_port", guest: 80, host: 8080, auto_correct: true
config.vm.network "private_network", ip: "192.168.121.60"
使用此Vagrantfile創建新的VM時,vagrant將創建具有以下網絡詳細信息的VM:
將主機名設置為myhost.ostechnix.example
配置端口轉發
用靜態IP 192.168.121.60配置一個私有網絡
除了配置多種類型的網絡外,我們還可以定義多種網絡。例如,您可以定義多個具有不同IP地址的僅主機網絡,如下所示。
config.vm.network "private_network", ip: "192.168.121.60"
config.vm.network "private_network", ip: "192.168.121.61"
在此階段,您可能已經從命令行獲得了有關Vagrant網絡類型以及如何在Vagrant中配置網絡的基本概念。還有更多的東西要學習。我建議您查看Vagrant的官方文檔以獲取更多詳細配置。
