聊聊Docker

爲何是Docker

進入21世紀,繼互聯網以後,雲計算開始大放異彩。雲計算是互聯網發展後期的必然方向,反過來,雲計算也進一步推進了互聯網的發展。雲計算模式最關鍵的突破就是資源使用方式的改變。html

雲計算是一種融合了多項計算機技術的、以數據和處理能力爲中心的密集型計算模式,它的主要技術包括虛擬化、分佈式資源管理、分佈式併發編程模式、信息安全等。其中,虛擬化做爲雲計算的核心元素,其價值日益體現:一方面,集中部署 IT 資源並抽象化以實現多用戶共享,極大程度地提升了資源的利用率,下降了使用成本;另外一方面,緩解了複雜的軟硬件適配問題。因此, 虛擬化技術是雲計算中最關鍵、最核心的技術原動力。docker

在早期,主流的虛擬化技術是虛擬機,它實現了極高的隔離度和標準化, 可是這種基於硬件隔離的虛擬化方案也給宿主機資源帶來了極大的壓力。編程

爲了解決虛擬機的種種問題,得到比虛擬機更快、更少資源的虛擬化方法, 就須要對資源進行比虛擬機更高級別的抽象。經過更細的粒度對資源進行分配和控制,是一種可行的思路。爲此,Linux內核添加了新的技術,這即是衆所周知的控制組(cgroup) 。經過這一技術來對服務進行運行時隔離,這種被隔離起來的運行時環境,被稱爲Linux容器(LXC)。安全

Docker是基於LXC容器技術的封裝,Go語言開發實現。Docker與虛擬機的詳細對比,可參見阮一峯老師的《Docker入門教程》,這裏再也不贅述。網絡

在Docker生態環境的不斷完善下,Docker技術的最佳實踐場景也愈來愈多,除了基礎雲服務平臺,在CaaS、CI、CD、DevOps、微服務架構等方面也吸引了愈來愈多的目光。架構

Docker是什麼

Docker做爲一種輕量級虛擬化技術,其本質是一個進程以及運行該進程所須要的依賴,而Docker內的全部進程是這個容器進程的子進程。在這種虛擬化模型下,經過資源隔離、資源控制等技術手段,來解決Docker在實現虛擬化目標過程當中遇到的種種障礙。併發

Docker容器間的資源隔離,經過Linux內核的 namespace實現。這裏的資源包括:網絡空間(net)、文件系統空間(mnt)、用戶空間(user)、進程空間(pid)、進程通訊空間(ipc)和域名空間(uts)。這些空間的隔離需求都是虛擬化的基本需求,都很好理解,這裏只簡單講一下域名空間。經過域名空間的隔離,每一個Docker就能夠擁有獨立的主機名和域名,在網絡上能夠被視做一個獨立的節點,而再也不是宿主機上的一個進程。app

對 Docker 而言, 一方面要實現各容器的良好隔離, 另外一方面還須要對容器使用的資源進行限制和管理。運維

Docker 依靠 Linux 提供的 cgroup 技術來實現資源控制。cgroup 是由 Linux內核提供的一種對各進程組所使用的物理資源( 包括CPU、Memory、IO等) 進行記錄、限制和隔離的技術。cgroup的實現本質上是給任務掛上鉤子,當任務運行的過程當中使用某種資源時,就會觸發鉤子上鎖附帶的子系統進行檢測,根據資源類別的不一樣,使用對應的技術進行資源限制和優先級分配。分佈式

換個角度看,Docker也是一個執行環境,一個與宿主機共享內核但與系統中其餘進程資源相隔離的執行環境,這就是Docker容器。

從上圖官網給出Docker架構圖能夠看出,這個執行環境須要提供這幾個基本要素:

  • Docker client:Docker客戶端;
  • Docker deamon:Docker服務端,處理用戶(Docker client)請求;
  • Docker Registry:Docker鏡像倉庫。

Docker 中有兩個重要概念, 一個是鏡像( Image) , 另外一個是容器( Container)。能夠這麼理解,鏡像是容器的靜態表現形式或通用的存儲文件,而容器是鏡像的運行態表現形態或部署環境上的文件。

之因此抽象出鏡像這個概念,是爲了解決LXC容器的可移植性問題,即沒法經過標準化的鏡像/模板實現虛擬容器的制、複製、重建。 於是 Docker 在 LXC 基礎上進行了進一步封裝,經過文件系統存儲技術(如aufs、device mapper、overlayfs)實現鏡像的分層、寫時複製、聯合掛載、內容尋找等關鍵技術特性,很好地解決了容器的快速移動和更新問題。

這裏特別提一下爲何把分層做爲鏡像的重要特性。鏡像中大部分文件都是相同的(如rootfs等),若是不分層,勢必存在衆多的文件冗餘,形成鏡像大小沉重。經過分層技術,實如今不一樣鏡像之間共享鏡像層,實現輕量級別的鏡像配置,提升Docker鏡像構建、存儲和分發的效率,節省了用戶的時間和存儲空間。

回到最開始的問題:Docker是什麼?這取決於看它的視角。從操做系統的視角來看,它是進程;從用戶的角度來看,它是運行環境;從開發的角度來看,它是虛擬化技術。

Docker雲是什麼

Docker做爲雲計算虛擬化的一環,打開了雲計算的大門。進入雲計算的大門後,發現門後的新的生態系統是如此龐大。在分佈式的生產使用中,容器相關的網絡、存儲、集羣、高可用性等都是不得不面對的問題。從容器到容器雲的進化應運而生。

容器雲以容器爲資源分割和調度的基本單位,封裝整個軟件運行時環境,爲開發者和系統管理員提供用於構建、發佈和運行分佈式應用的平臺。

Docker只是個單機下的容器管理工具,經過命令行進行手動管理。在企業使用場景中,容器有了跨主機(即分佈式)的使用需求,並且可能容器數量龐大,拓撲關係複雜。手動操做方式的低效和不可移植性是個嚴重的應用障礙。Docker容器的編排和部署工具在這種背景下應運而生,Fig/Compose,Machine,Swarm,Fleet,Kubernetes都屬於此類。

編排即依賴關係管理,部署則是在目標機器上按依賴關係進行動做。經過編排和部署工具,能夠在一個新的環境上快速重現容器的配置和集羣。

  • Compose側重於單機環境的Docker的編排部署,管理對象的基本單位是容器;
  • Machine側重於跨宿主機環境的部署管理,管理對象的基本單位是宿主機;
  • Swarm側重於集羣環境的部署管理,管理對象的基本單位是具備相同標籤屬性的多臺宿主機的集羣;
  • Fleet側重於集羣環境的編排部署,管理對象的基本單位是服務(全局服務單元);
  • Kubernetes除了支持集羣環境的編排、部署,還支持副本管理、調度管理、存儲管理、網絡管理、多租戶管理等特性,管理對象的基本單位是容器組(pod);

可見它們對管理對象的抽象層次愈來愈高,對Docker雲的運維能力也是愈來愈強。

(完)

相關文章
相關標籤/搜索