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