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