Vagrant 與 Docker:哪個適合您? (可以兩者兼而有之)
已發表: 2023-01-26DevOps 團隊面臨越來越大的壓力,需要快速為客戶提供更強大的功能。 雲提供商通過具有出色 CLI 和 API 集成的可擴展平台提供解決方案。 不幸的是,雲提供商公開的接口可能不兼容。 但一些雲原生工具可幫助 DevOps 團隊為任何云提供商構建自定義解決方案。
兩個這樣的工具是 Vagrant 和 Docker。 了解它們的作用以及它們如何協同工作是充分利用您的雲環境的關鍵。
Vagrant 是一種用於在單個工作流程中構建和管理虛擬機 (VM) 環境的工具。 無論您是構建本地 VM 以與管理程序一起運行,還是僅構建雲 VM,Vagrant 都提供一致的配置格式、單一 CLI 和共享配置程序來安裝軟件和更改配置。
Docker 提供了將軟件和支持配置打包到跨多個平台一致運行的圖像中的能力。 Docker 使 DevOps 團隊確信軟件將以與在託管雲平台上運行的方式大致相同的方式在本地工作站上運行。
儘管 Vagrant 和 Docker 的共同目標是創建可重複的環境,但它們以不同但互補的方式實現。 本文探討了 Vagrant 和 Docker 如何實現他們的目標。
什麼是碼頭工人?
Docker 是一個用於開發、運輸和運行應用程序的開放平台。 它允許 DevOps 團隊將自定義軟件、支持應用程序和庫以及配置、網絡、文件安裝、運行狀況檢查和啟動腳本的說明打包到一個稱為映像的獨立工件中。
然後圖像在稱為容器的輕量級隔離環境中執行。 與通常保留固定數量的內存並嚴格限制 CPU 使用的 VM 不同,容器更具彈性並且只消耗它們需要的內存和 CPU。
這允許許多容器高效地並排運行,從而降低成本並增加規模。 然而,容器並不像 VM 那樣安全,這意味著容器不是運行不受信任代碼的理想解決方案。
為什麼使用 Docker(相對於 Vagrant)?
DevOps 團隊通常使用 Docker 來交付和運行 Web 應用程序,包括與消息隊列集成或託管在響應基於雲的觸發器和事件的功能即服務 (FaaS) 平台上的雲原生應用程序。
像 Kubernetes 這樣的平台建立在 Docker 之上,允許大規模地編排容器。 此外,每個雲提供商都支持在其平台即服務 (PaaS) 產品中運行 Docker 容器的能力。 現在很少能找到不支持 Docker 的 PaaS。
Docker 還可以分發和執行基於 CLI 的工具,所有流行的雲原生工具都提供嵌入其 CLI 的 Docker 映像。
Docker有什麼好處?
Docker 解決了傳統軟件部署過程面臨的一個常見問題,即自定義應用程序在開發人員的本地工作站和生產環境中運行時可能會呈現不同的結果。 這些差異通常是由於開發人員運行不同版本的編程語言、使用不同的配置來支持 Web 服務器等應用程序,或者運行與生產環境完全不同的操作系統。 這些差異導致支持問題在團隊之間來回跳動,評論如“它在我的機器上工作”。
由於 Docker 映像包含自定義應用程序、所有支持應用程序和庫的代碼,因此映像在容器中執行,無論它們在何處運行,都能提供更一致的結果。
Docker 鏡像很容易使用 Docker Hub 等註冊表進行分發,允許 DevOps 團隊快速共享鏡像並使用各種託管平台部署鏡像。 例如,您會發現 Kinsta 的 DevKinsta WordPress 開發套件背後有 Docker。
在需要更複雜的應用程序堆棧的地方,例如將數據庫與後端應用程序一起部署,或一組相關的微服務,Docker Compose 提供了使用單個命令創建和鏈接多個 Docker 容器的能力。 所有容器、相關設置和網絡配置都在單個 YAML 文件中定義。 Docker Compose 然後讀取這個文件來創建和管理多個容器作為一個單元。
Docker 還享有主要雲提供商近乎普遍的支持,這意味著 DevOps 團隊在雲中執行 Docker 映像時,選擇太多了。
什麼是 Vagrant?
幾十年來,VM 已被證明是用於分區和配置計算資源的可靠且安全的解決方案。 虛擬機仍然是雲提供商提供的最受歡迎的服務,許多團隊的商業和開源解決方案都希望在本地運行虛擬機。
然而,這種多樣性給 DevOps 團隊帶來了挑戰。 每個解決方案都公開了不同的 CLI 和 API 來創建和管理 VM,因此很難保持本地開發環境和基於雲的平台之間的一致性。
Vagrant 通過抽象 VM 平台之間的潛在差異提供了一個解決方案,允許 DevOps 團隊使用單一 CLI 和一致的配置語法來配置新的 VM。 採用 Vagrant 的團隊可以創建一致的 VM,無論它們是在本地還是在雲環境中運行,並且可以輕鬆地在環境之間切換。 Vagrant 有多種不同的用途,包括作為 MAMP 的替代品(macOS、Apache、MySQL/MariaDB 和 PHP、Perl 或 Python)。
為什麼使用 Vagrant(相對於 Docker)?
可以通過手動安裝軟件和編輯配置文件來啟動 VM 和手動配置操作系統。 這並不理想,因為該過程不可重複,這意味著必須為不同的操作系統和提供商手動重新創建 VM。 這也使得以後幾乎不可能了解虛擬機是如何配置的。
更好的做法是將配置虛擬機所需的過程自動化。 Vagrant 提供了一個單一的工具來自動化為許多供應商構建 VM 的過程。 Vagrant 還在 Vagrant Cloud 上提供了大量高質量的 VM,DevOps 團隊可以使用這些 VM 來開始他們自己的 VM。
Vagrant 有什麼好處?
使用 Vagrant 的 DevOps 團隊有一個單一的工具來學習,無論他們是為本地平台、雲平台還是兩者構建 VM。 您可以輕鬆調整 Vagrant 配置文件並在以後重新運行或查看它們以了解 VM 的構建方式。
Vagrant 還允許 DevOps 團隊遷移到雲端或在提供商之間遷移,而無需重新設計他們用於構建 VM 的流程。
Vagrant 創建的虛擬機提供了高級別的隔離,通常利用現代 CPU 內置的專門虛擬化支持。 這使得 VM 和創建它們的工具(如 Vagrant)成為安全和隔離具有高優先級的最佳選擇。
許多 Linux 發行版,例如 Ubuntu 和 Fedora,也提供了官方的 Vagrant 盒子,DevOps 團隊可以在上面構建。 這減少了構建自定義 VM 所需的時間。
Vagrant 與 Docker:近距離觀察
Vagrant 和 Docker 都通過自動化構建、分發和運行軟件應用程序來提高 DevOps 團隊的效率。
Docker 通過圖像形式的自定義打包格式和通過容器的輕量級執行環境實現了這一目標。 容器在平台之間一致地執行,讓 DevOps 團隊更有信心他們的軟件按預期工作。 Docker 得到 PaaS 和 FaaS 雲平台的良好支持,允許 DevOps 團隊選擇最適合他們需求的平台。
許多容器可以在一台主機上共存,主要是——但不是完全——彼此隔離,同時共享相同的資源池。 這允許容器有效地擴展。
Vagrant 通過提供一種與現有提供者構建 VM 的一致方法來實現這一目標。 對於已經投資於 VM 並依賴其高級別隔離、安全、控制和自定義的團隊來說,這是一個理想的選擇。
Docker 還提供了運行可信代碼時的最佳解決方案,同時最大限度地降低了計算成本。 容器彼此合理隔離,但開銷很小。 這意味著許多容器可以在共享操作系統上同時運行。 當團隊需要高級別的隔離和安全性或需要同時運行許多不同操作系統的能力時,VM 提供了最佳解決方案,而 Vagrant 為以自動化和可重複的方式構建 VM 提供了一個方便的解決方案。
Vagrant 和 Docker 不是相互排斥的技術,這兩種工具可以同時使用。 例如,DevOps 團隊可能使用 Docker 來開發和運行應用程序,同時使用 Vagrant 重新創建專門的環境來重現問題。 Docker 甚至可以在 Vagrant 創建的 VM 中運行,可能是為了測試 Docker 的新版本或測試在隔離環境中作為 Docker 映像分發的工具。
概括
DevOps 團隊在構建、分發和運行應用程序時有很多選擇。
Docker 提供自定義鏡像格式和容器執行環境,允許大規模和高效的資源使用,並支持跨 PaaS 和 FaaS 平台。
VM 提供來自許多雲和本地 VM 供應商的安全和隔離的執行環境,Vagrant 抽像出許多差異以提供單一 CLI 和一致的配置語法來跨供應商實例化 VM。
在開始開發下一個應用程序之前,請先了解一下 Kinsta 的應用程序託管服務如何利用 Dockerfiles 來管理代碼的部署。