在日常開發中,同時有多個 Vagrant 虛擬機器在執行,不只佔用大量記憶體和 CPU,也可能造成網路連接埠衝突。本文整理 Vagrant 常用的機器管理指令,以及各指令的差異與適用場景。
Vagrant 基本工作流程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 建立並啟動虛擬機器(依 Vagrantfile 設定)
vagrant up
# 關閉虛擬機器(保存磁碟狀態)
vagrant halt
# 暫停虛擬機器(記憶體快照)
vagrant suspend
# 從暫停狀態恢復
vagrant resume
# 重新啟動虛擬機器(套用 Vagrantfile 變更)
vagrant reload
# 完全刪除虛擬機器(釋放所有資源)
vagrant destroy
|
各指令的差異與適用場景
| 指令 |
說明 |
啟動速度 |
適用場景 |
suspend |
暫停(記憶體快照,類似電腦睡眠) |
最快(秒級) |
短暫離開,稍後繼續工作 |
halt |
正常關機(保留磁碟) |
較快(需完整開機) |
今天不用了,明天繼續 |
destroy |
完全刪除 |
最慢(需重建) |
此環境不再需要 |
suspend vs halt 的選擇
- suspend(推薦日常使用):速度最快,
vagrant resume 幾秒即可回到工作狀態。缺點是仍佔用 RAM(因為要保存記憶體快照)。
- halt(推薦長期不用時):完全關機,不佔用 RAM,但下次
vagrant up 需要完整的開機程序(1-2 分鐘)。
查看所有 Vagrant 機器狀態
1
2
3
4
5
6
7
8
9
10
11
|
# 查看目前目錄的機器狀態
vagrant status
# 查看系統上所有 Vagrant 機器的狀態
vagrant global-status
# 輸出範例:
# id name provider state directory
# 4b7e381 default virtualbox running /home/user/project-a
# 7d2f1c9 default virtualbox saved /home/user/project-b
# 9a1b3e2 default virtualbox poweroff /home/user/project-c
|
批次關閉所有執行中的機器
當有多個機器在執行時,可以一次關閉所有:
1
2
3
4
5
|
# 暫停所有執行中的機器(推薦)
vagrant global-status | awk '/running/{print }' | xargs -r -d '\n' -n 1 -- vagrant suspend
# 關閉所有執行中的機器
vagrant global-status | awk '/running/{print }' | xargs -r -d '\n' -n 1 -- vagrant halt
|
vagrant snapshot 快照功能
快照可以在特定時間點保存虛擬機器的完整狀態,方便回滾:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 建立快照(需要機器在執行中)
vagrant snapshot save <快照名稱>
vagrant snapshot save before-update
# 列出所有快照
vagrant snapshot list
# 還原到指定快照
vagrant snapshot restore <快照名稱>
vagrant snapshot restore before-update
# 刪除快照
vagrant snapshot delete <快照名稱>
# push/pop 快照(類似堆疊操作)
vagrant snapshot push # 儲存目前狀態
vagrant snapshot pop # 還原並刪除最後一個快照
|
快照的使用情境:
- 在安裝重大軟體或進行系統更新前先建立快照
- 測試設定變更,失敗可快速回滾
- 示範環境的快速重置
常見問題排查
global-status 顯示已刪除的機器
global-status 有快取,若機器已手動刪除但仍顯示,可以清除快取:
1
|
vagrant global-status --prune
|
機器因連接埠衝突無法啟動
1
2
3
4
|
# 查看哪個 port 被佔用
netstat -tlnp | grep <port>
# 先關閉衝突的 Vagrant 機器再啟動
|
參考資料