在云計算中,所謂的虛擬化技術一般可以分為虛擬機技術和容器技術,虛擬機即為Virtual Machine,VM,容器即為Container。那么什么是Docker 虛擬化技術呢?我們一起來看一下:
Docker是一種輕量級的虛擬化技術,相較于傳統虛擬機,Docker容器是在操作系統層面上實現虛擬化,直接復用本地主機的操作系統,而傳統方式則是在硬件的基礎上,虛擬出自己的系統,再在系統上部署相關的APP應用。同時是一個開源的應用容器運行環境搭建平臺,可以讓開發者以便捷方式打包應用到一個可移植的容器中,然后安裝至任何運行Linux或Windows等系統的服務器上。
相較于傳統虛擬機,Docker容器具有以下三大特點:
1、輕量化:
一臺主機上運行的多個Docker容器可以共享主機操作系統內核;啟動迅速,只需占用很少的計算和內存資源。
2、標準開放:
Docker容器基于開放式標準,能夠在所有主流Linux版本、Microsoft Windows以及包括VM、裸機服務器和云在內的任何基礎設施上運行。
3、安全可靠:
Docker賦予應用的隔離性不僅限于彼此隔離,還獨立于底層的基礎設施。Docker默認提供最強的隔離,因此應用出現問題,也只是單個容器的問題,而不會波及到整臺主機。
讓我們通過回顧部署方式的過程,看看為什么容器如此有用。
一、應用部署方式經歷的各個階段
1. 傳統部署階段
早期,我們在物理服務器上運行應用程序。沒有辦法為物理服務器中的應用程序定義資源邊界,這導致了資源分配問題。例如,如果在物理服務器上運行多個應用程序,則可能會出現一個應用程序占用大部分資源的情況,從而導致其他應用程序性能不佳。解決方案是在不同的物理服務器上運行每個應用程序。但由于資源未得到充分利用,這種方法無法擴展,而且組織維護許多物理服務器的成本很高。
傳統模式部署最大的問題是造成資源浪費。
2. 虛擬化部署階段
在虛擬化技術被引入后,虛擬化技術允許我們在單個物理服務器的 CPU 上運行多個虛擬機(VM)。虛擬化允許應用程序在虛擬機之間隔離,不僅避免了資源沖突而且還能提供一定程度的安全性,因為一個應用程序的信息不能被另一個應用程序自由訪問。
虛擬化允許我們更好地利用物理服務器中的資源,有更好的可伸縮性,因為可以輕松地添加或更新應用程序,降低硬件成本等等。通過虛擬化技術,我們可以將一組物理資源表示為一次性虛擬機的集群。
每個VM都是在虛擬化硬件之上運行所有組件(包括自己的操作系統)的完整機器。
3、容器化部署階段
容器類似于 VM,但它們具有松散的隔離屬性,以便在應用程序之間共享操作系統。容器的本質是進程(使用了 NameSpace 做隔離,Cgroups 做限制, rootfs 做文件系統的特殊進程),因此,容器被認為是比 VM 更加輕量級的。與虛擬機類似,容器有自己的文件系統、CPU共享、內存、進程空間等。由于它們與底層基礎設施分離,所以它們可以跨云和操作系統版本移植。
容器技術可以達到企業脫離云廠商的強制綁(綁)定(架)。
二、容器的作用有哪些?解決了現實中的哪些問題
廣泛對容器歸納總結為:
1、容器是一種基于操作系統能力的隔離技術。
2、容器的本質是一組收到資源限制,彼此之間相互隔離的過程。
容器共享宿主機的內核,資源占用小,輕量化,對應用有好。
3、Docker 是目前主流的容器化工具,Kubernetes(k8s) 是主流的容器編排管理工具。
4、Docker 是基于Linux 內核的2項功能實現的:
Namespace:
我們知道 Linux 中的PID、IPC、網絡等資源是全局的,而 Namespace 機制是一種資源隔離方案,在該機制下這些資源就不再是全局的了,而是屬于某個特定的 NameSpace,各個 Namespace 下的資源互不干擾,這就使得每個 Namespace 看上去就像一個獨立的操作系統一樣,但是只有 Namespace 是不夠。
Control groups:
雖然有了 NameSpace 技術可以實現資源隔離,但進程還是可以不受控的訪問系統資源,比如 CPU、內存、磁盤、網絡等,為了控制容器中進程對資源的訪問,Docker 采用 control groups 技術(也就是cgroup),有了 cgroup 就可以控制容器中進程對系統資源的消耗了,比如你可以限制某個容器使用內存的上限、可以在哪些 CPU 上運行等等。
容器解決了什么問題:
其實通過開始 應用部署方式的變革歷程 講解的內容就可以歸納總結容器主要解決的問題(也是其好處):
1、解決了上線流程繁瑣問題
2、解決了資源利用率低問題
3、解決了擴容 / 縮容 不及時問題
4、解決了服務器環境臃腫問題
5、解決了環境不一致問題
三、虛擬機和容器的區別
虛擬機
虛擬機(VM)最恰當的描述是效仿物理硬件或計算系統功能的軟件程序。它運行在名為管理程序的仿真軟件之上,通過軟件環境復制底層物理硬件資源的功能。這些資源可以稱為東家機(host machine),而在管理程序上運行的虛擬機通常稱為賓客機(guest machine)。
容器
容器化在操作系統級別創建抽象概念,以便應用程序的單個模塊化功能可用獨立運行。因此,幾個孤立的工作負載 — 容器 — 可以使用相同的物理資源動態運行。容器不太嚴格的技術定義可以是:一個軟件單元,雖然是輕量級的,但仍可將代碼、其依賴項和配置完全捆綁到一個映像中。
Namespaces是 Linux 中的一個高級概念,每個 Namespaces 都有自己的獨立資源,而不需要底層硬件的實際分區。Namespaces 用于虛擬化底層操作系統。
總結
虛擬機:
提升服務器資源利用率
提供一個完全隔離的環境(OS級別)
容器:
容器提供一個基本的獨立環境,實現容器隔離、資源限制。
容器主要解決應用層面的問題,達到應用快速部署、高效管理。
個人感覺我們不應該單純的進行虛擬機和容器來對比,因為從我們上述的總結與對比中可以發現:
他們的側重目的點和作用不同,之所以被大家拿出來對比,因為他們都是虛擬化的手段。
其實在云平臺中,我覺得下面這個圖(圖片由bluetata原創轉載請注明出處)更能體現 虛擬機和 容器的關系,他們是相輔相成相互合作的,有著不同的分工:
如果要真拿虛擬機和容器進行對比的話,總結起來的對比表格可以參照如下:
Docker 是一個開源項目,誕生于 2013 年初,最初是 dotCloud 公司內部的一個業余項目。它基于 Google 公司推出的 Go 語言實現。項目后來加入了 Linux 基金會,遵從了 Apache 2.0 協議,項目代碼在 GitHub 上進行維護。
Docker項目只是容器技術的其中一種實現,因為它是管理容器的最流行的工具,所以成為了容器技術的代名詞,其他著名的容器工具還包括:rkt、Podman、LXC、containerd、Buildah 等。
Docker 使用客戶端-服務器 (C/S) 架構模式,也就是分為客戶端(Client)和服務端(Server)。
Docker 主要的架構組成如下:
1. Docker Client 客戶端
Docker Client 通過命令行或者其他工具使用 Docker API/SDK與 Docker daemon 通信。例如:當使用docker run 命令時,Docker Client 將其發送到 dockerd 來實現相應的功能。
總結起來 Docker Client 客戶端的一些特征
Docker Client 可以與多個 Docker daemon 進行交互。
Docker Client 客戶端通過命令行或者其他工具使用 Docker API。
Docker Client 客戶端和服務器通過 Socket 或 RESTful API 進行通信。
Docker Client 客戶端可以連接本地或者遠程的守護進程。
2. Docker Host 主機
一個物理或者虛擬的機器用于執行 Docker 守護進程和容器。
3. Docker Daemon 守護進程
Docker daemon (dockerd) 監聽 Docker API 請求并管理 Docker 對象,如鏡像、容器、網絡和卷。
例如:接收并處理 docker client 發送的請求。daemon 在后臺啟動一個server,server 負責接受docker client 發送的請求;接受請求后,server 通過路由與分發調度,找到相應的 handler 來執行請求。
4. Docker Container 容器
類似于一個輕量級的沙盒,可以將其看作一個極簡的 Linux 系統環境(包括 root 權限、進程空間、用戶空間和網絡空間等)。基于 Docker 鏡像被創建,鏡像是靜態的定義,容器是鏡像運行時的實體;容器可以被創建、啟動、停止、刪除、暫停等。容器是獨立運行的一個或一組應用。
5. Docker Images 鏡像
Docker鏡像里包含了打包的應用程序及其所依賴的環境、可用的文件系統和其他元數據。Docker 鏡像是用于創建 Docker 容器的模板。
6. Docker Registry 倉庫
倉庫用來存儲 Docker 鏡像,分為公有倉庫和私有倉庫??梢陨蟼麋R像到一個鏡像倉庫,然后下載到另外一臺電腦上并運行它。
Docker Hub 是一個 Docker 官方維護的公共倉庫,Docker 默認從 Docker Hub 來查找鏡像。我們也可以維護自己私有的鏡像托管服務。
使用docker pull或docker run命令時,所需的圖像將從配置的倉庫中提取。使用該docker push命令時,會將鏡像推送到配置的倉庫中。
(1)作為云主機使用
相比虛擬機來說,容器使用的是一系列非常輕量級的虛擬化技術,使得其啟動、部署、升級跟管理進程一樣迅速,用起來靈活又感覺跟虛擬機一樣沒什么區別,所以有些人直接使用 Docker 的 Ubuntu 等鏡像創建容器,當作輕量的虛擬機來使用。
(2)作為服務使用
如果你僅僅把 Docker 容器當作一個輕量的固定虛擬機用,那其實只能算是另類用法,Docker 容器最重要價值在于提供一整套平臺無關的標準化技術,簡化服務的部署、升級、維護,只要把需要運維的各種服務打包成標準的集裝箱,就可以在任何能運行 Docker 的環境下跑起來,達到開箱即用的效果,這個特點才是 Docker 容器風靡全球的根本原因。
Web應用服務
持續集成和持續部署
(3)微服務架構使用
如果說上面兩種應用場景還不足以體現出與傳統的 PaaS 平臺相比的巨大優勢的話,那么對微服務的架構這種復雜又靈活的使用場景的無縫支持絕對具有革命意義。
微服務架構將傳統分布式服務繼續拆分解耦,形成一些更小服務模塊,服務模塊之間獨立部署升級,這些特性與容器的輕量、高效部署不謀而合。
四、企業如何實施容器
企業不必羞于向工具池中添加容器。想要利用它?以下是開始利用容器的一些方法:
1、洞悉您的當前環境。分析您的應用,核查最適合它們的環境。您是重構現有應用還是構建全新應用?如果您對重構感興趣,請從無需與其他應用交互便可運行的獨立應用入手。
2、培養推廣者。貴組織中的某個人(或很多人)可能都對容器化策略有自己的一兩個想法。與他們交談,向他們學習,并考慮讓他們成為這項活動的推廣者。
3、指定一個項目。確定一個起步的小項目,指定項目組,并設立大致的項目目標。評估沿途的變化。
4、鼓勵參加培訓。學好新技術需要一定的時間??紤]參加相關課程培訓,或者至少給開發者留出專門的學習時間。
如果企業希望借助DevOps來加速連續發布基于微服務的分布式應用功能,則會繼續加大容器化投資,尤其是在無法依靠虛擬化實現該等目標的領域。
點擊了解相關課程——虛擬化容器技術Docker+K8s