溫故:
在上一篇文章里面我和大家分享了什么是docker?簡單的介紹了docker的概念,就是帶大家認識了一下到底docker是干什么的?再學新的知識之前我們先回顧一下:
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的Linux機器或Windows 機器上,也可以實作虛擬化,容器是完全使用沙箱機制,相互之間不會有任何介面,一個完整的Docker有以下幾個部分組成:1.DockerClient客戶端 2.Docker Daemon守護行程 3.Docker Image鏡像 4.DockerContainer容器,
Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和創建Docker容器,Docker 容器通過 Docker 鏡像來創建,容器與鏡像的關系類似于面向物件編程中的物件與類,
Docker并非適合所有應用場景,Docker只能虛擬基于Linux的服務,Windows Azure 服務能夠運行Docker實體,但到目前為止Windows服務還不能被虛擬化,
| Docker 鏡像(Images) | Docker 鏡像是用于創建 Docker 容器的模板,比如 Ubuntu 系統, |
| Docker 容器(Container) | 容器是獨立運行的一個或一組應用,是鏡像運行時的物體, |
| Docker 客戶端(Client) | Docker 客戶端通過命令列或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 與 Docker 的守護行程通信, |
| Docker 主機(Host) | 一個物理或者虛擬的機器用于執行 Docker 守護行程和容器, |
| Docker Registry | Docker 倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫, Docker Hub(https://hub.docker.com) 提供了龐大的鏡像集合供使用, 一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多個標簽(Tag);每個標簽對應一個鏡像, 通常,一個倉庫會包含同一個軟體不同版本的鏡像,而標簽就常用于對應該軟體的各個版本,我們可以通過 <倉庫名>:<標簽> 的格式來指定具體是這個軟體哪個版本的鏡像,如果不給出標簽,將以 latest 作為默認標簽, |
| Docker Machine | Docker Machine是一個簡化Docker安裝的命令列工具,通過一個簡單的命令列即可在相應的平臺上安裝Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure, |
上一篇關于docker的鏈接如下:我和Docker的初相識
知新:
一、Docker解決的問題
云計算、大資料,移動技術的快速發展,加之企業業務需求的不斷變化,導致企業架構要隨時更改以適合業務需求,跟上技術更新的步伐,毫無疑問,這些重擔都將壓在企業開發人員身上;團隊之間如何高效協調,快速交付產品,快速部署應用,以及滿足企業業務需求,是開發人員亟需解決的問題,Docker技術恰好可以幫助開發人員解決這些問題,
為了解決開發人員和運維人員之間的協作關系,加快應用交付速度,越來越多的企業引入了DevOps這一概念,但是,傳統的開發程序中,開發、測驗、運維是三個獨立運作的團隊,團隊之間溝通不暢,開發運維之間沖突時有發生,導致協作效率低下,產品交付延遲, 影響了企業的業務運行,Docker技術將應用以集裝箱的方式打包交付,使應用在不同的團隊中共享,通過鏡像的方式應用可以部署于任何環境中,這樣避免了各團隊之間的協作問題的出現,成為企業實作DevOps目標的重要工具,以容器方式交付的Docker技術支持不斷地開發迭代,大大提升了產品開發和交付速度,
此外,與通過Hypervisor把底層設備虛擬化的虛擬機不同,Docker直接移植于Linux內核之上,通過運行Linux行程將底層設備虛擬隔離,這樣系統性能的損耗也要比虛擬機低的多,幾乎可以忽略,同時,Docker應用容器的啟停非常高效,可以支持大規模的分布系統的水平擴展,真正給企業開發帶來福音,
正如中國惠普云計算集成云技術首席專家劉艷凱所說的那樣:“任何一項技術的發展和它受到的追捧,都是因為它能夠解決困擾人們的問題,”Docker正是這樣的一種技術,Docker的解決問題能力雖然很強,但在企業中的實際應用卻并不多,那么是什么問題阻礙了Docker在企業中的實踐?
雖然Docker技術發展很快,但技識訓不夠成熟,對存盤的靈活的支持、網路的開銷和兼容性方面還存在限制,這是Docker沒有被企業大范圍使用的一個主要原因,另外一個原因是企業文化是否與DevOps運動一致,只有企業支持DevOps,才能更大地發揮Docker的價值,最后一個原因就是安全性問題,Docker對于Linux這一層的安全的隔離還有待改進,才能進一步得到企業的認可,
二、應用實體
還有就是前面把docker說的這么厲害,那么它都能干什么呢?有沒有具體的實體呢?有!!!在docker的網站上提到了docker的典型場景:
-
Automating the packaging and deployment of applications(使應用的打包與部署自動化)
-
Creation of lightweight, private PAAS environments(創建輕量、私密的PAAS環境)
-
Automated testing and continuous integration/deployment(實作自動化測驗和持續的集成/部署)
-
Deploying and scaling web apps, databases and backend services(部署與擴展webapp、資料庫和后臺服務)
舉個“栗子”
Sandbox
作為sandbox大概是container的最基本想法了 - 輕量級的隔離機制, 快速重建和銷毀, 占用資源少,用docker在開發者的單機環境下模擬分布式軟體部署和除錯,可謂又快又好,
同時docker提供的版本控制和image機制以及遠程image管理,可以構建類似git的分布式開發環境,可以看到用于構建多平臺image的packer以及同一作者的vagrant已經在這方面有所嘗試了,筆者會后續的blog中介紹這兩款來自同一geek的精致小巧的工具,
Docker已經不僅僅是DevOps人員手中的神器了,每一個開發者都應該學會如何使用Docker,
PaaS
dotcloud、heroku以及cloudfoundry都試圖通過container來隔離提供給用戶的runtime和service,只不過dotcloud采用docker,heroku采用LXC,cloudfoundry采用自己開發的基于cgroup的warden,基于輕量級的隔離機制提供給用戶PaaS服務是比較常見的做法 - PaaS 提供給用戶的并不是OS而是runtime+service,因此OS級別的隔離機制向用戶屏蔽的細節已經足夠,而docker的很多分析文章提到『能夠運行任何應用的“PaaS”云』只是從image的角度說明docker可以從通過構建 image實作用戶app的打包以及標準服務service image的復用,而非常見的buildpack的方式,
由于對Cloud Foundry和docker的了解,接下來談談筆者對PaaS的認識,PaaS號稱的platform一直以來都被當做一組多語言的runtime和一組常用的middleware,提供這兩樣東西
即可被認為是一個滿足需求的PaaS,然而PaaS對能部署在其上的應用要求很高:
-
運行環境要簡單 - buildpack雖然用于解決類似問題,但仍然不是很理想
-
要盡可能的使用service - 常用的mysql, apache倒能理解,但是類似log之類的如果也要用service就讓用戶接入PaaS平臺,讓用戶難以維護
-
要盡可能的使用"平臺” - 單機環境構建出目標PaaS上運行的實際環境比較困難,開發測驗作業都離不開"平臺”
-
缺少可定制性 - 可選的中間件有限,難于調優和debug,
綜上所述部署在PaaS上的應用幾乎不具有從老平臺遷移到之上的可能,新應用也難以進入引數調優這種深入的作業,個人理解還是適合快速原型的展現,和短期應用的嘗試,
然而docker確實從另一個角度(類似IaaS+orchestration tools)實作了用戶運行環境的控制和管理,然而又基于輕量級的LXC機制,確實是一個了不起的嘗試,
筆者也認為IaaS + 靈活的orchestration tools(深入到app層面的管理 如bosh)是交付用戶環境最好的方式,
國內也已經開始出現基于Docker的PaaS,2015年3月11日,云雀Alauda云平臺正式開啟內測,對外提供基于Docker的PaaS服務,
拓展
之前在上一篇文章中提到了一個名詞“cgroup”,cgroups 實作了對資源的配額和度量, cgroups 的使用非常簡單,提供類似檔案的介面,在 /cgroup目錄下新建一個檔案夾即可新建一個group,在此檔案夾中新建task檔案,并將pid寫入該檔案,即可實作對該行程的資源控制,具體的資源配置選項可以在該檔案夾中新建子 subsystem ,{子系統前綴}.{資源項} 是典型的配置方法,如memory.usage_in_bytes 就定義了該group 在subsystem memory中的一個記憶體限制選項,另外,cgroups中的 subsystem可以隨意組合,一個subsystem可以在不同的group中,也可以一個group包含多個subsystem - 也就是說一個 subsystem,
因為之前沒有介紹它是如何實作對資源的配置的,我這里補充一下:
cpu : 在cgroup中,并不能像硬體虛擬化方案一樣能夠定義CPU能力,但是能夠定義CPU輪轉的優先級,因此具有較高CPU優先級的行程會更可能得到CPU運算,
通過將引數寫入cpu.shares,即可定義改cgroup的CPU優先級 - 這里是一個相對權重,而非絕對值,當然在cpu這個subsystem中還有其他可配置項,手冊中有詳細說明,
cpusets : cpusets 定義了有幾個CPU可以被這個group使用,或者哪幾個CPU可以供這個group使用,在某些場景下,單CPU系結可以防止多核間快取切換,從而提高效率
memory : 記憶體相關的限制
blkio : block IO相關的統計和限制,byte/operation統計和限制(IOPS等),讀寫速度限制等,但是這里主要統計的都是同步IO
net_cls, cpuacct , devices , freezer 等其他可管理項,
局限性
Docker在本質上是一個附加系統,使用檔案系統的不同層構建一個應用是有可能的,每個組件被添加到之前已經創建的組件之上,可以比作為一個檔案系統更明智,分層架構帶來另一方面的效率提升,當你重建存在變化的Docker鏡像時,不需要重建整個Docker鏡像,只需要重建變化的部分,
可能更為重要的是,Docker旨在用于彈性計算,每個Docker實體的運營生命周期有限,實體數量根據需求增減,在一個管理適度的系統中,這些實體生而平等,不再需要時便各自消亡了,
針對Docker環境存在的不足,意味著在開始部署Docker前需要考慮如下幾個問題,首先,Docker實體是無狀態的,這意味著它們不應該承載任何交易資料,所有資料應該保存在資料庫服務器中,
其次,開發Docker實體并不像創建一臺虛擬機、添加應用然后克隆那樣簡單,為成功創建并使用Docker基礎設施,管理員需要對系統管理的各個方面有一個全面的理解,包括Linux管理、編排及配置工具比如Puppet、Chef以及Salt,這些工具生來就基于命令列以及腳本,
今天關于docker暫時就講到這里,客堆疊歇業一天!
小二,關門 上閘板,睡覺
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/271301.html
標籤:其他
