前言:這個系列將使用最前沿的cursor作為輔助編程工具,來快速開發一些基礎的編程項目。目的是為了在真實項目中,幫助初級程序員快速進階,以最快的速度,效率,快速進階到中高階程序員。
本項目將基于谷粒商城項目,并且對谷粒商城項目進行二次重構,使其滿足最新的主流技術棧要求。
上一篇文章介紹了谷粒商城的技術架構,并且分析了它有什么不足。我們這篇文章,學習使用vagrant快速創建虛擬機,部署虛擬機環境。
1、虛擬機軟件virtual box安裝
可以使用vmware或者virtual box等軟件安裝虛擬機。猶豫virtual box較為輕量級,而且開源免費,我們這里選用它。您也可以使用其它軟件。當然,您有多余的linux電腦,那也是很ok的。就不用安裝了。
補充:為何服務器一般要用linux
服務器通常選擇Linux操作系統,主要基于以下幾個原因:
開源性和成本效益:Linux是開源的。
穩定性和可靠性:Linux以其卓越的穩定性著稱,能夠長時間運行而無需重啟,適合需要持續服務的服務器環境。
安全性:Linux的多用戶和多任務設計,以及強大的權限管理機制,使其在安全性方面優于許多其他操作系統。此外,開源社區的積極維護確保了安全漏洞能夠及時被發現和修復。
靈活性和可定制性:Linux允許用戶根據具體需求定制系統,選擇適合的發行版和軟件包,滿足不同的服務器應用場景。
廣泛的社區支持:Linux擁有龐大的開發者和用戶社區,提供豐富的技術支持和資源,幫助解決服務器管理和維護中的各種問題。
請自行直接從官網下載安裝vitual box。https://www.virtualbox.org/
2、Vagrant安裝
一般來說,安裝虛擬機,我們會在網絡上查找需要的安裝鏡像,但是這樣比較麻煩。這里我們使用新技術Vagarant。
Vagrant 是一個開源工具,用于創建和管理虛擬開發環境。它使得開發人員能夠在本地機器上快速搭建虛擬機,模擬不同操作系統和軟件環境,而無需擔心配置問題。通過 Vagrant,開發者可以使用簡單的配置文件來自動化環境的構建,使得開發環境的一致性和可重復性更強。
簡單來說,Vagrant 就像是一個“虛擬機管理器”,幫助你輕松創建、管理和共享虛擬開發環境。
下載地址:https://www.vagrantup.com/
下載后雙擊,傻瓜式安裝。
注意,Vagrant 是沒有圖形界面的,所以安裝完成后也沒有桌面快捷方式。具體使用方法,接下來會詳細說明。
Vagrant 的安裝程序會自動把安裝路徑加入到 PATH 環境變量,所以,這時候可以通過命令行執行 vagrant version 檢查是否安裝成功
3、快速部署虛擬機
接下來,使用vagrant部署一個虛擬機。
vagrant init centos/7
vagrant up
成功后,將看到如下截圖。
打開virtual box,可以看到虛擬機已經啟動了。
注意:命令 vagrant init centos/7 中,使用的centos/7,是vagrant官方提供的鏡像名稱,類似于docker。想要查找很簡單。可以通過官網去找。
https://portal.cloud.hashicorp.com/vagrant/discover
您可能會遇到如下報錯。
C:\usr>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centos/7'...
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.Command: ["import", "\\\\?\\C:\\Users\\半舊\\.vagrant.d\\boxes\\centos-VAGRANTSLASH-7\\2004.01\\virtualbox\\box.ovf", "--vsys", "0", "--vmname", "centos-7-1-1.x86_64_1737351515819_14516", "--vsys", "0", "--unit", "10", "--disk", "C:/Users/���/VirtualBox VMs/centos-7-1-1.x86_64_1737351515819_14516/centos-7-1-1.x86_64.vmdk"]Stderr: 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Interpreting \\?\C:\Users\���\.vagrant.d\boxes\centos-VAGRANTSLASH-7\2004.01\virtualbox\box.ovf...
OK.
0%...
Progress state: VBOX_E_INVALID_OBJECT_STATE
VBoxManage.exe: error: Appliance import failed
VBoxManage.exe: error: Storage for the medium 'C:\Users\???\VirtualBox VMs\centos-7-1-1.x86_64_1737351515819_14516\centos-7-1-1.x86_64.vmdk' is not created
VBoxManage.exe: error: Details: code VBOX_E_INVALID_OBJECT_STATE (0x80bb0007), component ApplianceWrap, interface
VBoxManage.exe: error: Context: "enum RTEXITCODE __cdecl handleImportAppliance(struct HandlerArg *)" at line 1363 of file VBoxManageAppliance.cpp
這個錯誤是因為路徑中包含了非標準字符(如 半舊,即中文字符),而 VirtualBox 或 Vagrant 在處理這些字符時出現了問題。
解決辦法。
步驟 1:更改 Vagrant 的存儲位置
在 C: 盤下創建一個新的目錄,如 C:\VagrantData。
設置 VAGRANT_HOME 環境變量,指向這個新目錄:
setx VAGRANT_HOME "C:\VagrantData"
步驟 2:清理之前下載的 box 文件
既然我們更改了 Vagrant 的存儲路徑,我們需要清理之前下載的 centos/7 box 文件。
刪除原有的 centos/7 box 文件。你可以刪除以下文件夾:
bash
C:\Users\半舊\.vagrant.d\boxes\centos-VAGRANTSLASH-7
步驟 3:更改virtual box全局配置
步驟4:重新執行虛擬機安裝
打開一個新的cmd窗口,重新執行命令。
vagrant init centos/7
vagrant up
接下來我們遠程連接下虛擬機。回顧下我們之前看到的控制臺信息。
發現沒有,原來已經幫我們自動創建了ssh連接相關信息。我們只需要執行如下命令,就完成了遠程連接。
vagrant ssh
牛!!
4、網絡配置
接下來我們需要解決一個問題,就是宿主機與虛擬機端口沖突。比如兩者都有mysql,兩個3306端口就沖突了。
我們可以配置端口轉發,來避免這一問題。
但是,這要是很多軟件沖突,就太麻煩了。
我們可以給虛擬機分配單獨的ip地址,解決這一問題。
改ip有很多辦法,因為我們使用了vagarant,可以直接更改vagrantfile解決。
在宿主機輸入命令,查看虛擬網卡配置。
看到圖中是192.168.56.1,我們將虛擬機的ip地址設置為同一網段就行。
重啟下虛擬機。
vagrant reload
測試下宿主機和虛擬機網絡是否互通。
一切ok。
自此,使用vagrant創建虛擬機的內容就大功告成了。
5、補充:常見網絡連接模式
這里,再補充一點網絡的基礎知識。我們回顧下之前Vagrantfile中看到的內容,發現沒有,網絡有好幾種模式。
先解釋下這個配置文件。
1、端口轉發(Port Forwarding):端口轉發使得主機(host machine)可以訪問虛擬機(guest machine)上特定的端口。其實就是端口映射關系。
示例1:開放端口并允許公共訪問
# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine. In the example below,
# accessing "localhost:8080" will access port 80 on the guest machine.
# NOTE: This will enable public access to the opened port
config.vm.network "forwarded_port", guest: 80, host: 8080
這個配置會將虛擬機(guest)的端口 80 轉發到主機(host)的端口 8080。
在主機的瀏覽器中訪問 localhost:8080 時,將會訪問虛擬機的端口 80。
示例 2:僅允許通過本地回環地址訪問
# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine and only allow access
# via 127.0.0.1 to disable public access
config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
2、公共網絡(Public Network)
# Create a public network, which generally matched to bridged network.
# Bridged networks make the machine appear as another physical device on
# your network.
config.vm.network "public_network"
這個配置使得虛擬機通過橋接網絡連接到物理網絡,虛擬機將像一臺獨立的物理設備一樣出現在同一網絡中。
虛擬機會自動獲取一個與主機網絡中其他設備相同的 IP 地址,通常由 DHCP 服務器分配。它允許虛擬機與網絡中的其他設備進行通信。
上面有一個名詞:橋接網絡,它是什么呢?其實它就是虛擬機的一種網絡模式。而示例1,示例2,采用的是端口轉發,其實是另一種網絡模式:網絡地址轉換(NAT)
在virtual box軟件中,可以看到這些網絡模式。
橋接模式
橋接網絡(Bridged Network) 是一種虛擬機網絡配置,使得虛擬機像物理網絡中的另一臺獨立設備一樣,通過物理主機的網絡接口直接連接到物理網絡。
橋接網絡的工作原理:
在橋接網絡模式下,虛擬機和物理主機(宿主機)共享同一個物理網絡適配器,虛擬機與物理網絡中的其他設備(如其他計算機、打印機、路由器等)在同一個網絡中,并且會像主機一樣獲取到一個獨立的 IP 地址。
橋接網絡的特點:
獨立的 IP 地址:虛擬機將被分配到和主機在同一局域網中的 IP 地址。這個 IP 地址通常由 DHCP 服務器分配,虛擬機在網絡上就像一臺物理設備。
虛擬機與物理設備通信:虛擬機能夠與物理網絡上的其他設備進行通信,就像它們是直接連接到物理網絡一樣。
與主機隔離:虛擬機不會受到主機操作系統的網絡配置影響,虛擬機擁有完全獨立的網絡連接。
NAT模式。
NAT(Network Address Translation)模式 是虛擬機(VM)網絡配置的一種方式,它允許虛擬機通過宿主機的網絡連接訪問外部網絡(如互聯網),而無需直接暴露虛擬機的 IP 地址。
NAT模式的工作原理:
在 NAT 模式 下,虛擬機通過宿主機(物理主機)的網絡連接進行外部通信。虛擬機本身并不直接擁有公共 IP 地址,而是通過宿主機共享網絡連接。宿主機會充當一個“網關”,把虛擬機的網絡流量轉換(NAT)為宿主機的 IP 地址,然后將這些數據轉發到外部網絡。
特點:
虛擬機與外部網絡通信:虛擬機可以訪問外部網絡(如互聯網),但它對外界是不可見的,外部網絡無法直接訪問虛擬機。虛擬機的網絡流量會通過宿主機的 IP 地址進行轉發。
虛擬機的私有 IP:虛擬機通常會獲得一個私有 IP 地址(如 192.168.x.x 或 10.x.x.x),并且該 IP 地址僅對虛擬機和宿主機可見。外部網絡無法直接訪問虛擬機的私有 IP 地址。
端口轉發(Port Forwarding):如果你希望從外部網絡訪問虛擬機的服務(例如 Web 服務),可以通過設置端口轉發來實現。通過端口轉發,外部網絡可以通過宿主機的某個端口訪問虛擬機的端口。
Host-Only(僅主機模式)。
僅主機網絡模式創建一個虛擬網絡,僅允許虛擬機與宿主機進行通信,而虛擬機與外部網絡沒有連接。虛擬機將獲得一個由宿主機分配的 IP 地址,可以通過宿主機訪問虛擬機,但不能直接訪問互聯網或其他網絡。
使用場景:適用于需要隔離虛擬機與外部網絡,但又需要虛擬機和宿主機之間通信的場景。例如,在測試環境中,需要虛擬機進行隔離,但需要宿主機管理虛擬機。
其實,就是虛擬機和宿主機,組了一個內部局域網。
現在在理解上面配置,是不是就很清晰明了了?