『壹』 docker容器與虛擬機有什麼區別
我們單位最近在推docker,已經在開發測試環境使用(稍顯落後),下面我就談談自己的Docker的理解,以及Docker和虛擬機的區別。
虛擬機
先說說什麼是虛擬機:在一台物理機器上,利用虛擬化技術,虛擬出來多個操作系統,每個操作系統之間是隔離的。
說起來有些繞,那麼我們看看虛擬機的架構圖,就容易理解了。例如我們要在一台物理機器運行三個Java項目,彼此之間隔離。
從下往上看, 解釋起來其實很簡單:
最下面的一層就是物理機,可以是伺服器,設置是一台個人電腦;
Docker
再說說什麼是Docker,找了一句官方的解釋:Docker是開源的應用容器引擎。是不是又一頭霧水?我們還是先看看Docker的架構圖。
依然從下往上看:
Docker和虛擬機的區別
我將持續分享Java開發、架構設計、程序員職業發展等方面的見解,希望能得到你的關注。
謝謝了!docker容器域虛擬機有什麼區別呢?
docker容器: Docker 容器是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的Linux機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面(類似 iPhone 的 app)。幾乎沒有性能開銷,可以很容易地在機器和數據中心中運行。最重要的是,他們不依賴於任何語言、框架包括系統。
虛擬機: 虛擬機(Virtual Machine)指通過軟體模擬的具有完整硬體系統功能的、運行在一個完全隔離環境中的完整計算機系統。虛擬系統通過生成現有操作系統的全新虛擬鏡像,它具有真實windows系統完全一樣的功能,進入虛擬系統後,所有操作都是在這個全新的獨立的虛擬系統裡面進行,可以獨立安裝運行軟體,保存數據,擁有自己的獨立桌面,不會對真正的系統產生任何影響 ,而且具有能夠在現有系統與虛擬鏡像之間靈活切換的一類操作系統。虛擬系統和傳統的虛擬機(Parallels Desktop ,Vmware,VirtualBox,Virtual pc)不同在於:虛擬系統不會降低電腦的性能,啟動虛擬系統不需要像啟動windows系統那樣耗費時間,運行程序更加方便快捷;虛擬系統只能模擬和現有操作系統相同的環境,而虛擬機則可以模擬出其他種類的操作系統;而且虛擬機需要模擬底層的硬體指令,所以在應用程序運行速度上比虛擬系統慢得多。 對比虛擬機與DockerDocker守護進程可以直接與主操作系統進行通信,為各個Docker容器分配資源;它還可以將容器與主操作系統隔離,並將各個容器互相隔離。虛擬機啟動需要數分鍾,而Docker容器可以在數毫秒內啟動。由於沒有臃腫的從操作系統,Docker可以節省大量的磁碟空間以及其他系統資源。說了這么多Docker的優勢,大家也沒有必要完全否定虛擬機技術,因為兩者有不同的使用場景。虛擬機更擅長於徹底隔離整個運行環境。例如,雲服務提供商通常採用虛擬機技術隔離不同的用戶。而Docker通常用於隔離不同的應用,例如前端,後端以及資料庫。
docker解決的主要問題
有過後台開發經驗的同學,一定遇到過下面這些問題:
那麼,有了docker,這些問題都將不復存在。
什麼是dockerDocker是一個虛擬環境容器,可以將你的可執行文件、配置文件及一切其他你需要的文件一並打包到這個容器中,並發布和應用到任意平台。比如,你在本地用Python開發了一個網站後台,開發測試完成後,就可以將Python3及其依賴包、Flask及其各種插件、Mysql、Nginx等打包到一個容器中,然後部署到任意你想部署到的環境。
如果不好理解,我們再拿集裝箱打個比方。
集裝箱解決了什麼問題呢?在一艘大船上,可以把貨物規整的擺放起來。並且各種各樣的貨物被集裝箱標准化了,集裝箱和集裝箱之間不會互相影響。那麼我就不需要專門運送水果的船和專門運送化學品的船了。只要這些貨物在集裝箱里封裝的好好的,那我就可以用一艘大船把他們都運走。
docker也是類似的理念。我們可以在一台機器上跑多個互相毫無關聯的docker容器,每一個容器就相當於一個集裝箱。
docker里的幾個基本概念 與傳統虛擬化的區別這里我們順便講一下傳統虛擬化。
我們看到,傳統虛擬化是站在硬體物理資源的基礎上,虛擬出多個OS,然後在OS的基礎上構建相對獨立的程序運行環境,而Dokcer則是在OS的基礎上進行虛擬,顯然Dokcer輕量得多,因此其資源佔用、性能消耗相比傳統虛擬化都有很大優勢。
在IT行業從業多年,也算從看著時代從物理伺服器走向虛擬化雲計算時代,又准備進入Docker時代,作為下一代虛擬化技術,Docker正改變著整個行業開發、測試、部署應用的方式,至於虛擬化技術和docker技術到底有什麼不同,下面來分析一下。
顧名思義,虛擬化技術是將物理資源以某種技術虛擬成資源池的形式,主要有一虛多和多虛一兩種形式,比如個人電腦安裝Vmware軟體,可以在這個軟體上安裝其他Win系統、MacOS、Linux系統等,實現一台電腦/筆記本承載多個系統的優點,目前蘋果筆記本用戶雙系統解決方案也以虛擬機為主,普通Windows用戶可能需求量不大,而技術人員基本是必備軟體了。
從企業層面來看,多虛一為主要形式,也就是將大量物理伺服器集群虛擬化,形成一個資源池,在這個資源上創建各種不同的虛擬機,實現靈活部署。
其實docker和虛擬技術很像,但又有一些不同點,一方面是兩個技術的層級上,虛擬機一般是底層硬體Hardware支撐,上層是虛擬管理系統Hypervisor層,在上層開啟不同的VM業務,如果需要將這些業務進行隔離,需要每個VM啟動客戶機操作系統,非常消耗資源。
Docker完全不同,底層有硬體和Host OS系統支撐,比如Windows/MacOS/Linux,中間拋去了臃腫的系統,而是以Docker守護進程代替,上層建立不同的容器,不同的應用鏡像打包在不同的容器中,他們互相隔離。
docker設計小巧,部署遷移快速,運行高效,應用之間相互獨立,管理人員可以看到所有容器的內容,虛擬化技術比較臃腫,不論什麼應用都需要先創建新的系統,並且並非按照應用隔離,而是按照系統隔離,管理員無法看到系統內部信息。
舉個例子,Docker就是手機中的各種APP,只需要一個系統就可以下載自己所需的應用,但是虛擬化技術相當於你的蘋果手機安裝一個龐大軟體,這個軟體上安裝安卓系統、魅族系統等,每個系統上還要安裝各類應用,比較麻煩。
但兩者沒有絕對的好壞,主要還是看應用場景,根據不同的需求選擇不同的解決方案即可。
Docker與虛擬機介紹
虛擬機: 傳統的虛擬機需要模擬整台機器包括硬體,每台虛擬機都需要有自己的操作系統,虛擬機一旦被開啟,預分配給他的資源將全部被佔用,每一個虛擬機包括應用,必要的二進制和庫以及一個完整的用戶操作系統。
容器(Docker): 容器與的宿主機共享硬體資源及操作系統可以實現資源的動態分配。容器包含應用和其所有的依賴包,但是與其他容器共享內核。容器在宿主機操作系統中,在用戶空間以分離的進程運行。
虛擬機和容器都是在硬體和操作系統以上的,虛擬機有Hypervisor層(「翻譯」客戶系統和宿主系統之間的指令),Hypervisor是整個虛擬機的核心所在。他為虛擬機提供了虛擬的運行平台,管理虛擬機的操作系統運行。每個虛擬機都有自己的系統和系統庫以及應用。
容器沒有Hypervisor層,它是內核級的虛擬化,並且每個容器與宿主機共享硬體資源及操作系統,因此Docker容器不存在Hypervisor層帶來性能的損耗,因此可以實現更高的性能和效率。但是虛擬機技術也有其優勢,能為應用提供一個更加隔離的環境,不會因為應用程序的漏洞給宿主機造成任何威脅。
虛擬機是對硬體資源的虛擬,容器技術則是對進程的虛擬,從而可提供更輕量級的虛擬化,實現進程和資源的隔離。從架構來看,Docker比虛擬化少了兩層,取消了hypervisor層和GuestOS層,使用 Docker Engine 進行調度和隔離,所有應用共用主機操作系統,因此在體量上,Docker較虛擬機更輕量級,在性能上優於虛擬化,接近物理機原生性能。
Docker的優勢持續部署與測試
更高效的利用系統資源
交付物標准化
應用隔離
高性能
最近剛好看了一部分docker的東西
先上圖,vm與docker框架,直觀上來講 vm多了一層guest OS,同時Hypervisor會對硬體資源進行虛擬化,docker直接使用硬體資源 ,所以資源利用率相對docker低也是比較容易理解的
其次,openstack能夠以10台/min的速度創建虛擬機,在docker面前就弱爆了,因為docker是利用宿主機的系統內核,所以可以做到在幾秒鍾之內創建大量容器,它們的 啟動速度是在數量級上的差距 。
最後找了一個IBM測試案例,關於計算能力的,對於kvm為什麼會有這么大的性能損失,一方面是因為虛擬機增加了一層虛擬硬體層,運行在虛擬機上的應用程序在進行數值計算時是運行在Hypervisor虛擬的CPU上的;另外一方面是由於計算程序本身的特性導致的差異。虛擬機虛擬的cpu架構不同於實際cpu架構,數值計算程序一般針對特定的cpu架構有一定的優化措施,虛擬化使這些措施作廢,甚至起到反效果。比如對於本次實驗的平台,實際的CPU架構是2塊物理CPU,每塊CPU擁有16個核,共32個核,採用的是NUMA架構;而虛擬機則將CPU虛擬化成一塊擁有32個核的CPU。這就導致了計算程序在進行計算時無法根據實際的CPU架構進行優化,大大減低了計算效率。
從計算機軟體層級來看,docker和虛擬機的區別在於虛擬的軟體層級不一樣。虛擬機基於同一個硬體,模擬出不同的操作系統;而docker基於同一個操作系統,模擬出不同的運行時環境。我們依次來看:
1. 先看看計算機的軟體層次,從下到上依次為:操作系統內核、文件系統(運行時環境)、上層APP。
2. 虛擬機運行在同一個硬體上,可以虛擬出不同的操作系統。比如vmware可以在一台pc上既模擬出一個windows系統,同時也可以模擬出一台linux系統。 藉助虛擬機,兩個不同的操作系統可以同時運行在同一個硬體之上。
3. 而docker則運行在同一個操作系統內核上,虛擬出不同的文件系統或者也可以叫做運行時環境。不同的運行時環境,其對應的文件系統也是不同的。比如java的運行時環境就要求文件系統里存在jdk,而golang的運行時環境則需要有go相關的底層庫。在docker上既可以虛擬出一個java的運行時環境,也可以虛擬出go的運行時環境。甚至, 基於docker,你既可以虛擬出一個java-1.6的運行時候環境,也可以虛擬出一個java-1.8的運行時環境,而這兩個運行時環境可以同時運行在同一個操作系統之上 。
很高興為您解答。
Docker悄無聲息的來到我們身邊,正在改變我們的開發、測試、部署應用的方式,那麼,到底Docker和虛擬機VM有什麼區別,我們通過一個圖,再配上簡明扼要的文字就很容易理解兩者之間的區別。
首先要明確:Docker是一個開源的應用容器引擎,而VM是一個完整的操作系統。
1、使用VM運行多個相互隔離的應用
解釋:
可以看到,APP #1、APP #2、APP #3如果要獨立運行,相互隔離,則需要安裝三個操作系統。如果一個虛擬操作系統按1G算,總共需要佔3G的存儲空間,更槽糕的是,光運行這三個操作系統就要耗費很大的內存和CPU。
2、使用Docker運行多個相互隔離的應用
DOCKER DAEMON:Docker守護進程,負責管理Docker容器。
Docker運行在主操作系統之上,APP #1、APP #2、APP #3在Docker中是完全隔離的、相經獨立的容器。跟VM相比,省去了龐大的操作系統,耗費硬體資源較少。
除了以上架構上的差異之外,VM和Docker在啟動時間上也有著很大的差距,VM啟動大概需要2分鍾的時間,而Docker啟動則只需2秒。
隨著互聯網的發展,Docker的應用會越來越廣,Build once,run anywhere,一次構建,到處運行。
docker是虛擬化軟體運行環境。
虛擬機是虛擬化硬體。
層次不同。
虛擬機更消耗資源。但帶來的是一個完整的可以不同於宿主機的操作系統。因為和宿主機操作系統不共享任何東西(包括硬體,內核,動態庫,環境變數等),它的隔離性更好。
docker更輕量級,共享使用宿主機的硬體和內核,資源佔用更少。它在宿主機內核基礎上虛擬化了一個不同於宿主機的軟體運行環境,比如動態庫,環境變數等。可以說,docker和宿主機之間除了內核共享,其它都可以不同。
Docker容器啟動、停止速度快rr Docker容器對資源需求較少rr Docker操作簡單rr Dockerfile自動構建和部署方便
『貳』 一台物理機可以運行多少docer容器
如果docker跑的是python進程,單進程可以跑滿單核(受限於GIL),其實看進程列表就知道不同於vagrant,docker的進程本身是融匯在系統進程裡面的。