docker容器與虛擬機有什麼區別?

D伯爵D


我們單位最近在推docker,已經在開發測試環境使用(稍顯落後),下面我就談談自己的Docker的理解,以及Docker和虛擬機的區別。

虛擬機

先說說什麼是虛擬機:在一臺物理機器上,利用虛擬化技術,虛擬出來多個操作系統,每個操作系統之間是隔離的。

說起來有些繞,那麼我們看看虛擬機的架構圖,就容易理解了。例如我們要在一臺物理機器運行三個Java項目,彼此之間隔離。

從下往上看,解釋起來其實很簡單:

最下面的一層就是物理機,可以是服務器,設置是一臺個人電腦;

  • 電腦上需要安裝操作系統,比如我們安裝了win10的操作系統;

  • 再往上就是虛擬機軟件了,比如我們常用的VirtualBox、VMWare,它們的作用是模擬計算機硬件;

  • 繼續向上,就是虛擬機模擬出來的操作系統了;

  • 在虛擬的操作系統中,安裝所需的軟件、組件等。比如我們需要在虛擬操作系統中安裝JDK、Tomcat等;

  • 最後就是具體的應用了,例如部署到Tomcat中。

Docker

再說說什麼是Docker,找了一句官方的解釋:Docker是開源的應用容器引擎。是不是又一頭霧水?我們還是先看看Docker的架構圖。

依然從下往上看:

  • 最下面兩層,概念同上。

  • 往上,可以看做Docker容器的管理器。

  • 依賴和應用都被打包成了Docker鏡像。例如,JDK、Tomcat、應用都被打包在了一起,運行在Docker容器裡,容器和容器間是隔離的。

  • 這裡提示:Linux支持Docker,Windows和MacOS的話,不直接支持(win10專業版好像可以直接支持,不過我都是安裝Linux的虛擬機,在上面跑Docker)。

Docker和虛擬機的區別

  • 從兩者的架構圖上看,虛擬機是在硬件級別進行虛擬化,模擬硬件搭建操作系統;而Docker是在操作系統的層面虛擬化,複用操作系統,運行Docker容器。


  • Docker的速度很快,秒級,而虛擬機的速度通常要按分鐘計算。

  • Docker所用的資源更少,性能更高。同樣一個物理機器,Docker運行的鏡像數量遠多於虛擬機的數量。

  • 虛擬機實現了操作系統之間的隔離,Docker算是進程之間的隔離,虛擬機隔離級別更高、安全性方面也更強。

  • 虛擬機和Docker各有優勢,不存在誰替代掉誰的問題,很多企業都採用物理機上做虛擬機,虛擬機中跑Docker的方式。

我將持續分享Java開發、架構設計、程序員職業發展等方面的見解,希望能得到你的關注。


會點代碼的大叔


Docker容器基礎知識

Docker容器是一個在Unix操作系統(如BSD和Solaris)中已經存在數十年的思想的最現代的體現,該思想認為給定進程可以在一定程度上獨立於操作環境的其他部分而運行,虛擬機通過將整個操作系統實例用於需要劃分的每個應用程序來提供隔離。這種方法提供了幾乎完全隔離,但以顯著的開銷為代價。每個客戶操作實例佔用內存和處理能力,可以更好地致力於應用程序本身。

容器採取不同的方法。每個應用程序及其依賴項都使用操作系統資源的分區段。容器運行時(Docker,最常見)通過利用宿主操作系統提供的低級容器服務來設置和拆卸容器。

例如:要理解Linux容器,我們必須從cgroups和命名空間開始,Linux內核功能可以在容器和主機上運行的其他進程之間創建隔離。最初由IBM開發的Linux命名空間包裝了一套系統資源,並將它們呈現給一個進程,使其看起來像是專門用於該進程。

最初由Google開發的Linux cgroup管理一組進程的系統資源(例如CPU和內存)的隔離和使用。例如,如果您的應用程序佔用了大量CPU週期和內存(例如科學計算應用程序),則可以將應用程序放在cgroup中以限制其CPU和內存使用量。

命名空間處理單個進程的資源隔離,而cgroups管理一組進程的資源。cgroup和命名空間一起用於創建容器技術,稱為Linux容器或LXC。

Docker如何更改容器

最初的Linux容器技術LXC是一種Linux操作系統級虛擬化方法,用於在單個主機上運行多個獨立的Linux系統。命名空間和cgroup使LXC成為可能。

容器將應用程序與操作系統分離,這意味著用戶可以擁有乾淨且最小的Linux操作系統,並在一個或多個隔離容器中運行其他所有操作系統。此外,由於操作系統是從容器中抽象出來的,因此您可以將容器移動到支持容器運行時環境的任何Linux服務器上。

Docker對LXC進行了幾項重大更改,使容器更具便攜性和靈活性。使用Docker容器,您可以比使用虛擬機更快速,更輕鬆地部署,複製,移動和備份工作負載。

Docker為任何能夠運行容器的基礎架構帶來了類似雲的靈活性。

Docker還提供了一種創建容器映像的方法 - 指定給定容器將運行的軟件組件以及如何運行。Docker的容器鏡像工具允許開發人員構建鏡像庫,將鏡像組合成新鏡像,並在本地或遠程基礎架構中啟動應用程序。

Docker還可以更輕鬆地協調容器之間的行為,從而通過將容器連接在一起來構建應用程序堆棧。這些行為的更高級版本- 所謂的容器編排 - 由第三方產品提供。例如Kubernetes,Docker為此提供了基礎。

通過採用LXC概念並圍繞它構建API和生態系統,Docker的開發人員使得開發人員更容易使用容器,對企業更有用。最後,儘管Docker最初是在LXC上構建的,但最終Docker團隊創建了自己的運行時,稱為Libcontainer。Libcontainer不僅為容器提供了更豐富的服務層,而且使Docker團隊更容易與Linux分開開發Docker容器技術。

如今,Docker是一個Linux或Windows實用程序,可以高效地創建,發送和運行容器。

Docker優勢

Docker容器提供了一種構建企業和業務線應用程序的方法,這些應用程序比傳統的應用程序更容易組裝,維護和移動。

  • Docker容器支持隔離與限制

Docker容器使應用程序不僅彼此隔離,而且與底層系統隔離。這不僅可以實現更清晰的軟件堆棧,還可以更輕鬆地指定給定的容器化應用程序如何使用系統資源- CPU,GPU,內存,I / O,網絡等。它還可以更輕鬆地確保數據和代碼保持獨立。(請參閱下面的“Docker容器是無狀態且不可變的”。)

  • Docker支持可移植性

Docker容器在支持容器運行時環境的任何機器上運行。應用程序不必綁定到主機操作系統,因此應用程序環境和底層操作環境都可以保持清潔和最小化。

例如,MySQL for Linux容器將在大多數支持容器的Linux系統上運行。應用程序的所有依賴項通常都在同一容器中提供。

基於容器的應用程序可以輕鬆地從本地系統移動到雲環境或從開發人員的筆記本電腦移動到服務器,只要目標系統支持Docker以及可能與之一起使用的任何第三方工具,例如Kubernetes(請參閱下面的“Docker容器簡化編排和縮放”)。

通常,必須為特定平臺構建Docker容器映像。例如,Windows容器不能在Linux上運行,反之亦然。以前,解決此限制的一種方法是啟動運行所需操作系統實例的虛擬機,並在虛擬機中運行容器。

然而,Docker團隊後來設計了一種更優雅的解決方案,稱為清單,它允許多個操作系統的鏡像在同一鏡像中並排打包。清單仍然被認為是實驗性的,但它們暗示了容器如何成為跨平臺應用程序解決方案以及跨環境應用程序解決方案。

  • Docker容器支持隔離與限制可組合性

大多數業務應用程序由幾個單獨的組件組成,這些組件組織成一個堆棧- 一個Web服務器,一個數據庫,一個內存緩存。容器可以將這些部件組合成具有易於更換的部件的功能單元。每件作品都由不同的容器提供,可以獨立於其他容器進行維護,更新,換出和修改。

這本質上是應用程序設計的微服務模型。通過將應用程序功能劃分為獨立的自包含服務,微服務模型提供了減緩傳統開發過程和不靈活的單片應用程序的辦法,輕量級和便攜式容器使構建和維護基於微服務的應用程序變得更加容易。

  • Docker容器支持隔離與限制可組合性簡化了編排和擴展

由於容器重量輕且開銷很小,因此可以在給定系統上啟動更多容器。但容器也可用於跨系統集群擴展應用程序,以及啟動和關閉服務以滿足需求高峰或節約資源。

用於部署,管理和擴展容器的大多數企業級版本的工具都是通過第三方項目提供的。其中最主要的是Google的Kubernetes,一個用於自動化容器部署和擴展方式的系統,以及它們如何連接在一起,負載平衡和管理。Kubernetes還提供了創建和重用多容器應用程序定義或“Helm charts”的方法,以便可以按需構建和管理複雜的應用程序堆棧。

Docker的告誡

容器解決了很多問題,但它們並非萬能,有些缺點是設計上的; 有些是其性質的副作用

Docker容器不是虛擬機。人們用容器做出的最常見的概念錯誤就是將它們與虛擬機等同起來。但是,由於容器和虛擬機使用不同的隔離機制,因此它們具有明顯不同的優點和缺點。

虛擬機為進程提供高度隔離,因為它們在自己的操作系統實例中運行。該操作系統也不必與主機上運行的操作系統相同。Windows虛擬機可以在Linux管理程序上運行,反之亦然。


相反,容器使用主機操作系統資源的受控部分; 許多應用程序以高度管理的方式共享相同的操作系統內核。因此,容器化應用程序不像虛擬機那樣完全隔離,但它們為絕大多數工作負載提供了足夠的隔離。

Microsoft在Windows上提供了兩種類型的容器,這些容器在容器和虛擬機之間略微模糊了線條:

  • Windows Server Containers實際上是Windows上的Docker樣式容器。Microsoft本質上為Windows內核提供了一些在Linux中用於執行隔離的相同機制,因此Docker容器可以在兩個平臺上具有相同的行為。

  • Hyper-V容器是在其自己的虛擬機中運行的容器,具有自己的內核以進行額外隔離。因此,如果需要,Hyper-V容器可以運行不同版本的Windows內核。如果需要,可以將常規容器轉換為Hyper-V容器。

  • 請記住,雖然Hyper-V容器在Hyper-V管理程序上運行並利用Hyper-V隔離,但它們仍然是與完整虛擬機是不同的物種。

Docker容器不提供裸機速度

容器幾乎沒有虛擬機的開銷,但它們的性能影響仍然是可測量的。如果您的工作負載需要裸機速度,那麼容器可能能夠讓您足夠接近- 比VM更接近- 但您仍然會看到一些開銷。

Docker容器是無狀態且不可變的

容器從描述其內容的鏡像啟動並運行。默認情況下,該鏡像是不可變的- 一旦創建,它就不會改變。因此,容器沒有持久性。如果啟動容器實例,然後將其終止並重新啟動它,則新容器實例將不會具有與舊容器關聯的任何有狀態信息。

這是容器與虛擬機不同的另一種方式。默認情況下,虛擬機在會話中具有持久性,因為它具有自己的文件系統。對於容器,唯一堅持的是用於引導容器中運行的軟件的映像; 改變它的唯一方法是創建一個新的,修改過的容器鏡像。


從好的方面來說,容器的無狀態使得容器的內容更加一致,並且更容易且可預測地組成應用程序堆棧。它還迫使開發人員將應用程序數據與應用程序代碼分開。

如果您希望容器具有任何類型的持久狀態,則需要將該狀態置於其他位置。這可能是數據庫或在啟動時連接到容器的獨立數據卷。


Docker容器不是微服務

我之前提到容器如何用於創建微服務應用程序。這並不意味著接受一個給定的應用程序並將其粘貼到一個容器中會自動創建一個微服務。微服務應用程序必須根據微服務設計模式構建,無論它是否部署在容器中。可以將應用程序容器化作為將其轉換為微服務的過程的一部分,但這只是許多步驟中的一個。

當虛擬機出現時,它們可以將應用程序與它們運行的系統分離。Docker容器將這一想法進一步發展- 不僅僅是通過比虛擬機更輕量級,更便攜,更快速地啟動,還通過提供虛擬機無法實現的擴展,組合和管理功能。


啟迪雲Tuscloud


docker解決的主要問題

有過後臺開發經驗的同學,一定遇到過下面這些問題:

  1. 程序在開發環境跑得好好的,但是部署到生產環境,卻狀況頻出;

  2. 假設某個程序要在客戶的環境上進行部署,雖然在自己的環境上部署、驗證成功,但始終擔心客戶的環境上缺少某些必要的庫文件,或者某些文件的版本不符合要求;

那麼,有了docker,這些問題都將不復存在。

什麼是docker

Docker是一個虛擬環境容器,可以將你的可執行文件、配置文件及一切其他你需要的文件一併打包到這個容器中,併發布和應用到任意平臺。比如,你在本地用Python開發了一個網站後臺,開發測試完成後,就可以將Python3及其依賴包、Flask及其各種插件、Mysql、Nginx等打包到一個容器中,然後部署到任意你想部署到的環境。

如果不好理解,我們再拿集裝箱打個比方。

集裝箱解決了什麼問題呢?在一艘大船上,可以把貨物規整的擺放起來。並且各種各樣的貨物被集裝箱標準化了,集裝箱和集裝箱之間不會互相影響。那麼我就不需要專門運送水果的船和專門運送化學品的船了。只要這些貨物在集裝箱裡封裝的好好的,那我就可以用一艘大船把他們都運走。

docker也是類似的理念。我們可以在一臺機器上跑多個互相毫無關聯的docker容器,每一個容器就相當於一個集裝箱。

docker裡的幾個基本概念

  • 鏡像

    鏡像可以理解為一堆靜態的文件

  • 容器

    容器則是鏡像run起來之後的一個實例。鏡像之於容器就好比面向對象編程裡的class之於object。

  • 倉庫

    鏡像需要地方保存,這個地方就是倉庫

與傳統虛擬化的區別

這裡我們順便講一下傳統虛擬化。

我們看到,傳統虛擬化是站在硬件物理資源的基礎上,虛擬出多個OS,然後在OS的基礎上構建相對獨立的程序運行環境,而Dokcer則是在OS的基礎上進行虛擬,顯然Dokcer輕量得多,因此其資源佔用、性能消耗相比傳統虛擬化都有很大優勢。


互聯網技術面試


每日分享科技領域相關內容,有緣相遇,期待關注。

在IT行業從業多年,也算從看著時代從物理服務器走向虛擬化雲計算時代,又準備進入Docker時代,作為下一代虛擬化技術,Docker正改變著整個行業開發、測試、部署應用的方式,至於虛擬化技術和docker技術到底有什麼不同,下面來分析一下。


01 什麼是虛擬化?

顧名思義,虛擬化技術是將物理資源以某種技術虛擬成資源池的形式,主要有一虛多和多虛一兩種形式,比如個人電腦安裝Vmware軟件,可以在這個軟件上安裝其他Win系統、MacOS、Linux系統等,實現一臺電腦/筆記本承載多個系統的優點,目前蘋果筆記本用戶雙系統解決方案也以虛擬機為主,普通Windows用戶可能需求量不大,而技術人員基本是必備軟件了。


從企業層面來看,多虛一為主要形式,也就是將大量物理服務器集群虛擬化,形成一個資源池,在這個資源上創建各種不同的虛擬機,實現靈活部署。


02 什麼是Docker

其實docker和虛擬技術很像,但又有一些不同點,一方面是兩個技術的層級上,虛擬機一般是底層硬件Hardware支撐,上層是虛擬管理系統Hypervisor層,在上層開啟不同的VM業務,如果需要將這些業務進行隔離,需要每個VM啟動客戶機操作系統,非常消耗資源。



Docker完全不同,底層有硬件和Host OS系統支撐,比如Windows/MacOS/Linux,中間拋去了臃腫的系統,而是以Docker守護進程代替,上層建立不同的容器,不同的應用鏡像打包在不同的容器中,他們互相隔離。


03 虛擬化與docker的區別

docker設計小巧,部署遷移快速,運行高效,應用之間相互獨立,管理人員可以看到所有容器的內容,虛擬化技術比較臃腫,不論什麼應用都需要先創建新的系統,並且並非按照應用隔離,而是按照系統隔離,管理員無法看到系統內部信息。

舉個例子,Docker就是手機中的各種APP,只需要一個系統就可以下載自己所需的應用,但是虛擬化技術相當於你的蘋果手機安裝一個龐大軟件,這個軟件上安裝安卓系統、魅族系統等,每個系統上還要安裝各類應用,比較麻煩。


但兩者沒有絕對的好壞,主要還是看應用場景,根據不同的需求選擇不同的解決方案即可。



科技銀狐


虛擬機是操作系統級別的隔離,docker是進程級別的


分享到:


相關文章: