亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 9196 | 回復(fù): 0
打印 上一主題 下一主題

Docker —— 用于統(tǒng)一開發(fā)和部署的輕量級(jí) Linux 容器 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2014-10-14 17:08 |只看該作者 |倒序?yàn)g覽
使用Docker容器——輕量靈活的VM同類,來(lái)接管“依賴地獄”。學(xué)習(xí)Docker是如何基于LXC技術(shù),通過(guò)把應(yīng)用包裝在容器里來(lái)使應(yīng)用具有移植性和獨(dú)立性。
  想象一下可以輕松地把應(yīng)用和它的依賴打包,然后在其他的開發(fā)、測(cè)試和生產(chǎn)環(huán)境上平滑的運(yùn)行。這就是開源Docker項(xiàng)目的目標(biāo)。盡管它現(xiàn)在還沒正式到生產(chǎn)階段,最新的發(fā)布(本篇文章編寫時(shí)是0.7.x)使得Docker實(shí)現(xiàn)這一偉大目標(biāo)又近了一步。

  Docker容器試圖解決“依賴地獄”問(wèn)題,F(xiàn)代的應(yīng)用通常從已存在的組件組合而來(lái),并且依賴其他服務(wù)和應(yīng)用。比如,你的Python應(yīng)用可能使用Postgre所為一個(gè)數(shù)據(jù)存儲(chǔ),用Redis緩存以及使用Apache作web服務(wù)器。每個(gè)這些組件都附帶自身的一些依賴,這些依賴可能與其他組件產(chǎn)生沖突。通過(guò)打包每個(gè)組件及其依賴,Docker容器解決以下問(wèn)題:

  • 沖突依賴:需要在PHP4.3上運(yùn)行一個(gè)web站點(diǎn)而另一個(gè)運(yùn)行在PHP5.5上?如果你在一個(gè)獨(dú)立的Docker容器中運(yùn)行每個(gè)版本的PHP,那就沒問(wèn)題。
  • 缺少依賴:在一個(gè)新環(huán)境上安裝應(yīng)用對(duì)Docker容器來(lái)說(shuō)只是瞬間的事情,因?yàn)樗械囊蕾嚩己瓦@個(gè)應(yīng)用一起打包到一個(gè)容器中。
  • 平臺(tái)依賴:從一個(gè)發(fā)行版移動(dòng)到另一個(gè)不再是一個(gè)麻煩。如果兩個(gè)系統(tǒng)都運(yùn)行了Docker容器,那么相同的容器執(zhí)行起來(lái)將沒有任何問(wèn)題。


  Docker容器:一點(diǎn)背景
  2013年初,Docker在dotCloud—一個(gè)平臺(tái)即服務(wù)的、以云計(jì)算為中心的公司,以一個(gè)開源項(xiàng)目的形式誕生。Docker是該公司已經(jīng)開發(fā)的用來(lái)在數(shù)千臺(tái)服務(wù)器上運(yùn)行云業(yè)務(wù)的一個(gè)自然擴(kuò)展技術(shù)。它是用Go語(yǔ)言編寫的,Go語(yǔ)言是由谷歌開發(fā)的一種基于C語(yǔ)言且語(yǔ)法松散的靜態(tài)類型編程語(yǔ)言?焖侔l(fā)展了6到9個(gè)月,這家公司聘請(qǐng)了一個(gè)新的CEO,加入了Linux基金會(huì),將公司名改為Docker,并且宣布將工作重心轉(zhuǎn)移到Docker容器及其生態(tài)系統(tǒng)的開發(fā)。作為Docker容器的受歡迎程度進(jìn)一步說(shuō)明,在寫這篇文章的時(shí)候,它已經(jīng)在GitHub上被 Star 8985次并 Fork1304次。圖1表明了Docker容器在谷歌搜索持續(xù)上升的受歡迎度。隨著Docker公司發(fā)布了第一個(gè)版本容器的產(chǎn)品部署以及廣泛的社區(qū)知道了Docker容器的有用性,預(yù)計(jì)過(guò)去12個(gè)月的波形圖將會(huì)在未來(lái)12個(gè)月內(nèi)相形見絀。


圖1. 過(guò)去12個(gè)月Docker軟件在谷歌搜索上的趨勢(shì)圖


  在引擎罩下
  Docker運(yùn)用了一些強(qiáng)大的內(nèi)核級(jí)技術(shù)并讓我們觸手可及。容器虛擬化的概念早在幾年前已經(jīng)出現(xiàn),但通過(guò)提供一個(gè)簡(jiǎn)單的工具集和統(tǒng)一的API接口管理一些內(nèi)核級(jí)技術(shù),如LXCs(Linux容器)、cgroups和一個(gè)寫復(fù)制文件系統(tǒng),Docker已經(jīng)創(chuàng)建了一個(gè)比其各部件更好的工具。它就是一個(gè)潛在的用于開發(fā)運(yùn)營(yíng)商、系統(tǒng)管理員和開發(fā)者的規(guī)則轉(zhuǎn)換器。

  Docker提供工具使得利用容器創(chuàng)建和操作盡可能簡(jiǎn)單,容器沙箱相互處理。你可以暫時(shí)把一個(gè)容器當(dāng)成一個(gè)輕量級(jí)的虛擬機(jī)。

  Linux容器和LXC,一個(gè)用于Linux容器的用戶空間控制程序包,是組成Docker的核心,LXC使用內(nèi)核級(jí)命名空間將主機(jī)和容器相互隔離。用戶命名空間將主機(jī)和容器的用戶數(shù)據(jù)庫(kù)分離,這樣保證了容器的root用戶沒有主機(jī)的root權(quán)限。程序命名空間僅負(fù)責(zé)顯示和管理程序在容器中,而非在主機(jī)運(yùn)行。而且網(wǎng)絡(luò)命名空間提供自己的網(wǎng)絡(luò)設(shè)備和虛擬IP地址給容器。

  LXC提供的另一個(gè)組件是控制組(cgroups)。命名空間負(fù)責(zé)主機(jī)與容器之間的隔離,而控制組實(shí)現(xiàn)資源核算和限制。當(dāng)允許Docker限制被一個(gè)容器消耗的資源:如內(nèi)存、磁盤空間和輸入輸出時(shí),控制組也會(huì)輸出大量與之相關(guān)的指標(biāo)。這些指標(biāo)使Docker能夠監(jiān)控容器內(nèi)各個(gè)進(jìn)程的資源消耗并確保每個(gè)進(jìn)程只獲取可用的公平共享資源。

  除了以上組件,Docker一直在用AuFS(高級(jí)多層次統(tǒng)一文件系統(tǒng))作為容器的文件系統(tǒng)。AuFS是一個(gè)能透明覆蓋一或多個(gè)現(xiàn)有文件系統(tǒng)的層狀文件系統(tǒng)。當(dāng)一個(gè)進(jìn)程需要修改一個(gè)文件時(shí),AuFS創(chuàng)建該文件的一個(gè)副本。AuFS可以把多層合并成文件系統(tǒng)的單層表示。這個(gè)過(guò)程稱為寫復(fù)制。

  真正酷斃的是,AuFS允許Docker把某些鏡像作為容器的基礎(chǔ)。例如,你可能有一個(gè)可以作為很多不同容器的基礎(chǔ)的CentOS系統(tǒng)鏡像。多虧AuFS,只要一個(gè)CentOS鏡像的副本就夠了,這樣既節(jié)省了存儲(chǔ)和內(nèi)存,也保證更快速的容器部署。

  使用AuFS的另一個(gè)好處是Docker的版本容器鏡像能力。每個(gè)新版本都是一個(gè)與之前版本的簡(jiǎn)單差異改動(dòng),有效地保持鏡像文件最小化。但,這也意味著你總是要有一個(gè)記錄該容器從一個(gè)版本到另一個(gè)版本改動(dòng)的審計(jì)跟蹤。

  傳統(tǒng)上,Docker依賴AuFS提供了寫復(fù)制存儲(chǔ)機(jī)制。然而,最近添加的一個(gè)存儲(chǔ)啟動(dòng)API可能降低這種依賴。最初,可用的存儲(chǔ)驅(qū)動(dòng)有三種:AuFS、VFS和設(shè)備映射器-與紅帽合作的產(chǎn)物。

  自版本0.7起,Docker就與所有Linux發(fā)行版協(xié)作。然而,它并沒有兼顧大部分非Linux系統(tǒng),如Windows和OS X。在那些操作系統(tǒng)上使用Docker的推薦方式是,用Vagrant在VirtualBox上提供一個(gè)虛擬機(jī)。



  容器VS.其他虛擬化類型
  那容器到底什么是以及它與基于管理程序的虛擬化的區(qū)別是什么?簡(jiǎn)單地說(shuō),容器在操作系統(tǒng)層面虛擬化,而基于管理程序的虛擬化在硬件層面。效果類似,但區(qū)別很重要,這也是我花了點(diǎn)時(shí)間探索它們的差異和由其產(chǎn)生的差異和權(quán)衡的原因。

  虛擬化:

  容器和虛擬機(jī)(VMs)都是虛擬化工具。在虛擬機(jī)上,一個(gè)管理程序使各個(gè)孤立的硬件可用。通常,這包括兩種類型的管理程序:類型1直接運(yùn)行在硬件裸金屬片上,而類型2則在客戶操作系統(tǒng)上作為軟件附加層運(yùn)行。開源的Xen和VMware的ESX是類型1 的例子,類型2的實(shí)例包括Oracle的開源VirtualBox和VMware服務(wù)器。雖然相比Docker容器而言,類型1是個(gè)更好的候選,但我在文章的其他部分并不區(qū)分這兩種類型。

  與此相反,容器構(gòu)造操作系統(tǒng)中可用的受保護(hù)部分-它們有效地虛擬化操作系統(tǒng)。運(yùn)行在同一個(gè)操作系統(tǒng)上的兩個(gè)容器不知道它們?cè)诠蚕碣Y源,因?yàn)楸舜藫碛凶约旱某橄缶W(wǎng)絡(luò)層和進(jìn)程等等。

操作系統(tǒng)和資源
  由于基于hypervisor的虛擬化僅僅提供了對(duì)硬件的訪問(wèn),因此你還需要安裝操作系統(tǒng)。這樣就會(huì)運(yùn)行多個(gè)完整的操作系統(tǒng),每個(gè)虛擬機(jī)上運(yùn)行一個(gè),這將快速地吃完服務(wù)器上的諸如內(nèi)存(RAM)、CPU和帶寬等資源。

  容器運(yùn)行在操作系統(tǒng)之上,把正在運(yùn)行的操作系統(tǒng)當(dāng)作自己的主機(jī)環(huán)境。它只運(yùn)行在這樣的空間上:這些空間是主機(jī)操作系統(tǒng)的一部分,而且各個(gè)容器使用的空間相互獨(dú)立。這會(huì)帶來(lái)兩個(gè)非常鮮明的優(yōu)點(diǎn)。第一個(gè)優(yōu)點(diǎn)是更高效的使用資源。如果一個(gè)容器不執(zhí)行任何操作,那么它就不會(huì)耗盡資源,而且容器可以調(diào)用自己所在的主機(jī)操作系統(tǒng)以實(shí)現(xiàn)其所需要的部分或者全部功能。第二個(gè)優(yōu)點(diǎn)是容器成本低,因此可以快速地創(chuàng)建和刪除容器。容器不需要對(duì)整個(gè)操作系統(tǒng)進(jìn)行重啟或者關(guān)閉。容器僅僅需要的終止運(yùn)行在自身獨(dú)立空間的進(jìn)程。因此啟動(dòng)和停止容器更像是啟動(dòng)和退出某個(gè)應(yīng)用,因此啟動(dòng)和停止就非?。

  圖2展示了兩種類型的虛擬機(jī)和容器

圖2.虛擬機(jī)和容器

  獨(dú)立的性能和安全
  Docker容器里所執(zhí)行的進(jìn)程與宿主機(jī)操作系統(tǒng)上運(yùn)行的進(jìn)程或者運(yùn)行在其它Docker容器里的進(jìn)程是相互獨(dú)立的。不過(guò),所有的進(jìn)程都是運(yùn)行在相同的內(nèi)核里。Docker使用LXC來(lái)給每個(gè)容器提供獨(dú)立的命名空間,內(nèi)核里的這項(xiàng)技術(shù)已經(jīng)具有5年多的歷史了,已經(jīng)十分成熟。另外,容器還使用了控制組,Linux內(nèi)核里的這項(xiàng)技術(shù)比LXC的歷史更長(zhǎng),它對(duì)資源進(jìn)行審核和限制。

  Docker服務(wù)進(jìn)程本身還是一個(gè)潛在的攻擊載體,這是因?yàn)樗壳爸荒芤詒oot權(quán)限運(yùn)行。對(duì)LXC和Docker的改進(jìn)都應(yīng)當(dāng)允許以非root權(quán)限運(yùn)行容器,而且可以用另外一個(gè)用戶運(yùn)行Docker服務(wù)進(jìn)程。

  雖然容器所使用的這種類型的隔離總的來(lái)說(shuō)非常強(qiáng)大,然而是不是像運(yùn)行在hypervisor上的虛擬機(jī)那么強(qiáng)壯仍具有爭(zhēng)議性。如果內(nèi)核停止,那么所有的容器就會(huì)停止運(yùn)行。虛擬機(jī)具有優(yōu)勢(shì)的領(lǐng)域是它十分成熟,而且廣泛的應(yīng)用在生產(chǎn)環(huán)境中。相比之下,Docker和它的支撐技術(shù)幾乎沒有任何行動(dòng)。特別是Docker每天都進(jìn)行大量的修改變化,而且我們大家都知道變化是安全的天敵.

Docker和虛擬機(jī)-亦敵亦友
  上面我們一直在對(duì)Docker和虛擬機(jī)進(jìn)行比較,現(xiàn)在該看看這兩種技術(shù)彼此在哪些方面是真正互補(bǔ)的。Docker在虛擬化的環(huán)境下運(yùn)行的非常好。很顯然,你不需要對(duì)各個(gè)虛擬主機(jī)的每個(gè)應(yīng)用或者組件進(jìn)行封裝。而且假定給你一臺(tái)Linux虛擬機(jī),你就能夠很容易地部署上Docker容器。這也就是在非Linux系統(tǒng),比如OS X和Windows上運(yùn)行Docker的官方安裝方式是在Vagrant的協(xié)助下安裝基于Ubuntu虛擬機(jī)的Precise64不讓你感到吃驚的原因所在。http://www.docker.io站點(diǎn)有詳細(xì)并且簡(jiǎn)單的指令。

  首先,虛擬化和容器在某些方面表現(xiàn)的非常相似。一開始,這讓你覺得容器就是非常輕量的虛擬機(jī)。然而,隨著你對(duì)容器的認(rèn)識(shí),你對(duì)容器的理解就會(huì)有微妙的并且是重大的不同。Docker在容器最擅長(zhǎng)的領(lǐng)域即輕量級(jí)應(yīng)用的打包和部署方面都能充分發(fā)揮容器的長(zhǎng)處。

Docker倉(cāng)庫(kù)
  Docker殺手級(jí)特性之一就是能夠快速的查找、下載和啟動(dòng)由其他開發(fā)者創(chuàng)建的容器映像。存儲(chǔ)映像的地方稱為注冊(cè)中心。Docker有限公司提供一個(gè)公共的注冊(cè)中心,這個(gè)注冊(cè)中心也稱為索引中心。你可以把這個(gè)注冊(cè)中心和Docker客戶端看作與Node的NPM,Perl的CPAN或者Ruby的RubyGems等同。

  除了可以用來(lái)創(chuàng)建Docker容器的各種基本映像外,公共的Docker注冊(cè)中心還提供即刻即可運(yùn)行的軟件映像,其中包括數(shù)據(jù)庫(kù)、內(nèi)容管理系統(tǒng)、開發(fā)環(huán)境和Web服務(wù)器等等。默認(rèn)情況下Docker命令行客戶端搜索的是公共的注冊(cè)中心,不過(guò),也可以維護(hù)私有的注冊(cè)中心。如果要發(fā)布含有專有知識(shí)產(chǎn)權(quán)代碼的或者僅公司內(nèi)部使用的組件的映像,那么注冊(cè)中心就是一個(gè)很好的選擇。把映像上傳到注冊(cè)中心就像下載一樣容易。只要求你創(chuàng)建一個(gè)賬戶,而且這一切都是免費(fèi)的。最后,Dcoker有限公司的注冊(cè)中心還有Web界面,方便對(duì)映像進(jìn)行搜索、讀取、評(píng)論和推薦(即“標(biāo)記星號(hào)”)。映像使用起來(lái)出奇的容易,我鼓勵(lì)你這篇文檔資源一小節(jié)里的鏈接,開始瀏覽映像。




手把手教你使用Docker
  Docker是有單個(gè)二進(jìn)制文件組成的,這個(gè)二進(jìn)制文件可以以三種方式來(lái)運(yùn)行。第一種,它可以作為管理容器的服務(wù)進(jìn)程運(yùn)行。服務(wù)進(jìn)程向外提供既可以進(jìn)行本地訪問(wèn)也可以進(jìn)行遠(yuǎn)程訪問(wèn)的基于REST風(fēng)格的API。越來(lái)越多的客戶端數(shù)據(jù)庫(kù)可與服務(wù)進(jìn)程API進(jìn)行通信,其中包括Ruby,Python,JavaScript(Angular和Node),Erlang,Go和PHP提供的客戶端庫(kù).

  客戶端庫(kù)大多數(shù)情況下都是通過(guò)編程來(lái)來(lái)訪問(wèn)服務(wù)進(jìn)程的,不過(guò)更經(jīng)常使用的情況則是通過(guò)命令行提交指令。這也就是運(yùn)行Dcoker二進(jìn)制文件的第二種方式,即通過(guò)命令行客戶端訪問(wèn)基于REST風(fēng)格的服務(wù)進(jìn)程。

  第三種方式,Docker二進(jìn)制文件可以運(yùn)行為訪問(wèn)遠(yuǎn)程映像倉(cāng)庫(kù)的客戶端。生成容器文件系統(tǒng)的映像被稱作倉(cāng)庫(kù)。用戶可以下載別人提供的映像,還可以上傳自己的映像到注冊(cè)中心,從而共享這些映像。注冊(cè)中心用來(lái)收集,羅列和組織這些倉(cāng)庫(kù)。

  讓我們看看實(shí)際中運(yùn)行Docker的這三種方式。在下面的例子里,你將搜索Docker倉(cāng)庫(kù),查找MySQL映像。因此你找到所喜歡的映像,然后下載它,接著告訴Docker服務(wù)進(jìn)程運(yùn)行對(duì)應(yīng)的命令(MySQL)。你所做的這些操作都是通過(guò)命令行進(jìn)行的。

圖3.下載Docker映像并啟動(dòng)容器

  一開始,先運(yùn)行docker search mysql命令,這條命令將顯示公共Docker注冊(cè)中心里匹配關(guān)鍵詞"mysql"的映像列表。我確定這條命令可以正常運(yùn)行,接著使用命令docker pull brice/mysql下載"brice/mysql"映像。你可以看到Docker不僅僅下載的是你所指定的映像,而且還可以下載依賴這個(gè)包所建立的其他映像。輸入docker images命令,將會(huì)羅列出目前本地具有的所有映像,其中包括了"brice/mysql"映像。使用-d選項(xiàng)啟動(dòng)容器,它將會(huì)脫離當(dāng)前運(yùn)行的容器之外運(yùn)行一個(gè)容器,此時(shí),你已經(jīng)在一個(gè)容器里運(yùn)行了MySQL了。你可以使用docker ps命令來(lái)驗(yàn)證,這條命令經(jīng)羅列出運(yùn)行的容器,而不是羅列出映像。在命令行的輸出里,你還能看到MySQL服務(wù)偵聽的端口號(hào),默認(rèn)是3306。

  然而,在知道MySQL運(yùn)行在容器內(nèi)部情況下,你該怎樣連接到MySQL呢?切記:每個(gè)Docker容器有自己的網(wǎng)絡(luò)接口。你需要確定的是mysqld服務(wù)器進(jìn)程運(yùn)行在哪個(gè)IP地址和端口上。運(yùn)行docker inspect <imageId>命令,它將給我們提供大量的信息。不過(guò),由于你所需要的僅僅是IP地址,所以當(dāng)你使用容器的哈希值對(duì)容器進(jìn)行查看的時(shí)候,你就可以抓取到IP地址,即運(yùn)行docker inspect 5a9005441bb5 | grep IPAddress,F(xiàn)在你可以通過(guò)給標(biāo)準(zhǔn)的MYSQL CLI客戶端指定主機(jī)地址和端口選項(xiàng)來(lái)連接了。當(dāng)你使用完MySQL服務(wù)器后,你可以使用命令docker stop 5a9005441bb5關(guān)閉這個(gè)容器了。

  我們使用了7條命令查找、下載、啟動(dòng)運(yùn)行MySQL服務(wù)器的Docker容器以及使用完后關(guān)閉這個(gè)容器。在這個(gè)過(guò)程中,你不必?fù)?dān)心與已安裝軟件之間存在的沖突,也不必?fù)?dān)心MySQL的版本有什么不一樣,或者存在哪些包依賴。你使用了7條不同的Docker命令:search、pull、images、run、ps、inspect和stop,不過(guò),Docker客戶端實(shí)際上有33條命令。你可以通過(guò)命令運(yùn)行docker help命令或者查找在線手冊(cè)來(lái)查閱全部命令列表。

  在上面例子里進(jìn)行Docker操作之前,我就提到了客戶端與服務(wù)進(jìn)程和Docker注冊(cè)中心之間的通信是通過(guò)基于REST的Web服務(wù)而進(jìn)行的。這就隱含地告訴你可以使用本地Docker客戶端與遠(yuǎn)程的服務(wù)進(jìn)程通信,從而可以有效地管理遠(yuǎn)端服務(wù)器上的容器了。Docker站點(diǎn)上對(duì)Docker服務(wù)進(jìn)程、注冊(cè)中心和索引的API都有很好的文檔,并且舉例給予了說(shuō)明(見資源一節(jié))。

  Docker的工作流程
  有多種方式可以把Docker引入到開發(fā)和部署過(guò)程里。讓我們看看演示工作流程的例子,如圖4。我們?cè)O(shè)想一個(gè)公司的開發(fā)人員可能運(yùn)行安裝了Docker的Ubuntu。他可能從公共注冊(cè)中心下載映像或者上傳映像到公共注冊(cè)中心,并在這個(gè)映像的基礎(chǔ)上安裝自己的代碼或者公司專有知識(shí)產(chǎn)權(quán)的軟件,還要生成可上傳到公司私有注冊(cè)中心的映像。

  在這個(gè)例子里,公司的產(chǎn)品質(zhì)量測(cè)試環(huán)境運(yùn)行的Centos和Docker。它也從公共或者私有的注冊(cè)中心下載映像,然后再環(huán)境更新的時(shí)候啟動(dòng)各種容器。

  最后,為了方便擴(kuò)展和伸縮,公司把生產(chǎn)環(huán)境部署在云中,即部署在亞馬遜的WEB服務(wù)上(AWS)。亞馬遜Linux上也運(yùn)行了管理不同容器的Docker。

  注意:上面的所有三個(gè)環(huán)境運(yùn)行著不同版本的Linux,但這三個(gè)環(huán)境都與Docker兼容。而且每個(gè)環(huán)境都運(yùn)行著不同的容器組合。然而,由于每個(gè)容器都把自己的依賴同其他容器分離開來(lái),因此不存在任何沖突,所有容器都平安地并存著。

圖4.使用Docker進(jìn)行軟件開發(fā)的工作流程舉例

  認(rèn)識(shí)到Docker提供的是一個(gè)以應(yīng)用為核心的容器模型是非常重要的。也就是說(shuō),容器運(yùn)行的是單獨(dú)的應(yīng)用或者服務(wù),而不是許多應(yīng)用或者服務(wù)。我們已經(jīng)知道:創(chuàng)建和運(yùn)行容器非?於蚁牡馁Y源也很少。由于你所使用的系統(tǒng)遵循單一責(zé)任法則,而且每個(gè)容器運(yùn)行一個(gè)主進(jìn)程,所以系統(tǒng)組件之間就是松耦合的;谶@個(gè)理念,我們自己就可以創(chuàng)建屬于自己的,可以啟動(dòng)容器的映像了。

  創(chuàng)建新的Docker映像
  在前面的例子里,你已經(jīng)通過(guò)命令行與Docker進(jìn)行交互了。然而在創(chuàng)建映像的時(shí)候,更常見的是創(chuàng)建進(jìn)行自動(dòng)構(gòu)建過(guò)程的"Dockerfile“。Dockerfile是簡(jiǎn)單的文本文件,它描述的是構(gòu)建過(guò)程。你可以對(duì)Dockerfile實(shí)行版本控制,這樣就可以就可以非常完美地重復(fù)創(chuàng)建映像了。


  在接下來(lái)的例子里,我們將看看名字為PHP Box的Dockerfile(見代碼清單1)。

  代碼清單1.PHP Box# PHP Box## VERSION 1.0# use centos base imageFROM centos:6.4# specify the maintainerMAINTAINER Dirk Merkel, dmerkel@vivantech.com# update available reposRUN wget http://dl.fedoraproject.org/pub/epel/6/x86_64/↪epel-release-6-8.noarch.rpm; rpm -Uvh epel-release-6-8.noarch.rpm# install some dependenciesRUN yum install -y curl git wget unzip# install Apache httpd and dependenciesRUN yum install -y httpd# install PHP and dependenciesRUN yum install -y php php-mysql# general yum cleanupRUN yum install -y yum-utilsRUN package-cleanup --dupes; package-cleanup --cleandupes;  ↪yum clean -y all# expose mysqld portEXPOSE 80# the command to runCMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]


  接下來(lái)我們仔細(xì)看看上面的Dockerfile都做了哪些事情。Dockerfile的語(yǔ)法是命令關(guān)鍵字,其后緊跟著是該命令的參數(shù)。通常命令關(guān)鍵字是大寫的。注釋部分是以#開頭的。

  FROM命令向你指明了所使用的基本映像。它必須是Docker文件的第一條命令。在這個(gè)例子里,你所做的工作都是建立在剛才新建的基本映像Centos上的。很顯然,MAINTAINER命令則羅列出了維護(hù)這個(gè)Dockerfile的人員。RUN命令執(zhí)行一條命令,并給出運(yùn)行結(jié)果映像,因此它新創(chuàng)建了一個(gè)映像。這個(gè)Dockerfile里的RUN命令獲取其他軟件倉(cāng)庫(kù)的配置文件,然后使用Yum安裝curl、git、wget、unzip、httpd、php-mysql和yum-utils。我們可以把這幾個(gè)yum install命令合并成一條RUN命令,從而可以避免連續(xù)多次提交。


  接下來(lái)的EXPOSE命令向外部開放端口80,它就是啟動(dòng)容器的時(shí)候Apache要偵聽的端口號(hào)。

  最后一條命令 CMD給出了容器啟動(dòng)時(shí)所要運(yùn)行的缺省命令。啟動(dòng)容器就是啟動(dòng)一個(gè)單獨(dú)的進(jìn)程,這樣你就可以把容器看作一條命令。

  在命令行里輸入docker build -t php_box .,這時(shí)Docker就會(huì)使用當(dāng)前目錄下的Dockerfile開始進(jìn)行構(gòu)建。運(yùn)行所得到的最終映像將被命名為"php_box",這樣,你以后就會(huì)很容易的識(shí)別和查找這個(gè)映像。

  這個(gè)構(gòu)建過(guò)程下載了基本映像,緊接著安裝Apache httpd以及與其相關(guān)的所有依賴。完成安裝之后,將返回一個(gè)用來(lái)識(shí)別新創(chuàng)建映像的哈希值。這個(gè)值與你在前面啟動(dòng)MySQL容器時(shí)所使用的值類似。你可以使用php_box標(biāo)簽來(lái)運(yùn)行Apache和PHP映像,命令如下: docker run -d -t php_box。

  下面我們將以很簡(jiǎn)短例子結(jié)束這篇文章,這個(gè)例子說(shuō)明在已有的映像基礎(chǔ)上如何簡(jiǎn)單地創(chuàng)建新映像:

# MyApp## VERSION       1.0# use php_box base imageFROM php_box# specify the maintainerMAINTAINER Dirk Merkel, dmerkel@vivantech.com# put my local web site in myApp folder to /var/wwwADD myApp /var/www   第二個(gè)Dockerfile比第一個(gè)要簡(jiǎn)短,實(shí)際上它僅僅包含了兩條真正起作用的命令。首先通過(guò) FROM命令指定了啟動(dòng)的是php_box映像。然后使用 ADD命令拷貝本地一目錄到這個(gè)映像。在這個(gè)例子里,拷貝到映像的Apache的DOCUMNET_ROOT文件夾的是一個(gè)PHP項(xiàng)目。最終得到的結(jié)果是:?jiǎn)?dòng)這個(gè)映像的時(shí)候默認(rèn)會(huì)啟動(dòng)這個(gè)服務(wù)站點(diǎn)。

  總結(jié)
  輕量級(jí)應(yīng)用及其依賴打包和部署工具Docker的出現(xiàn)是令人激動(dòng)的事情,Linux社團(tuán)很快采納了它,而且還試著在生產(chǎn)環(huán)境中使用。例如,Red Hat在12月就宣布將在即將發(fā)布的Red Hat Linux企業(yè)版7里支持Docker。然而,Docker仍然是一個(gè)年輕的項(xiàng)目,而且正在飛速發(fā)展中?吹紻ocker項(xiàng)目發(fā)布1.0版本將是多么令人激動(dòng)的時(shí)刻,1.0版本將是官方批準(zhǔn)的用于生產(chǎn)環(huán)境的第一個(gè)版本。Docker依靠的現(xiàn)有的技術(shù),其中一些技術(shù)已經(jīng)具有十幾年的歷史了,但這并不意味著它沒有任何創(chuàng)新。我希望這篇文章能給你足夠多有關(guān)Docker的信息,并鼓勵(lì)你下載Docker,親自試一下。

  Docker最新進(jìn)展
  在這篇文章發(fā)布的時(shí)候,Docker團(tuán)隊(duì)發(fā)布了版本0.8。最新的發(fā)布增加了對(duì)Mac OS X的支持,它有兩個(gè)組件組成?蛻舳丝梢赃\(yùn)行在OS X操作系統(tǒng)上,而Docker服務(wù)進(jìn)程則運(yùn)行在由boot2docker管理的輕量級(jí)VirtualBox虛擬機(jī)上,其中也包含命令行客戶端。由于底層技術(shù),比如LXC和命名空間得不到OS X的支持,所以這么做就是必然的選擇。我認(rèn)為大家都在期待有類似的方案能用在其他平臺(tái)上,比如Windows上。

  版本0.8還引入了幾個(gè)新的構(gòu)建特性,并試著提供對(duì)二叉樹型文件系統(tǒng)的支持(BTRFS)。BTRFS是另一個(gè)即寫即拷貝的文件系統(tǒng),另外BTRFS存儲(chǔ)驅(qū)動(dòng)用來(lái)替代AuFS驅(qū)動(dòng)。

  尤其值得一提的是: Docker 0.8修補(bǔ)了許多程序漏洞,強(qiáng)化了性能?偟奶峤粩(shù)量說(shuō)明Docker團(tuán)隊(duì)為了生成可用于生產(chǎn)環(huán)境的發(fā)布版1.0所做的努力。因?yàn)镈ocker團(tuán)隊(duì)是每個(gè)月進(jìn)行提交的,我們期望在4-5月份這個(gè)時(shí)間窗口發(fā)布1.0版本。


資源   Docker主站點(diǎn): https://www.docker.io
Docker注冊(cè)中心: https://index.docker.io
Docker注冊(cè)中心相關(guān)的API: http://docs.docker.com/reference/api/registry_api/
Docker Hub API :http://docs.docker.com/reference/api/docker-io_api/
  Docker遠(yuǎn)端應(yīng)用API:http://docs.docker.com/reference/api/docker_remote_api/

  注解:由于翻譯完成時(shí)Docker Index API已經(jīng)更改為Docker Hub API,因此就采用的新的API。























您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP