Docker:集装箱式“运输”在软件上的实现
Docker是由PaaS提供商dotCloud在2013年年初創(chuàng)建的一款開(kāi)源應(yīng)用引擎,Docker可以自動(dòng)將任何應(yīng)用打包成輕量、可移植、自包涵的容器引擎。開(kāi)發(fā)者構(gòu)建的應(yīng)用可以一次構(gòu)建全平臺(tái)運(yùn)行,包括本地開(kāi)發(fā)機(jī)器,生產(chǎn)環(huán)境,虛擬機(jī)和云等。
Docker基于Go語(yǔ)言開(kāi)發(fā),代碼托管在?Github上,并遵循Apache 2.0開(kāi)源協(xié)議。近期,這個(gè)項(xiàng)目得到了越來(lái)越多的用戶追捧,Github上的Star數(shù)已經(jīng)9000多,Google的Compute Engine也支持 Docker,而在國(guó)內(nèi),知名的?百度也把Docker作為其Paas的基礎(chǔ)。
?
來(lái)自Docker官方博客
Docker容器可以封裝任何有效負(fù)載,幾乎可以在任何服務(wù)器之間進(jìn)行一致性運(yùn)行。?
Docker的常用案例包括:?
- 自動(dòng)打包和部署應(yīng)用
- 創(chuàng)建輕量、私有的PaaS環(huán)境
- 自動(dòng)化測(cè)試和持續(xù)集成/部署
- 部署并擴(kuò)展Web應(yīng)用、數(shù)據(jù)庫(kù)和后端服務(wù)器
背景
十五年前,幾乎所有的應(yīng)用都是采用定義良好的堆棧編寫(xiě),并且部署到單一的專(zhuān)有服務(wù)器上。今天,開(kāi)發(fā)人員可以使用現(xiàn)成的最佳服務(wù)組合構(gòu)建和裝配應(yīng)用程序,并且為這些應(yīng)用程序進(jìn)行跨不同硬件環(huán)境的多重部署做好了準(zhǔn)備,包括公共的、私有的和虛擬化的服務(wù)器。
?
圖1 IT演變
這種設(shè)置可能會(huì)用在:?
- 不同服務(wù)和“依賴(lài)抵御”之間的相互不良反應(yīng)
- 在快速遷移和跨不同硬件之間面臨挑戰(zhàn),不可能管理一個(gè)跨多個(gè)服務(wù)并且被部署在不同硬件類(lèi)型上的矩陣。
?
圖2?多個(gè)棧和多種硬件環(huán)境所面臨的挑戰(zhàn)
我們可以看到,這里有大量的組合和排列應(yīng)用/服務(wù)以及隨時(shí)需要考慮每一個(gè)應(yīng)用程序被寫(xiě)入或改寫(xiě)的硬件環(huán)境。這將給編寫(xiě)應(yīng)用程序的開(kāi)發(fā)人員和試圖創(chuàng)建一個(gè)穩(wěn)定、安全、高性能操作環(huán)境的人們帶來(lái)一個(gè)困難的局面。
?
圖3 使用動(dòng)態(tài)棧和動(dòng)態(tài)硬件環(huán)境創(chuàng)建一個(gè)N*N矩陣
那么,該如何解決這種局面呢?讓我們舉個(gè)運(yùn)輸界的例子,在1960年之前,大多數(shù)散貨通過(guò)船進(jìn)行托運(yùn),托運(yùn)人和承運(yùn)人很擔(dān)心不同類(lèi)型的貨物之間會(huì)發(fā)生些不良反應(yīng)(例如,一批鐵壓在一袋香蕉上)。同樣,各種不同運(yùn)輸方式之間進(jìn)行轉(zhuǎn)換也是非常痛苦的,其中一大半的時(shí)間都是花在港口對(duì)貨物進(jìn)行卸載,然后再裝載,并且還要等待同一批貨物一起被裝到火車(chē)、卡車(chē)等交通工具上。這樣,在多種不同物品和多個(gè)不同的運(yùn)輸機(jī)制之間就存在一個(gè)N*N的矩陣。
?
圖4 1960年之前的海運(yùn)
幸運(yùn)地是,標(biāo)準(zhǔn)集裝箱的出現(xiàn)解決了以上所面臨的難題。任何貨物,從開(kāi)心果到保時(shí)捷,都可以通過(guò)標(biāo)準(zhǔn)集裝箱進(jìn)行包裝。托運(yùn)人員或承運(yùn)人可以把集裝箱進(jìn)行密封或者禁止再次打開(kāi),直到運(yùn)輸?shù)侥康牡?。在運(yùn)輸過(guò)程中,集裝箱可以被卸載、裝載、堆積、運(yùn)輸并且還可以有效地長(zhǎng)距離運(yùn)輸。集裝箱顛覆了全球運(yùn)輸方式——一個(gè)標(biāo)準(zhǔn),讓貨物在火車(chē)、汽車(chē)、輪船之間暢通無(wú)阻。今天,有1800萬(wàn)只集裝箱進(jìn)行著90%的世界貿(mào)易。
?
圖5 一個(gè)標(biāo)準(zhǔn)容器(集裝箱)的出現(xiàn)解決了運(yùn)輸方面的難題
在某種程度上,Docker可以看作是用代碼編寫(xiě)出來(lái)的國(guó)際集裝箱。?
?
圖6?軟件“運(yùn)輸”解決方案也是一個(gè)標(biāo)準(zhǔn)的容器系統(tǒng)
Docker可以把任何應(yīng)用及相關(guān)依賴(lài)項(xiàng)打包成一個(gè)輕量、可移植、自包涵式的容器,該容器擁有標(biāo)準(zhǔn)的操作,從而能夠?qū)崿F(xiàn)自動(dòng)化。與此同時(shí),所有的應(yīng)用都可以運(yùn)行在任何Linux服務(wù)上。相同的容器,開(kāi)發(fā)者可以在筆記本上有規(guī)模的運(yùn)行、生產(chǎn)、也可以在虛擬機(jī)、邏輯服務(wù)器、OpenStack集群、公共實(shí)例、或以上所有結(jié)合(的方式)上運(yùn)行。
換句話說(shuō),開(kāi)發(fā)者構(gòu)建的應(yīng)用只需一次構(gòu)建即可多平臺(tái)運(yùn)行。運(yùn)營(yíng)人員只需配置他們的服務(wù),即可運(yùn)行所有的應(yīng)用。
Docker的主要功能特征
| ? | 物理容器 | Docker |
| 內(nèi)容無(wú)關(guān)性(Content Agnostic)? | 相同的集裝箱可以容納幾乎任何類(lèi)型的貨物? | 可以封裝任何有效負(fù)載及其依賴(lài)項(xiàng) |
| 硬件無(wú)關(guān)性(Hardware Agnostic) | 同一標(biāo)準(zhǔn)的容器允許把貨物從船上運(yùn)輸?shù)交疖?chē)、卡車(chē)上,直到運(yùn)輸?shù)絺}(cāng)庫(kù),整個(gè)過(guò)程無(wú)需整理貨物或打開(kāi)容器 | 使用操作系統(tǒng)基元(例如:LXC)幾乎可以在任何平臺(tái)上運(yùn)行——虛擬機(jī)、裸機(jī)、OpenStack、公共IaaS等,并且無(wú)需修改 |
| 內(nèi)容隔離和交互 | 無(wú)需擔(dān)心鐵壓在香蕉上,容器可以堆積運(yùn)輸 | 資源、網(wǎng)絡(luò)和內(nèi)容隔離,避免依賴(lài)地獄? |
| 自動(dòng)化 | 標(biāo)準(zhǔn)的接口使其易于實(shí)現(xiàn)自動(dòng)化裝卸、搬運(yùn)等 | 運(yùn)行、啟動(dòng)、停止、提交、搜索等都有標(biāo)準(zhǔn)的操作,非常適合devops:CI、CD、自動(dòng)擴(kuò)展、混合云 |
| 高效 | 無(wú)需打開(kāi)或修改,可以在起始兩地快速地移動(dòng)/運(yùn)輸? | 輕量級(jí)、幾乎沒(méi)有任何偏向和啟動(dòng)懲罰,可以進(jìn)行快速移動(dòng)和操作? |
| 職責(zé)分離? | 托運(yùn)人擔(dān)心盒子內(nèi)部、承運(yùn)人擔(dān)心盒子外部? | 開(kāi)發(fā)人員擔(dān)心代碼,運(yùn)營(yíng)人員擔(dān)心基礎(chǔ)設(shè)施? |
更多技術(shù)特性:
- 文件系統(tǒng)隔離:每個(gè)進(jìn)程容器都運(yùn)行在一個(gè)完全獨(dú)立的根文件系統(tǒng)里;
- 資源隔離:系統(tǒng)資源,例如CPU、內(nèi)存等,使用cgroups分配在不同的流程容器里;
- 網(wǎng)絡(luò)隔離:每個(gè)進(jìn)程容器攜帶自身的一個(gè)虛擬接口和IP地址運(yùn)行在自己的網(wǎng)絡(luò)空間;
- 即寫(xiě)即拷(Copy-on-write):使用即寫(xiě)即拷方式創(chuàng)建根文件系統(tǒng),這樣部署速度極快、內(nèi)存和硬盤(pán)空間極少;
- 日志:Docker將會(huì)收集和記錄每個(gè)進(jìn)程容器的標(biāo)準(zhǔn)流(stdout/stderr/stdin),用于實(shí)時(shí)檢索或批量檢索;
- 變更管理:容器文件系統(tǒng)的變更可以提交到新的映像(image)中,并可重復(fù)使用以創(chuàng)建更多的容器。無(wú)需使用模板或手動(dòng)配置;
- 交互式shell:Docker可以分配一個(gè)虛擬終端并關(guān)聯(lián)到任何容器的標(biāo)準(zhǔn)輸入上,例如運(yùn)行一個(gè)一次性交互shell。
Docker有哪些基本功能?
Docker讓開(kāi)發(fā)和運(yùn)維變的簡(jiǎn)單。下面這幅圖會(huì)讓你對(duì)Docker基本功能有個(gè)很好的認(rèn)識(shí),Docker會(huì)將網(wǎng)絡(luò),存儲(chǔ)這些事情都配好。下載應(yīng)用并安裝。并配置一些參數(shù),打包上傳Image。此外,Container既可以手動(dòng)創(chuàng)建,也可以自動(dòng)創(chuàng)建,如果源碼庫(kù)里面包涵DockerFile文件,那么將會(huì)自動(dòng)創(chuàng)建,容器里不僅包涵應(yīng)用,還包括應(yīng)用的所有依賴(lài)項(xiàng)。
開(kāi)發(fā)人員可以使用Docker Search命令在Docker Registry(無(wú)論是公有還是私有的)里搜索Containers,并且還可以使用Docker Pull命令從注冊(cè)表里推送Container,使用Docker Run命令執(zhí)行啟動(dòng)、運(yùn)行、停止等操作。值得注意的是,Run命令的對(duì)象可能是你自己的服務(wù)器、公共實(shí)例或者是兩者的組合。
?
圖7 Docker的基本功能
關(guān)于Docker的完整功能列表,大家可以訪問(wèn):?http://docs.docker.io/en/latest/commandline/
Docker的三種運(yùn)行方式:作為守護(hù)進(jìn)程,在Linux主機(jī)上管理LXC容器;作為一個(gè)CLI,與守護(hù)進(jìn)程的REST API進(jìn)行對(duì)話(docker run ...);作為倉(cāng)庫(kù)的客戶端,分享你所構(gòu)建的內(nèi)容(docker pull, docker commit)。
Containers是如何工作的?與VMs有何不同?
一個(gè)Container通常包含應(yīng)用及應(yīng)用依賴(lài)項(xiàng),Container用來(lái)隔離進(jìn)程,這些進(jìn)程主要運(yùn)行在主機(jī)操作系統(tǒng)上的隔離區(qū)和用戶空間。?
這個(gè)是明顯不同于傳統(tǒng)的VMs。傳統(tǒng)的硬件虛擬化(例如VMWare、KVM、Xen、EC2)旨在創(chuàng)造一個(gè)完整虛擬機(jī)。每個(gè)虛擬化應(yīng)用不僅包含應(yīng)用的二進(jìn)制文件,還需運(yùn)行該應(yīng)用程序所需的庫(kù)、一個(gè)完整的Guest操作系統(tǒng)。?
?
圖8??Containers vs. 傳統(tǒng)VMs
由于所有的容器共享同一個(gè)操作系統(tǒng)(以及二進(jìn)制文件和庫(kù)),所以,他們明顯要比VM小的多,這樣,就完全可以在一個(gè)物理主機(jī)上托管100個(gè)VMs(一般VM數(shù)量會(huì)受到嚴(yán)格限制)。此外,因?yàn)樗鼈兪褂弥鳈C(jī)操作系統(tǒng),重啟一個(gè)VM并不意味著要重啟操作系統(tǒng),因此,容器更加輕便、高效。
Docker中的容器效率會(huì)更高。因?yàn)橐粋€(gè)傳統(tǒng)的VM、應(yīng)用、每個(gè)應(yīng)用副本以及每個(gè)應(yīng)用微小的變更都需要重新創(chuàng)建一個(gè)完整的VM。?
如上圖所示,一個(gè)新的應(yīng)用在主機(jī)上僅僅包含應(yīng)用及其二進(jìn)制文件/庫(kù),這樣就無(wú)需創(chuàng)建一個(gè)新的客戶機(jī)操作系統(tǒng)。?
如果你想在主機(jī)上運(yùn)行該應(yīng)用的幾個(gè)副本,你甚至無(wú)需復(fù)制共享的二進(jìn)制文件。?
最后,即使你對(duì)應(yīng)用進(jìn)行了變更,你也無(wú)需拷貝變更內(nèi)容。?
?
圖9?Mechanism讓Docker容器更輕量
這不僅讓存儲(chǔ)和容器運(yùn)行變得更高效,還讓?xiě)?yīng)用程序更新變得極其簡(jiǎn)便。正如下圖所示,更新一個(gè)容器只需應(yīng)用差異的地方。?
?
圖10 修改和更新Container
下面分享一些比較酷的Docker用例
| 實(shí)例 | 實(shí)例描述 | 鏈接 |
| 構(gòu)建自己的PaaS? | Dokku——Docker實(shí)現(xiàn)的mini-Heroku。你所見(jiàn)過(guò)最小的PaaS實(shí)現(xiàn)? | http://bit.ly/191Tgsx? |
| 基于指令環(huán)境的Web? | JiffyLab——基于指令環(huán)境的Web,使用更輕量、Python和UNIX shell? | http://bit.ly/12oaj2K? |
| 應(yīng)用部署簡(jiǎn)便 | 使用Docker部署Java應(yīng)用 在Docker上運(yùn)行Drupal 在Docker上安裝Redis | http://bit.ly/11BCvvu? http://bit.ly/15MJS6B? http://bit.ly/16EWOKh |
| 創(chuàng)建安全沙盒 | Docker讓安全沙盒的創(chuàng)建更簡(jiǎn)單? | http://bit.ly/13mZGJH |
| 創(chuàng)建自己的SaaS? | 把Memcached作為服務(wù) | http://bit.ly/11nL8vh? |
| 應(yīng)用程序自動(dòng)化部署? | 使用Docker的Push-button部署? | http://bit.ly/1bTKZTo? |
| 持續(xù)集成部署 | dotCloud的Docker和Strider的下一代持續(xù)集成&部署? | http://bit.ly/ZwTfoy? |
| 輕量級(jí)桌面虛擬化? | Docker桌面:通過(guò)SSH運(yùn)行一個(gè)內(nèi)部Docker容器 | http://bit.ly/14RYL6x? |
備注:以上鏈接需翻墻
轉(zhuǎn)自:https://www.csdn.net/article/2014-02-01/2818306-Docker-Story
總結(jié)
以上是生活随笔為你收集整理的Docker:集装箱式“运输”在软件上的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 04/28/2010 类,对象,变量
- 下一篇: WebService中文件传输