Docker真的萬能嗎?看這一篇就夠了
Docker并不是容器,而是創建容器的工具,是應用容器引擎。其實看它的兩句口號就可以很容易的理解它。第一句是“Build, Ship and Run”翻譯過來便是“搭建、發送、運行”;第二句是“Build once,Run anywher”也就是只要搭建一次,到處都能用。比如你想在一片空地上蓋房子,但你需要很多步驟才能將這個房子蓋好,可是住了一段時間后你卻想搬家了,只能重新蓋房子。
Docker就像一個魔法,可以把你原本蓋好的房子復制了放進背包里然后粘貼到另一個空地,其實就是“鏡像”。Docker的三大核心概念分別是鏡像(Image)、容器(Container)、倉庫(Repository)。鏡像不包含任何動態數據,其內容在構建之后也不會被改變。每個人生成的不同鏡像,可以互相交換,最終它就變成了一個公共倉庫。
使用Docker時候,你會發現它真的是個寶藏,可以秒級開啟應用,不用特別繁瑣的配置什么,可以減輕很多這種重復性的勞動。Docker不適合虛擬化桌面,它比較適合linux族,Unix族以及應用程序的虛擬化。邏輯是這樣的,在操作系統的概念里面,有一個內核,docker是基于Linux 內核,它不適用于Windows虛擬化,Windows操作系統有另外一個虛擬技術Hype-y。
Docker有一些缺點,表面上很方便,實際上工具鏈之間的銜接略微糟糕。它將linux的namespace做了深層次的封裝,用戶上手的難度低,部署到生產環境也很容易。但僅限于小型項目,換成稍微復雜一些的項目,依賴關系非常多的話,就能發現它會出現各種奇怪的bug。比如docker-compose之間的依賴不會等待被依賴者加載完畢,掛載volume有時會無法在entrypoint或command中執行命令,必須要用COPY等等,變得復雜和難以維護。
在進行多機部署的時候,跟著官方文檔走都不能成功,上stackoverflow和github上查了半天也查不到任何解決辦法,是經常發生的事情。Docker確實可以降低了運維難度,但是運營成本卻提升了。它最大的一個缺點是十分吃硬盤。Docker封裝的namespace,并沒有對文件進行進一步的管理,只是粗暴的將文件到處復制粘貼。當服務器上開了數百個容器后發現1TB的硬盤被吃掉了一半時,意味著需要不停增加服務器資源才能維持系統的運行。除了磁盤空間的占用外,作為一名中國用戶,時區、墻等都是問題。
當然所有問題都是可以解決的,只是比較浪費時間。毋庸置疑Docker是個非常酷的工具,它的優點還是遠大于缺點的。但它并不是萬能的,當你遇到架構簡單,類似數據庫+應用程序這種情況可以不用Docker,業務上Docker會占用太多資源的時候也可以考慮不用,因為服務器資源挺貴。