遠(yuǎn)離 Docker 的五大陷阱
Docker在廣大開(kāi)發(fā)人員和行業(yè)專業(yè)人士當(dāng)中仍然是個(gè)熱門(mén)話題。先簡(jiǎn)要介紹一下Docker的功能:它作為一個(gè)容器系統(tǒng)來(lái)運(yùn)行,拿來(lái)運(yùn)行軟件應(yīng)用程序所需的構(gòu)建模板(代碼、運(yùn)行時(shí)環(huán)境、系統(tǒng)工具和系統(tǒng)庫(kù))后,將它們包裝成可以在任何服務(wù)器上執(zhí)行的小巧程序包。Docker的優(yōu)點(diǎn)在于,能夠讓在一臺(tái)服務(wù)器上運(yùn)行的應(yīng)用程序?qū)嵗龜?shù)量比使用虛擬機(jī)這種方法多出兩三倍。就未來(lái)的應(yīng)用開(kāi)發(fā)而言,這是一種大有前景的工具,但是即便Docker已取得了令人難以置信的進(jìn)步,它依然存在諸多缺點(diǎn)。不妨看一下Docker的五大陷阱:
1. 多個(gè)Docker主機(jī)上的容器之間的聯(lián)網(wǎng)有待加強(qiáng)
Docker公司首席執(zhí)行官Solomon Hykes在LinuxCon大會(huì)上親口說(shuō)了這番話:Docker缺少容器之間的高層次聯(lián)網(wǎng)功能。問(wèn)題的一方面在于,Docker最佳實(shí)踐并不鼓勵(lì)在一個(gè)容器中運(yùn)行多個(gè)服務(wù);而這意味著與其他容器進(jìn)行聯(lián)系顯得至關(guān)重要。在大規(guī)模環(huán)境下,如果容器需要與可能不在同一個(gè)Docker主機(jī)上的其他容器進(jìn)行聯(lián)系,這可能成為一大問(wèn)題。由于許多應(yīng)用程序出于安全和功能的考量而需要特定的聯(lián)網(wǎng)環(huán)境,試圖解決這個(gè)大規(guī)模問(wèn)題時(shí),Docker的原生聯(lián)網(wǎng)功能多少受到了限制。
這個(gè)聯(lián)網(wǎng)問(wèn)題的另一個(gè)方面是,Docker缺少原生服務(wù)發(fā)現(xiàn)功能。由于應(yīng)用程序和服務(wù)可能有眾多廣泛的組件,如果我們談?wù)摯笠?guī)模應(yīng)用程序,服務(wù)發(fā)現(xiàn)功能變得必不可少。Docker社區(qū)在處理這個(gè)問(wèn)題,一個(gè)辦法就是實(shí)施etcd和skydns。
Docker 1.7推出了容器網(wǎng)絡(luò)管理項(xiàng)目libnetwork;雖然它仍處于早期階段,但是有望為解決原生Docker實(shí)施的網(wǎng)絡(luò)難題提供一種方案。此外,已成立了Weave等第三方項(xiàng)目,擴(kuò)展Docker的網(wǎng)絡(luò)功能,但是這只不過(guò)給旨在簡(jiǎn)化開(kāi)發(fā)、讓開(kāi)發(fā)應(yīng)用程序和復(fù)雜更容易的軟件增添了復(fù)雜性。
2. 規(guī)模擴(kuò)展
對(duì)大多數(shù)初創(chuàng)企業(yè)而言,規(guī)模在一開(kāi)始不是個(gè)問(wèn)題。實(shí)際上,許多公司可能根本不需要好多臺(tái)服務(wù)器來(lái)運(yùn)行應(yīng)用程序。然而,如果公司確實(shí)需要好多臺(tái)服務(wù)器運(yùn)行應(yīng)用程序,構(gòu)建Docker集群并非易事。許多項(xiàng)目圍繞這個(gè)主題而日漸發(fā)展,包括Docker Swarm,Docker拿出的這個(gè)方案旨在將容器工作負(fù)載調(diào)度到Docker機(jī)器集群上。其主要問(wèn)題是,Docker Swarm還沒(méi)有準(zhǔn)備好用于生產(chǎn)環(huán)境;對(duì)于那些現(xiàn)在就想開(kāi)始構(gòu)建Docker集群的公司而言,它們目前的選擇很有限。
準(zhǔn)備好用于生產(chǎn)環(huán)境的一種選擇就是谷歌設(shè)立的項(xiàng)目:Kubernetes。其他選擇基于Apache Mesos,或者以集群為中心的Linux發(fā)行版(比如CoreOS)。這些解決方案有一個(gè)共同點(diǎn):安裝架設(shè)起來(lái)并不容易。谷歌可以幫助你:你可以在谷歌計(jì)算引擎服務(wù)(Google Compute Engine)上輕松構(gòu)建Kubernetes集群,但是那些想要構(gòu)建專用Docker集群的企業(yè)客戶又該如何是好?有一件事是肯定的,那就是構(gòu)建Docker集群需要更容易些,圍繞這方面的服務(wù)肯定會(huì)迅速涌現(xiàn)。
3. 安全
人們尚未就容器有多安全達(dá)成多大的一致,這本身就是個(gè)安全問(wèn)題。相比虛擬機(jī),容器提供的隔離和安全機(jī)制較弱。Docker的安全說(shuō)明文檔聲稱:
使用Docker運(yùn)行容器(及應(yīng)用程序)意味著要運(yùn)行Docker守護(hù)進(jìn)程。該守護(hù)進(jìn)程目前需要根權(quán)限。
Docker需要訪問(wèn)根才能正常運(yùn)行,而這意味著萬(wàn)一哪里出了岔子,有人大搞破壞的可能性會(huì)很大。為此,Docker給出的辦法就是限制Docker只能被“可信用戶”訪問(wèn),但大家都知道,連可信用戶有時(shí)也會(huì)設(shè)置安全性很差的密碼。用戶很容易做一些靠不住的事情,因?yàn)橹灰渲幸粋€(gè)薄弱的密碼被破解,主機(jī)上的所有容器就會(huì)遭殃。
雖然Docker能夠?qū)⒌讓又鳈C(jī)的許多方面與容器中運(yùn)行的應(yīng)用程序隔離開(kāi)來(lái),但這種隔離不如虛擬機(jī)來(lái)得強(qiáng)大。
NCR公司的安全專家Lenny Zeltzer強(qiáng)調(diào)了安全方面的差異:虛擬機(jī)在虛擬機(jī)管理程序上運(yùn)行獨(dú)立的操作系統(tǒng)實(shí)例,并不與底層操作系統(tǒng)共享內(nèi)核。最終,只要黑客獲得了容器操作系統(tǒng)的根訪問(wèn)權(quán),隨后就能夠訪問(wèn)在Docker主機(jī)上以根用戶身份運(yùn)行的Docker守護(hù)進(jìn)程――這確實(shí)可能會(huì)引起大麻煩。Docker的安全仍不成熟,也許更糟。
4. 并非適合每個(gè)人
Docker的現(xiàn)狀會(huì)要求用戶具備比普通開(kāi)發(fā)人員更多的系統(tǒng)管理知識(shí)/技巧來(lái)使用Docker。許多Docker文章聲稱使用場(chǎng)合簡(jiǎn)單,卻忽視了在多主機(jī)系統(tǒng)上使用Docker的復(fù)雜性。這可能會(huì)誤人子弟,好多人不知道在開(kāi)發(fā)環(huán)境下運(yùn)行Docker實(shí)際需要什么。
在開(kāi)發(fā)環(huán)境下使用Docker實(shí)際上需要開(kāi)發(fā)人員在系統(tǒng)管理方面具備扎實(shí)的基礎(chǔ),學(xué)習(xí)過(guò)程可能很困難。換句話說(shuō),這根本不如想象的來(lái)得簡(jiǎn)單。
管理生產(chǎn)環(huán)境下的Docker需要具備還要多的技能。必須認(rèn)真考慮諸多變化因素,比如:管理容器日志及數(shù)據(jù)、多個(gè)主機(jī)之間的聯(lián)系、私有映像庫(kù)、在沒(méi)有停機(jī)的情況下指導(dǎo)容器部署以及更多變數(shù)。
5. 容器vs虛擬機(jī)
沒(méi)錯(cuò),相比虛擬機(jī),容器具有明顯的優(yōu)點(diǎn):能夠在服務(wù)器實(shí)例上運(yùn)行多個(gè)服務(wù)器實(shí)例,又不會(huì)減慢運(yùn)行速度。而這種速度可能以降低了穩(wěn)定性、安全性和兼容性為代價(jià)。在內(nèi)核和用戶空間中運(yùn)行不相兼容或未經(jīng)測(cè)試的實(shí)例會(huì)導(dǎo)致意想不到的行為。
虛擬機(jī)管理程序的性能比以往任何時(shí)候都要高;按需配置的虛擬機(jī)日益變得速度越來(lái)越快,成本越來(lái)越低。虛擬化性能大不一樣,具體取決于工作負(fù)載的類型;繁重密集的應(yīng)用程序顯然會(huì)導(dǎo)致性能較低。這種情況下,容器化是一種比較好的方法,但是你應(yīng)該使用容器以滿足具體情況下的要求,不然可能不值得為了速度提升而冒風(fēng)險(xiǎn)。
Docker在更容易、更高效地、更快速地包裝和交付應(yīng)用程序方面確實(shí)大有希望。不管怎樣,缺點(diǎn)相當(dāng)明顯,與現(xiàn)代虛擬機(jī)相比更是如此。撇開(kāi)所有批評(píng)的聲音,Docker正致力于為未來(lái)應(yīng)用開(kāi)發(fā)不斷改進(jìn)和創(chuàng)新,它已經(jīng)迎來(lái)了1.8版本,正有條不紊地解決這些問(wèn)題。