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