Docker該如何得到開發(fā)者和系統(tǒng)管理員的共同認(rèn)可
譯文將Docker作為應(yīng)用程序容器管理系統(tǒng)已經(jīng)在最近兩年當(dāng)中成為眾多開發(fā)人員及系統(tǒng)工程師們的標(biāo)準(zhǔn)實(shí)踐方式。有一部分朋友甚至表示,容器方案是自O(shè)penSSH之后最為可觀且值得肯定的技術(shù)飛躍。Docker目前已經(jīng)成為技術(shù)領(lǐng)域當(dāng)之無愧的新生力量,且被廣泛應(yīng)用于各類云系統(tǒng)架構(gòu)當(dāng)中。然而除此之外,Docker還需要了解如何贏得開發(fā)人員們的芳心。
下面我們將一起了解Docker的發(fā)展歷程,未來將要面對的競爭形勢以及對發(fā)展前景的預(yù)估。
那么,Docker到底是什么?
Docker是一款使用libcontainer的微容器管理工具。作為Solomon Hykes利用Go語言開發(fā)而成的項(xiàng)目,Docker于2013年轉(zhuǎn)入開源并被快速應(yīng)用在諸多領(lǐng)域當(dāng)中。這款工具的出色靈活性甚至使其成為游戲規(guī)則的改變者。
在Docker出現(xiàn)之前,創(chuàng)建一套應(yīng)用程序容器需要掌握多種相對比較先進(jìn)的概念。LXC已經(jīng)在這一領(lǐng)域占據(jù)了相當(dāng)可觀的市場份額,其賣點(diǎn)在于提供“純虛擬化”解決方案并借此賺取利潤。OpenVZ與Xen也在市場上擁有一定地位。不過這些系統(tǒng)在設(shè)計(jì)方面仍然很大程度上面向服務(wù)器解決方案,而且需要配合相當(dāng)程度的配置工作。
這里我們要澄清一點(diǎn):Docker的作用并不是取代LXC、OpenVZ或者Xen。它也并不是一套像KVM、VirtualBox以及VMware那樣的虛擬化解決方案。Docker擁有屬于自己的定位視角、獨(dú)特的運(yùn)作方式而且具備完全不同的功能出發(fā)點(diǎn)。
與OpenVZ、Xen以及LXC一樣,Docker也采用rootfs原則——這實(shí)際上就是一套root文件系統(tǒng)。它采用樹狀結(jié)構(gòu)作為遠(yuǎn)程系統(tǒng)的root(類似于chroot的作用),同時提供網(wǎng)絡(luò)層與設(shè)置系統(tǒng)。但它同時也有著自己的一些獨(dú)特設(shè)計(jì)。
首先,它的鏡像與容器通過union mount文件系統(tǒng)(例如aufs以及devicemapper等)進(jìn)行分層。這一方面節(jié)約了磁盤存儲空間,另一方面也能夠幫助我們在無需復(fù)制整套root的前提下快速構(gòu)建容器環(huán)境。
另一大差異在于,Docker回避了訪客系統(tǒng)當(dāng)中的初始化步驟。換句話來說,容器的root只會被用作指定應(yīng)用程序的運(yùn)行環(huán)境。
***,Docker擁有對鏡像版本的注冊與控制能力,這也正是其步入標(biāo)準(zhǔn)化的重要標(biāo)志。在默認(rèn)情況下,Docker會使用公共注冊表。該注冊表提供多套現(xiàn)成可用的鏡像(既包括官方給出的正式鏡像,亦擁有由社區(qū)用戶提交的鏡像),同時也為后續(xù)付費(fèi)提供了實(shí)現(xiàn)空間。從理論層面講,Docker在很大程度上與Git類似,而其Hub則類似于GitHub這樣的服務(wù)方案。Docker同時采用多種常見概念,例如提交、標(biāo)簽以及遠(yuǎn)程注冊服務(wù)器等等。
圍繞Docker項(xiàng)目建立起的技術(shù)社區(qū)非?;钴S,其中提供大量用于自動啟動(fig,也就是現(xiàn)在的Docker Compose)、簡化云集成及管理流程(CoreOS)以及實(shí)現(xiàn)監(jiān)控任務(wù)(cAdvisor)的工具,而且這份工具清單還在不斷拓展。
時至今日,Docker已經(jīng)席卷了整個IT領(lǐng)域。OpenStack、Amazon、谷歌、CoreOS等等都在高度關(guān)注這項(xiàng)技術(shù)成果,甚至已經(jīng)將其整合到了自己的基礎(chǔ)設(shè)施當(dāng)中。
不過激烈的市場競爭也即將到來!
提高系統(tǒng)便捷度
Docker的主要訴求無疑在于簡化容器創(chuàng)建流程,從而更為便捷地實(shí)現(xiàn)微服務(wù)架構(gòu)管理。首先需要強(qiáng)調(diào)的是,容器本身其實(shí)是一種對應(yīng)用程序進(jìn)行完全隔離的手段。歸功于其libcontainer庫,Docker能夠在整個cgroup管理流程當(dāng)中始終實(shí)現(xiàn)內(nèi)存與線程的徹底隔離。
除非使用者進(jìn)行特殊指定,否則Docker不會開啟主機(jī)設(shè)備上的任何一個端口。如果兩套容器系統(tǒng)需要通過IP層進(jìn)行通信,它們可以彼此連通,從而直接利用容器名稱而非IP地址實(shí)現(xiàn)信息交互(因?yàn)镮P地址可能隨著容器重啟而發(fā)生變化)。
#p#
云規(guī)模伸縮
Docker已經(jīng)在云環(huán)境下獲得極高人氣,這主要是由于其極低的運(yùn)行資源需求、出色的分卷管理以及能夠顯著降低磁盤存儲空間需求的union mount文件系統(tǒng)。在研究Docker運(yùn)作機(jī)制的過程當(dāng)中,大家會發(fā)現(xiàn)我們能夠非常輕松地利用它創(chuàng)建出一套具備可擴(kuò)展性且/或高可用性的系統(tǒng)方案。
“docker”命令實(shí)際上是一種簡單的REST客戶端,旨在同daemon進(jìn)行通信。在默認(rèn)情況下,該服務(wù)(daemon)會創(chuàng)建一個unix socket(位置為/var/run/docker.sock)來提供該API。而“docker”命令將僅僅使用該API。
該API可以被用于監(jiān)聽各類事件,包括容器何時創(chuàng)建、啟用或者停止。利用該API所提供的信息,大家能夠輕松掌握哪套容器系統(tǒng)目前正在運(yùn)行哪種服務(wù)并使用哪個端口等等。
如果大家不打算或者沒有能力使用CoreOS、OpenStack等所要求的架構(gòu),那么也完全可以創(chuàng)建自己的架構(gòu)及工具——而且整個過程并不困難。該API相當(dāng)易于訪問且效率極高。
下面請大家一起來看我們當(dāng)前項(xiàng)目中的一個架構(gòu)示例:
我們采取以下規(guī)劃方式:
- 每臺物理從服務(wù)器都配備有一項(xiàng)發(fā)現(xiàn)服務(wù),用于監(jiān)聽該Dockers socket。
- 當(dāng)某套容器系統(tǒng)啟用或者停止時,該服務(wù)會將信息發(fā)送至主服務(wù)器。
該主服務(wù)器隨后能夠采納適當(dāng)?shù)拇胧?,例如修改nginx服務(wù)器配置或者刪除/移除一臺上流服務(wù)器等。
另一種選項(xiàng)則是對Docker的配置進(jìn)行修改,從而保證該API能夠在TCP模式下接受訪問(即使其擁有網(wǎng)絡(luò)可訪問能力)。在這種特定情況下,小型客戶端能夠與所有從服務(wù)器相對接,并監(jiān)聽其中發(fā)生的全部事件。不過這種方式的基本原則仍然相同:每個事件都將允許管理員在nginx當(dāng)中(假設(shè)使用nginx)對一臺上游服務(wù)器進(jìn)行添加或者刪除。
二者的差別在于,這里主服務(wù)器必須處理全部指向所有從服務(wù)器的連接。而前一種方式的運(yùn)行成本更低,因?yàn)樗袕姆?wù)器都接入到主服務(wù)器中。
在這兩類情況下,主服務(wù)器能夠在每一套容器系統(tǒng)啟用或者停止時得到通知,并可以修改主nginx服務(wù)器、重啟容器或者規(guī)避事故發(fā)生。
當(dāng)然,我們也可以同時設(shè)置兩臺主服務(wù)器來實(shí)現(xiàn)故障轉(zhuǎn)移管理。這種解決方案完全可行而且易于維護(hù)。
為開發(fā)人員行方便
毫無疑問,Docker非常適合系統(tǒng)管理員使用。但除此之外,它也能夠在生產(chǎn)流程當(dāng)中扮演重要角色,也就是面向開發(fā)人員。我們曾經(jīng)為客戶提供的一套解決方案就將Dockerfile與docker-compose文件結(jié)合在了一起(由Docker進(jìn)行fig項(xiàng)目的檢索)。
這一思路是首先定義開發(fā)人員的工作站在運(yùn)行項(xiàng)目時需要哪些必備要素,而后創(chuàng)建Dockerfile(如果需要)以建立有針對性的鏡像方案,同時將一個docker-compose.yml文件與這些容器相對接。
在此之后,當(dāng)使用版本控制服務(wù)器(例如Git、Mercurial以及SVN等等)時,大家可以輕松設(shè)置該項(xiàng)目目錄,從而將這些文件以及項(xiàng)目源代碼添加到其中,并為容器指定所要使用的存儲分卷。接下來,技術(shù)團(tuán)隊(duì)可以檢索該項(xiàng)目,而且只需要使用“docker-compose up”這一條命令即可啟用該服務(wù)。
讓我們以一個Drupal項(xiàng)目為例,在這里我們要使用兩套容器系統(tǒng):
- 一套MySQL容器
- 一套包含有Apache加PHP模塊的容器
Drupal的源代碼被旋轉(zhuǎn)在“/src”之下,并會被發(fā)送至Apache容器當(dāng)中。而這也正是分卷的基本原則:主機(jī)上的一個本地目錄或者文件可以被連接到特定目錄下的一套或者多套容器處。在此之后,大家可以利用同樣的方法處理MySQL存儲目錄,從而避免被保存在數(shù)據(jù)庫內(nèi)的記錄發(fā)生丟失。
下面是Dockerfile內(nèi)容示例:
- FROM debian:7
- MAINTAINER admin-dt@smile.fr
- # Install software
- RUN apt-get update && apt-get install apache2 php5 php5-mysql libapache2-mod-php5
- # Start Apache
- CMD /usr/sbin/apache2ctl -D FOREGROUND
接下來是docker-compose.yml文件內(nèi)容示例:
- web:
- dockerfile: .
- volumes:
- - "./src:/var/www/drupal
- ports:
- - "8080:80"
- links:
- - "db"
- db:
- image: mysql
- volumes:
- - "./data:/var/lib/mysql"
其中“web”服務(wù)被鏈接至“db”中(參閱以上示例中的‘links’命令),因此它能夠讀取用于提供MySQL地址及端口(由Dockerfile負(fù)責(zé)提供)的各環(huán)境變量。
#p#
舉例來說,以下變量皆可在“web”容器當(dāng)中接受訪問:
- DB_PORT_3306_TCP_ADDR=172.17.1.24
- DB_PORT_3306_TCP_PORT=3306
- 其它種種
大家當(dāng)然也可以使用其它容器稱,示例當(dāng)中的“web”與“db”代表的是兩套容器當(dāng)中的設(shè)備名稱。
換句話來說,“mysql://db”這一地址也可以變更。接下來,大家需要修改Drupal配置文件來訪問該數(shù)據(jù)庫,完成后工作到此結(jié)束。該項(xiàng)目將具備以下結(jié)構(gòu):
- ”data/”用于存儲MySQL數(shù)據(jù)
- ”src/”用于容納Drupal源代碼
- ”Dockerfile”用于創(chuàng)建Apache/PHP鏡像
- ”docker-compose.yml”用于描述容器的啟動方式
為了保證示例的簡單性,我們并沒有提到Apache配置文件以及各容器如何共享各個分卷。總結(jié)來講,就是這套Web服務(wù)器的配置可以隨意進(jìn)行修改。
大家可能還注意到,綁定的端口也已經(jīng)得到處理。由于開發(fā)人員用不著獲得使用端口80的權(quán)限,因此我們利用本地端口8080來映射Apache容器的端口80。開發(fā)人員只需要訪問127.0.0.1:8080即可查看當(dāng)前處于運(yùn)作狀態(tài)的Drupal實(shí)例。
為了理解這套對接體系,請大家參閱以下圖表。
競爭關(guān)系
就目前的形勢看,Docker似乎成了世界上惟一一項(xiàng)沐浴在贊美當(dāng)中的容器技術(shù)成果。然而請記住,Docker使用libcontainer與cgroups,這意味著為了能夠使用這些內(nèi)核的功能,該服務(wù)必須以root方式運(yùn)行。而這很可能招致安全問題。
這實(shí)際正是CoreOS以及其它同類方案批評Docker的主要著眼點(diǎn)——但值得一提的是,這項(xiàng)技術(shù)確實(shí)***吸引力,也支撐著CoreOS創(chuàng)建出了當(dāng)下***知名度的云系統(tǒng)方案之一。Docker需要root權(quán)限來接入cgroups,但以root角色運(yùn)行的服務(wù)確實(shí)很可能給系統(tǒng)造成安全漏洞。
Docker的開發(fā)團(tuán)隊(duì)就此給出過禮貌的回應(yīng)。很明顯,他們將在未來的版本升級當(dāng)中考慮這一問題,而且歡迎大家提出任何能夠解決這些缺陷的建議(不過迄今為止,Docker還沒真正惹出過任何麻煩)。不過各位讀者朋友別慌:這項(xiàng)漏洞被真正利用的可能性非常之低。截至目前,惟一一次安全問題出現(xiàn)在2014年的1.0版本當(dāng)中,而且現(xiàn)在問題已經(jīng)得到解決。
總而言之,CoreOS決定創(chuàng)建自己的一套容器系統(tǒng)(能夠使用Docker鏡像),名為Rkt(發(fā)音同火箭,即‘rocket’)。但就目前的情況看,大多數(shù)用戶將繼續(xù)在CoreOS解決方案的基礎(chǔ)之上使用Docker。就在Rkt剛剛發(fā)布之時,LinuxContainers(LXC背后的大型項(xiàng)目)亦宣稱計(jì)劃與Cannonical公司合作開發(fā)LXD。
如大家所見,容器管理領(lǐng)域的一舉一動都在盡可能向內(nèi)核靠攏,而由此帶來的結(jié)果就是其性能水平將不斷提升。
時間逐漸推移,容器的必要性也變得愈發(fā)凸顯。
但Windows與OS X又會如何?對于OS X來說,目前還沒有相關(guān)聲明出爐,更不存在任何產(chǎn)品可供選擇。因此,使用boot2docker(一套專門用于運(yùn)行Docker的虛擬機(jī))也就成了惟一的出路。Windows目前同樣需要依賴于boot2docker,不過微軟公司最近在聲明中指出,未來的微軟操作系統(tǒng)將直接納入容器機(jī)制。具體如何,我們將拭目以待……
總結(jié)陳詞
很明顯,Docker是一項(xiàng)適用于開發(fā)及系統(tǒng)管理工作的技術(shù)成果。它能夠不斷提供精簡效果并改善性能水平,同時具備良好的可行性,這一切使得用戶能夠以***的方式輕松建立服務(wù)。無論您的基礎(chǔ)設(shè)施到底處于何種規(guī)模,相信Docker都能助大家一臂之力。
除此之外,它的亮點(diǎn)也完全能夠體現(xiàn)在生產(chǎn)流程當(dāng)中。如今開發(fā)工作正變得日趨標(biāo)準(zhǔn)化,而開發(fā)人員與系統(tǒng)之間的界線也變得越來越精細(xì)。我們期待著Docker下個版本的正式降臨,希望到時候它能夠提供更具吸引力的競爭優(yōu)勢。
就目前來看,Docker仍然是容器領(lǐng)域的惟一王者。
原文標(biāo)題:How to get systems administrators and developers to agree with Docker