Docker 與 VM 之間有何區別?
Docker 和虛擬機器 (VM) 是應用程式部署中採用的兩種技術。在軟體開發生命週期,部署會準備要為最終使用者執行的應用程式的程式碼。Docker 是開發人員使用的開放原始碼平台,以將軟體封裝至稱為容器的標準化單元。容器同時包含應用程式碼及其環境,包括程式庫、系統工具和執行期。藉助 Docker,您可在任何機器上部署和擴展應用程式,並確保程式碼持續一致地執行。相較之下,虛擬機器是實體機器的數位複本。您可以擁有多個虛擬機器,而其個別的作業系統可以在相同的主機作業系統上執行。開發人員將虛擬機器設定為建立應用程式的環境。您還可以在虛擬機器上執行 Docker 容器。
虛擬化:Docker 與虛擬機器
虛擬化可讓您建立真實資源的虛擬執行個體,例如伺服器和網路。在運算方面,虛擬化可讓虛擬化元件的多個獨立執行個體在真實的元件上運作。
例如,多個虛擬伺服器可以在實體伺服器上執行。透過在多個虛擬執行個體之間共用真實資源,可以更好地利用這些資源,並且更具成本效益。虛擬化是大量應用程式開發與部署的基礎。
虛擬機器
顧名思義,虛擬機器 (VM) 提供整個機器 (伺服器) 的虛擬化。虛擬機器會模擬實體機器的硬體元件,例如 CPU、記憶體、網路界面卡、USB 控制器和音效卡。您可以在虛擬環境中執行客體作業系統和多個應用程式。
虛擬機器讓雲端技術成為可能,在 Amazon Web Services (AWS) 中,虛擬機器稱為執行個體。這些雲端執行個體由 AWS 擁有和維護,可透過 API 使用。
Docker
VM 可讓您在任何硬體上執行虛擬機器。Docker 可讓您在任何作業系統上執行應用程式。其使用稱為容器的隔離使用者空間執行個體。
Docker 容器具有自己的檔案系統、相依性結構、程序和網路功能。應用程式在容器內具備所需的一切,並且可以在任何地方執行。Docker 容器技術會直接使用基礎主機作業系統核心資源。
Docker 與虛擬機之間有什麼其他相似之處?
做為虛擬化技術,Docker 和虛擬機器 (VM) 具有某些相似之處。
映像
Docker 容器和虛擬機器都是從映像建立的。每個映像都是虛擬化環境的藍圖。映像可讓使用者建立和共用一致的環境,而不需要每次都進行設定。
映像會指定執行應用程式所需的所有必要系統資源。例如,VM 映像會建立作業系統備份,而 Docker 容器映像會建立應用程式環境備份。
版本控制
Docker 容器映像和虛擬機器映像都可以進行版本控制,以追蹤一段時間內的環境組態變更。
Docker 中的版本控制是指追蹤和管理一段時間內 Docker 映像檔變更的能力。其可讓開發人員追蹤其應用程式的不同版本,必要時復原到以前的版本,並同時部署不同版本的應用程式。
同樣地,虛擬機器中的版本控制是指追蹤和管理一段時間內虛擬機器映像變更的程序。虛擬機器版本控制會追蹤對虛擬硬體或作業系統組態的變更 (例如更新和修補程式)。
可攜性
虛擬機器和 Docker 的設計目的都是為了解決必須針對不同類型的基礎架構開發不同應用程式組態的難題。儘管 Docker 和 VM 映像採取了不同的方法來應對挑戰,但無論是在內部部署還是在雲端中,都可以跨架構高度可攜。
主要差異:Docker 與虛擬機器
虛擬機器 (VM) 和 Docker 都能解決在不同環境中執行應用程式的挑戰。但是這兩者的緣由略有不同,並且採用不同的方法。
目標
虛擬機器最初設計的目的是讓多個作業系統在單一實體機器上執行。目標是讓使用者建立與基礎硬體隔離的虛擬環境。VM 會抽象化硬體詳細資訊,讓您更輕鬆地在不同硬體架構上執行應用程式,並且更有效率地使用硬體資源。
另一方面,Docker 旨在提供一種輕量型且便於攜帶的方式,在隔離且可重現的環境中封裝和執行應用程式。Docker 會抽象化作業系統詳細資訊,以解決在不同環境 (例如開發、測試和生產等環境) 部署應用程式時所面臨的挑戰。管理軟體環境更新並維持所有位置的環境一致性是一項艱鉅的挑戰。對於執行數百個應用程式或將應用程式分解為數百個微型服務的組織尤其如此。Docker 透過容器化解決這個問題。
終端產品
Docker 是由 Docker 公司擁有和營運的開放原始碼容器平台的名稱。也有像是 Podman 這樣的替代平台,雖然這些平台不是這麼熱門;Docker 是容器化的代名詞。容器是成品,最終使用者的可使用部分。
虛擬機器本身是最終使用者的可使用部分。該技術與特定品牌沒有任何關聯。您可以在內部部署資料中心部署 VM,或透過 API 以受管雲端服務的形式存取 VM。
架構
虛擬機器會執行自己的核心和主機作業系統,以及應用程式及其相依性 (例如程式庫和其他二進位檔案)。Hypervisor 會在硬體 (主機機器或伺服器) 與虛擬機器之間進行協調。其會將具現化期間概述的實體硬體資源配置給虛擬機器,供其獨佔使用。單一功能強大的伺服器上可以存在多部虛擬機器,由單一 Hypervisor 管理,每部虛擬機器上都會執行數百個應用程式。
Docker 容器僅包含其相依性。軟體 Docker Engine 在 Docker 中提供虛擬化。其提供執行中容器與基礎作業系統之間的協調,無論是實體或虛擬機器。
若要透過 Docker 進行更進階的虛擬化管理,請使用 Kubernetes。如需詳細資訊,請參閱 Kubernetes 和 Docker 之間有什麼差別?
資源共用
虛擬機器和 Docker 容器都使用資源多工處理,或虛擬化執行個體之間的資源共用。
只要虛擬機器正在執行,虛擬機器就會預先從硬體要求特定數量的資源,並持續穩定地佔用該數量。
另一方面,Docker 容器會隨需使用資源。不像虛擬機器那樣要求特定數量的實體硬體資源,而是只從單一作業系統核心要求所需的資源。多個容器共用相同的作業系統。Docker 容器直接與核心潛在客戶共用資源,與 VM 相比,可能使用更少的系統資源。
安全性
由於 Docker 容器為了輕量型資源取用而與主機作業系統共用核心,如果核心中存在漏洞,就會面臨風險。但是,Docker 還提供了許多進階安全控制。
相反地,當 VM 執行整個作業系統時,執行應用程式時會有額外的隔離層級。只要作業系統採取嚴格的安全措施,VM 就能提供更高的安全。
使用時機:Docker 與虛擬機器
Docker 容器在 Linux 架構上執行,並且需要 Linux 核心特定的功能,例如命名空間和控制群組 (cgroups)。開發人員經常會在以 Linux 為基礎的虛擬機器上執行 Docker 平台。Docker 會將應用程式程式碼封裝到可在任何地方執行的容器。環境更新只會在容器中完成一次。您不需要更新您的應用程式環境。
例如,您可以在 AWS 中啟動執行個體,並立即使用預先設定 Docker 的 Amazon Machine Image (AMI) 載入執行個體。
不過,如果您特別決定是要使用虛擬機器 (VM) 或 Docker 來部署應用程式,則視應用程式的執行要求而定。
何時使用虛擬機器
如果您執行的應用程式具有下列要求,最好是使用虛擬機器:
- 作業系統特定相依性
- 龐大的硬體資源要求
- 需要在作業系統中設定各種控制項
- 不再於現代化作業系統上執行的舊版應用程式
- 僅有單一基礎實體基礎架構可供使用的不同作業系統要求
使用 Docker 的時機
如果您執行的應用程式具有下列要求,最好是使用 Docker:
- 輕量型資源要求或微型服務架構
- 分散式實體基礎架構環境,包括雲端型伺服器
- 快速部署週期 (因為 Dockerfiles 比 VM 組態更容易管理)
- 快速可擴展性要求
差異摘要:Docker 與VM
Docker 容器 |
VM |
|
這是什麼? |
Docker 是一個用於建立和執行 Docker 容器的軟體平台。Docker 容器是使用者空間執行個體的模擬,也就是使用者處理序執行所在之作業系統的一部分。 |
執行作業系統的實體機器模擬 (包括虛擬化硬體)。 |
虛擬化 |
容器從應用程式程式碼中抽象化作業系統詳細資訊。 |
VM 從應用程式程式碼中抽象化硬體詳細資訊。 |
目標 |
抽象化硬體詳細資訊並增加硬體使用率。 |
改善應用程式環境管理,並在多個環境中實現一致性。 |
管理者 |
Docker Engine 會在作業系統與 Docker 容器之間進行協調。 |
Hypervisor 會在機器的實體硬體與虛擬機器之間進行協調。 |
架構 |
與基礎主機核心共用資源。 |
執行自己的核心和作業系統。 |
資源共享 |
隨需。 |
固定數量,在虛擬機器映像的組態要求中設定。 |
AWS 如何支援您的應用程式部署要求?
Amazon Web Services (AWS) 有一系列的服務,專為虛擬機器 (VM) 和 Docker 管理所設計:
- Amazon Elastic Cloud Compute (Amazon EC2) 提供超過 600 種不同類型的安全、可靠且可擴展的執行個體。藉由載入 Amazon Machine Image (AMI) 範本,您可以在幾分鐘內準備好完整指定的開發、測試或生產環境伺服器。
- Amazon Elastic Container Service (Amazon ECS) 是一項全受管的容器協同運作服務,可讓您輕鬆部署和擴展容器化應用程式。客戶可以設定容器執行個體來存取虛擬私有雲端 (VPC) 中的私有 Docker 映像檔登錄檔,或是可從 VPC 外部存取的登錄檔。
- Amazon Elastic Container Registry (Amazon ECR) 可讓您輕易地在任何位置存放、共用及部署您的容器。Amazon ECR 與 Docker 命令列界面 (CLI) 相互整合,讓您能夠簡化從開發到生產的工作流程。例如,您可以使用開發電腦上的 Docker CLI 將容器映像推送至 Amazon ECR。Amazon 容器協調器可以直接提取這些容器映像以進行生產部署。
- AWS Fargate 是一種無伺服器服務,可讓您部署和管理容器,不需要管理實體伺服器或虛擬機器。
立即建立帳戶,開始在 AWS 上部署應用程式。