Container的歷史:
2000 年的時候 FreeBSD 開發了一個類似于 chroot 的容器技術 Jails,這是最早期,也是功能最多的容器技術。Jails 英譯過來是監獄的意思,這個“監獄”(用沙盒更為準確)包含了文件系統、用戶、網絡、進程等的隔離。
2001 Linux 也發布自己的容器技術 Linux VServer,2004 Solaris 也發布了 Solaris Containers,兩者都將資源進行劃分,形成一個個 zones,又叫做虛擬服務器。
2005 年推出 OpenVZ,它通過對 Linux 內核進行補丁來提供虛擬化的支持,每個 OpenVZ 容器完整支持了文件系統、用戶及用戶組、進程、網絡、設備和 IPC 對象的隔離。
2007 年 Google 實現了 Control Groups( cgroups ),并加入到 Linux 內核中,這是劃時代的,為后期容器的資源配額提供了技術保障。
2008 年基于 cgroups 和 linux namespace 推出了第一個最為完善的 Linux 容器 LXC。
2013 年推出到現在為止最為流行和使用最廣泛的容器 Docker,相比其他早期的容器技術,Docker 引入了一整套容器管理的生態系統,包括分層的鏡像模型,容器注冊庫,友好的 Rest API。
2014 年 CoreOS 也推出了一個類似于 Docker 的容器 Rocket,CoreOS 一個更加輕量級的 Linux 操作系統,在安全性上比 Docker 更嚴格。
2016 年微軟也在 Windows 上提供了容器的支持,Docker 可以以原生方式運行在 Windows 上,而不是需要使用 Linux 虛擬機。
為什么需要容器
其一,這是技術演進的一種創新結果,其二,這是人們追求高效生產活動的一種工具。
隨著軟件開發的發展,相比于早期的集中式應用部署方式,現在的應用基本都是采用分布式的部署方式,一個應用可能包含多種服務或多個模塊,因此多種服務可能部署在多種環境中,如虛擬服務器、公有云、私有云等,由于多種服務之間存在一些依賴關系,所以可能存在應用在運行過程中的動態遷移問題,那這時如何保證不同服務在不同環境中都能平滑的適配,不需要根據環境的不同而去進行相應的定制,就顯得尤為重要。
injection:
在軟件工程中,依賴注入是一種技術,其中一個對象(或靜態方法)提供另一個對象的依賴關系。依賴項是可以使用的對象(服務)。注入是將依賴項傳遞給將使用它的依賴對象(客戶端)。該服務是客戶所在端的一部分。將服務傳遞給客戶端,而不是允許客戶端構建或找到服務,是模式的基本要求。
Dependency Injection (DI) 就是在類之間的互相引用,都采用Interface來代替。后臺有Container,每個Interface包含一個Object,實際上這是一個Singleton的概念,所以在使用Singleton的時候,要避免使用DI,雖然DI支持非Singleton,但是感覺邏輯上不太符合常理。
優點:
A. 減少依賴關系通過Interface互相聯系,這樣兩個組件之間關聯少一些。
B. 更加方便重復使用只要是Interface相同,組件可以在不同的場合中重復使用。
C. 更容易測試Test 的代碼不需要和使用代碼有任何關聯,設置好Container,然后組件就自動生成。與正常運行,完全相同的測試環境,不需要考慮構造函數等等。
D. 更容易閱讀,需看Interface即可,一旦測試封裝結束后,不需要讀里面的代碼。
E. 減少Dependency Carry就是如果在最底層的引用某個變量,需要從最頂層一點點傳遞下來,如果用DI,就可以跳過中間部分。這個說得是Singleton,如果頂層的變量有一些特定的值,無法從Container中生成的話,就沒必要了。
?