容器還是虛擬機器:一句話的差別與它的四個後果

這個選擇通常出於資源上的習慣。然而差別就在一句話裡,其他一切都由此而來。

AtlasPVE ·

本條目涵蓋以下問題

  • proxmox lxc vs vm 差別
  • proxmox 用容器還是虛擬機器
  • proxmox lxc 優點
  • proxmox 該選哪一種
  • proxmox lxc 安全嗎

準備在 Proxmox 上執行新的東西時,眼前有兩個選項。兩者都執行 Linux,兩者都並排出現在面板上,看起來也都在做同樣的事。

這個選擇通常出於資源上的習慣:容器比較輕量。這沒錯,但這不應該是決定的依據。

差別就在一句話裡:虛擬機器帶著自己的核心,容器使用伺服器的核心。需要知道的一切都由這句話而來。

第一個後果:邊界在哪裡

虛擬機器的邊界由硬體劃定。容器的邊界由伺服器的核心劃定。

這並不代表容器比較弱,而是說明邊界在哪裡。如果容器內軟體的缺陷想要觸及伺服器,它必須突破的是伺服器自身的核心。在虛擬機器中,它必須突破的是硬體層級的一道牆。

實際的問題是:對即將執行的東西有多少信任?對自己寫的或用了多年的服務,容器完全合適。對下載來、又不完全了解的東西,虛擬機器是更好的去處。

第二個後果:不是所有東西都能在容器裡執行

需要自己核心的東西,都無法在容器裡執行。需要不同核心版本的軟體、會載入核心模組的工具、不是 Linux 的作業系統:這些都需要虛擬機器。

這不是偏好的問題,而是上面那句話的直接結果。既然容器使用的是伺服器的核心,就不可能要求它更換那個核心。

第三個後果:維護對兩者的影響不同

這是最少人知道、也最可能造成傷害的一點。

更新虛擬機器引擎時,執行中的虛擬機器不受影響。新的引擎只套用於該次更新之後才啟動的虛擬機器。所以一個維護之夜可以安靜地從執行中的虛擬機器上方經過。

更新容器執行環境層時,執行中的容器可能受到影響,因為它們全都共用這一層。更新期間,共用的檔案系統層可能被重新掛載,容器內可能出現短暫的存取錯誤。

這不是產品的意見,而是同一句話的直接結果:更新共用的東西,所有共用它的對象都會感受到。

第四個後果:移動的自由

虛擬機器可以在執行中遷移到另一個節點。容器不行:它會先關機、遷移,然後再次啟動。

所以如果無法容忍中斷的工作放在容器裡,那項工作會在維護之夜停止。決定放置位置時,這是必須權衡的一點。

實用的規則

選擇容器的時機:要執行的是原本也能直接在伺服器上執行的一般 Linux 服務,對它足夠信任,而且它能承受短暫中斷。

選擇虛擬機器的時機:需要它自己的核心、維護期間不能中斷,或是對要執行的東西不完全信任。

資源上的差別要排在這三項檢驗之後。容器確實使用較少的記憶體,但容器放錯位置的代價,是這份節省的好幾倍。

Atlas 的做法

Atlas 承載這個區別的方式不是一句口號,而是行為。

在更新評估中,虛擬機器引擎和容器執行環境層會分開處理。更新虛擬機器引擎時,針對執行中虛擬機器給出的答案屬於資訊層級:它們不受影響,新的引擎套用於之後啟動的虛擬機器。更新容器層時,層級會提高為警告,並寫出原因:共用層可能被重新掛載,建議短暫停止關鍵容器。

同樣的區別也出現在遷移規劃中:對容器而言,不會提供執行中遷移的選項,而是說明關機、遷移、啟動這條流程。

所以產品不會把兩者呈現為同一種東西的兩種口味。它們的行為不同,因此描述也不同。

資料來源

Proxmox 官方文件。內容為英文,且在此主題上以官方文件為準。

相關條目

這項工作在 Atlas 中是什麼樣子?

前往產品頁面