你很有可能在濫用Docker
導讀 | Docker易伸縮,Container越來越大,各種版本的沖突不斷,安裝包管理器是怎么處理的,如果還在為這些頭疼,還在有這些疑問,可以了解一個小工具——Nix |
@Container容器技術大會將于6月4日在上海光大會展中心國際大酒店舉辦,來自Rancher、攜程、PPTV、螞蟻金服、京東、浙江移動、海爾電器、唯品會、eBay、道富銀行、麻袋理財、土豆網、阿里百川、騰訊游戲、點融網、華為等公司的技術負責人將帶來實踐經驗分享,4月7日之前購票只需338元,歡迎感興趣的同學搶購。
Docker是作為一個可以容易伸縮應用的工具而開始的,一般會被用作SaaS平臺的建設(Docker是dotCloud的一部分,一個提供PaaS服務的平臺)。
今天Docker經常被用于分配應用程序,而不是僅僅易于擴展,如果你只是在開發環境下用Docker,只是用它來復制你的開發環境,那你很有可能沒有用到Docker的易擴展性。
糟糕的軟件分配
Docker經常被用在分配應用程序上,因為現在分配應用程序是一件很糟糕的事情。先讓我們看看日常我們能接觸到的包管理器:yum、apt-get、npm、composer、gem、cabal等等。每一種語言的生態里都有自己的包管理器。基本上這些包管理器都做著同樣的事情:解決依賴性確保應用程序可用。一般意味著要下載二進制文件,將其放在PATH,亦或者下載JavaScript源碼使之可用于正在運行的環境中。
許多包管理器把安裝包存在一個全局可變的目錄下。例如 /usr/local/bin。現在如果說我們有應用A,依賴于Ruby 1.8.1安裝在了/usr/local/bin同時在PATH下可用。假如我們現在要安裝不同的應用B,其需要依賴于Ruby 2.2.1 ,因此我們得去升級Ruby。那么現在應用A因為其不能兼容新的Ruby版本就要被破壞了。即因為安裝B我們不得不破壞A。換句話說就是安裝包是有副作用的。這是由于全局可變的目錄。
由于這些副作用你不能僅僅考慮你安裝的東西了。你不得不去擔憂會破壞你現有的設置。當然這其實也就是容器的可貴之處:你可隨意實驗同時重啟容器,就像你可以只運送蛋糕,而不是配方,來避免那些副作用。這也意味著這些東西我們只要運行就能立即工作。并沒有那些因為依賴產生的錯誤。
不好的一面就是容器體積會越來越大。意味著部署會越來越慢變成一個更慢的工具。容器通常包含著整個系統。想想看:你運行的操作系統僅僅是運行著自己的操作系統。雖然看起來不是很好,但是有副作用也不是什么好的做法。
歡迎來到未來:Nix
Nix是一個打破全局可變目錄的包管理器,引用Nix網站的一段話:
Nix的一個純粹的功能就是確保安裝或更新包的時候不破壞其它包。 這是因為它不會用較新的版本覆蓋依賴關系,而導致其他地方被損壞。同時它還支持回滾,確保安裝包在更新的時候不會出現不一致的情況。
讓我們回顧一下剛才應用A和B的例子。Nix可以說“A只需要Ruby 1.8.1”同時“B只需要Ruby 2.2.1”。Nix可以讓應用程序運行在特定的應用環境里。就像是A在他的PATH中有Ruby 1.8.1,B在他的PATH中有Ruby 2.2.1 。
在Nix的管理下安裝包將不再有所謂的副作用。兩個不同的Ruby可以同時運行,是因為這里有一個典型的包管理意義上的全局目錄(使用nix-env, https://nixos.org/nix/manual/#sec-nix-env 。但是這是用戶,而不是應用程序。)。這個特有的功能將不斷的往全局目錄里邊塞東西。但是Nix并沒有添加其到PATH中。要使用的話得明確的告訴Nix,不然包還是不可用的。
因為Nix是免費的沒有副作用,你不需要容器來獲得可重復的構建。Nix去除包管理的缺點,從而取代了現在Docker的作用。當你可以用Nix更換整個容器時,你不需要第二次來更換操作系統與您的容器。
有一些情況,其中容器是有意義的。前面已經說了用Docker擴展軟件很容易。但大多數Docker使用者不擁有這些類型的問題。他們賦予Docker一種“它只是工作”的感覺。
Docker和Nix并不互相違背。您可以使用Nix來構建你的Docker鏡像。現在,你的開發人員可以運行軟件,而無需使用Docker,因為他們可以得到相同的設置作為其本地機器上運行,而生產安裝使用Docker,方便的縮放的容器。
小貼士
Docker是用于伸縮的,但被濫用來分發可重復的構建。其原因是:包管理器因為這會導致副作用可變全局狀態不可預測的。使用像Nix一個很好的包管理器可重復建立你的軟件,你最有可能不需要Docker了。一個好的包管理器可以讓你任意玩卻不破壞環境,就像容器做的那樣。
了解更多關于Nix在 https://nixos.org/nix/about.html ,你不會后悔的。