一、什么是 Docker、鏡像、編排
Docker是一種容器技術(shù),允許開發(fā)人員將應(yīng)用程序與相關(guān)的依賴關(guān)系打包在一起以形成可移植的鏡像,并通過容器來部署這些鏡像。
鏡像是一個(gè)只讀的模板,用于創(chuàng)建Docker 容器。鏡像是由操作系統(tǒng)、應(yīng)用程序和其他相關(guān)依賴項(xiàng)打包而成,在Docker中使用多層文件系統(tǒng)來存儲(chǔ),并且鏡像之間可以通過共享層文件來提高效率。Docker鏡像是由一系列的層組成的,每一層都是對(duì)上一層的增量修改。每一層都有一個(gè)少數(shù)的ID,可以通過加密哈希算法或者隨機(jī)數(shù)生成。docker鏡像的所有層都是只讀的,不能被修改,只能通過創(chuàng)建新的層來改變。Docker容器是基于Docker鏡像運(yùn)行的實(shí)例,它在鏡像的最上面添加了一個(gè)可讀寫的容器層。容器層保存了容器運(yùn)行時(shí)的所有數(shù)據(jù)變化,如新建文件,修改文件等。刪除容器后,容器層也會(huì)被刪除,而基礎(chǔ)鏡像則保持不變。Docker使用了棧式層管理和寫時(shí)復(fù)制的技術(shù)來實(shí)現(xiàn)鏡像和容器的存儲(chǔ)。棧式層管理是指每一層都是從下往上,以棧的方式組合在一起,組成鏡像或者容器的根文件系統(tǒng)。寫時(shí)復(fù)制是指當(dāng)需要修改某一層的數(shù)據(jù)時(shí),不直接修改原始數(shù)據(jù),而是將修改后的數(shù)據(jù)保存在一個(gè)新的層中。這樣可以提高效率和安全性,也可以實(shí)現(xiàn)鏡像層之間的共享。
編排是 Docker 容器中的一個(gè)重要概念,它是一種將多個(gè)容器組織在一起以形成分布式應(yīng)用程序的技術(shù)。在 Docker 中,編排描述了容器如何協(xié)同工作以支持應(yīng)用程序。例如,可以通過 Docker Compose 工具來定義和運(yùn)行多個(gè)容器,使它們能夠相互通信以實(shí)現(xiàn)應(yīng)用程序的功能。Docker編排通常包括以下方面:
容器編排:為多個(gè)容器指定數(shù)量、配置和啟動(dòng)順序,并保證它們之間的關(guān)系。網(wǎng)絡(luò)編排:將容器組建成一個(gè)網(wǎng)絡(luò),并配置容器之間的通信策略。存儲(chǔ)編排:為容器配置卷(volume)或者本地主機(jī)的文件目錄,并關(guān)聯(lián)到不同的容器中。二、Docker詳細(xì)介紹
1、簡(jiǎn)介
Docker 是一個(gè)開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的Linux或Windows操作系統(tǒng)的機(jī)器上,也可以實(shí)現(xiàn)虛擬化,容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口。一個(gè)完整的Docker有以下幾個(gè)部分組成:
DockerClient客戶端Docker Daemon守護(hù)進(jìn)程Docker Image鏡像DockerContainer容器2、起源
Docker 是?PaaS?提供商 dotCloud 開源的一個(gè)基于?LXC?的高級(jí)容器引擎,源代碼托管在?Github?上,基于go語言并遵從Apache2.0協(xié)議開源。
Docker自2013年以來非常火熱,無論是從 github 上的代碼活躍度,還是Redhat在RHEL6.5中集成對(duì)Docker的支持,就連?Google?的 Compute Engine 也支持 docker 在其之上運(yùn)行。
一款開源軟件能否在商業(yè)上成功,很大程度上依賴三件事——成功的 user case(用例),活躍的社區(qū)和一個(gè)好故事。 dotCloud 之家的 PaaS 產(chǎn)品建立在docker之上,長(zhǎng)期維護(hù)且有大量的用戶,社區(qū)也十分活躍,接下看看docker的故事。
環(huán)境管理復(fù)雜:從各種OS到各種中間件到各種app,一款產(chǎn)品能夠成功作為開發(fā)者需要關(guān)心的東西太多,且難于管理,這個(gè)問題幾乎在所有現(xiàn)代IT相關(guān)行業(yè)都需要面對(duì)。云計(jì)算時(shí)代的到來:AWS的成功,引導(dǎo)開發(fā)者將應(yīng)用轉(zhuǎn)移到 cloud 上,解決了硬件管理的問題,然而中間件相關(guān)的問題依然存在(所以openstack HEAT和 AWS cloudformation 都著力解決這個(gè)問題)。開發(fā)者思路變化提供了可能性。虛擬化手段的變化:cloud 時(shí)代采用標(biāo)配硬件來降低成本,采用虛擬化手段來滿足用戶按需使用的需求以及保證可用性和隔離性。然而無論是KVM還是Xen在 docker 看來,都在浪費(fèi)資源,因?yàn)橛脩粜枰氖歉咝н\(yùn)行環(huán)境而非OS,GuestOS既浪費(fèi)資源又難于管理,更加輕量級(jí)的LXC更加靈活和快速。LXC的移動(dòng)性:LXC在 linux 2.6 的 kernel 里就已經(jīng)存在了,但是其設(shè)計(jì)之初并非為云計(jì)算考慮的,缺少標(biāo)準(zhǔn)化的描述手段和容器的可遷移性,決定其構(gòu)建出的環(huán)境難于遷移和標(biāo)準(zhǔn)化管理(相對(duì)于KVM之類image和snapshot的概念)。docker 就在這個(gè)問題上做出實(shí)質(zhì)性的革新。這是docker最獨(dú)特的地方。面對(duì)上述幾個(gè)問題,docker設(shè)想是交付運(yùn)行環(huán)境如同海運(yùn),OS如同一個(gè)貨輪,每一個(gè)在OS基礎(chǔ)上的軟件都如同一個(gè)集裝箱,用戶可以通過標(biāo)準(zhǔn)化手段自由組裝運(yùn)行環(huán)境,同時(shí)集裝箱的內(nèi)容可以由用戶自定義,也可以由專業(yè)人員制造。這樣,交付一個(gè)軟件,就是一系列標(biāo)準(zhǔn)化組件的集合的交付,如同樂高積木,用戶只需要選擇合適的積木組合,并且在最頂端署上自己的名字(最后一個(gè)標(biāo)準(zhǔn)化組件是用戶的app)。這也就是基于docker的PaaS產(chǎn)品的原型。
3、特性
在docker的網(wǎng)站上提到了docker的典型場(chǎng)景:
Automating the packaging and deployment of applications(使應(yīng)用的打包與部署自動(dòng)化)Creation of lightweight, private PAAS environments(創(chuàng)建輕量、私密的PAAS環(huán)境)Automated testing and continuous integration/deployment(實(shí)現(xiàn)自動(dòng)化測(cè)試和持續(xù)的集成/部署)Deploying and scaling web apps, databases and backend services(部署與擴(kuò)展webapp、數(shù)據(jù)庫和后臺(tái)服務(wù))由于其基于LXC的輕量級(jí)虛擬化的特點(diǎn),docker相比KVM之類最明顯的特點(diǎn)就是啟動(dòng)快,資源占用小。因此對(duì)于構(gòu)建隔離的標(biāo)準(zhǔn)化的運(yùn)行環(huán)境,輕量級(jí)的PaaS(如dokku),構(gòu)建自動(dòng)化測(cè)試和持續(xù)集成環(huán)境,以及一切可以橫向擴(kuò)展的應(yīng)用(尤其是需要快速啟停來應(yīng)對(duì)峰谷的web應(yīng)用)。
構(gòu)建標(biāo)準(zhǔn)化的運(yùn)行環(huán)境,現(xiàn)有的方案大多是在一個(gè)baseOS上運(yùn)行一套puppet/chef,或者一個(gè)image文件,其缺點(diǎn)是前者需要base OS許多前提條件,后者幾乎不可以修改(因?yàn)閏opy on write 的文件格式在運(yùn)行時(shí)rootfs是read only的)。并且后者文件體積大,環(huán)境管理和版本控制本身也是一個(gè)問題PaaS環(huán)境是不言而喻的,其設(shè)計(jì)之初和dotcloud的案例都是將其作為PaaS產(chǎn)品的環(huán)境基礎(chǔ)因?yàn)槠錁?biāo)準(zhǔn)化構(gòu)建方法(buildfile)和良好的REST API,自動(dòng)化測(cè)試和持續(xù)集成/部署能夠很好的集成進(jìn)來因?yàn)長(zhǎng)XC輕量級(jí)的特點(diǎn),其啟動(dòng)快,而且docker能夠只加載每個(gè)container變化的部分,這樣資源占用小,能夠在單機(jī)環(huán)境下與KVM之類的虛擬化方案相比能夠更加快速和占用更少資源4、局限
Docker并不是全能的,設(shè)計(jì)之初也不是KVM之類虛擬化手段的替代品,簡(jiǎn)單總結(jié)幾點(diǎn):
Docker是基于Linux 64bit的,無法在32bit的linux/Windows/unix環(huán)境下使用LXC是基于cgroup等linux kernel功能的,因此container的guest系統(tǒng)只能是linux base的隔離性相比KVM之類的虛擬化方案還是有些欠缺,所有container公用一部分的運(yùn)行庫網(wǎng)絡(luò)管理相對(duì)簡(jiǎn)單,主要是基于namespace隔離cgroup的cpu和cpuset提供的cpu功能相比KVM的等虛擬化方案相比難以度量(所以dotcloud主要是按內(nèi)存收費(fèi))Docker對(duì)disk的管理比較有限container隨著用戶進(jìn)程的停止而銷毀,container中的log等用戶數(shù)據(jù)不便收集5、原理
Docker核心解決的問題是利用LXC來實(shí)現(xiàn)類似VM的功能,從而利用更加節(jié)省的硬件資源提供給用戶更多的計(jì)算資源。同VM的方式不同,LXC?其并不是一套硬件虛擬化方法——無法歸屬到全虛擬化、部分虛擬化和半虛擬化中的任意一個(gè),而是一個(gè)操作系統(tǒng)級(jí)虛擬化方法,理解起來可能并不像VM那樣直觀。所以可以從虛擬化到docker要解決的問題出發(fā),看看docker是怎么滿足用戶虛擬化需求的。用戶需要考慮虛擬化方法,尤其是硬件虛擬化方法,需要借助其解決的主要是以下4個(gè)問題:
隔離性:每個(gè)用戶實(shí)例之間相互隔離,互不影響。 硬件虛擬化方法給出的方法是VM,LXC給出的方法是container,更細(xì)一點(diǎn)是kernel namespace可配額/可度量:每個(gè)用戶實(shí)例可以按需提供其計(jì)算資源,所使用的資源可以被計(jì)量。硬件虛擬化方法因?yàn)樘摂M了CPU,memory可以方便實(shí)現(xiàn),LXC則主要是利用cgroups來控制資源移動(dòng)性:用戶的實(shí)例可以很方便地復(fù)制、移動(dòng)和重建。硬件虛擬化方法提供snapshot和image來實(shí)現(xiàn),docker(主要)利用AUFS實(shí)現(xiàn)安全性:這個(gè)話題比較大,這里強(qiáng)調(diào)是host主機(jī)的角度盡量保護(hù)container。硬件虛擬化的方法因?yàn)樘摂M化的水平比較高,用戶進(jìn)程都是在KVM等虛擬機(jī)容器中翻譯運(yùn)行的,然而對(duì)于LXC,用戶的進(jìn)程是lxc-start進(jìn)程的子進(jìn)程,只是在Kernel的namespace中隔離的,因此需要一些kernel的patch來保證用戶的運(yùn)行環(huán)境不會(huì)受到來自host主機(jī)的惡意入侵,dotcloud(主要是)利用kernel grsec patch解決的延伸閱讀1:Docker安全中心
在新的功能中有硬件的部分,可以 跨任何基礎(chǔ)架構(gòu),允許開發(fā)和隨后的升級(jí)中的數(shù)字編碼簽名。構(gòu)建在Docker Trust框架之上用來進(jìn)行鏡像發(fā)布者認(rèn)證,同時(shí)進(jìn)行新的鏡像掃描和官方漏洞檢測(cè),以便能夠更好地理解容器內(nèi)部是什么。命名空間是本周發(fā)布的另外一個(gè)Docker安全升級(jí)。允許IT運(yùn)用來為基于用戶群組的容器指派授權(quán),約束了主機(jī)的訪問根源,并指定了系統(tǒng)管理員,限制了群組對(duì)于指定服務(wù)的訪問。鏡像掃描對(duì)于Docker Hub上的所有官方版本都可用,同時(shí)命名空間和硬件簽名則在Docker的實(shí)驗(yàn)渠道提供。安全問題仍舊是容器采納要解決的最大問題,尤其是如果大量容器是便攜的,IDC研究經(jīng)理Larry Carvalho說道。通過硬件解決這個(gè)問題很明智,因?yàn)檫@樣更難以介入,并且提供了未來可能被使用的大量容器的效率。