傳統的服務部署方案存在很多問題。docker 能夠很好的解決這些問題,所以我們應該使用 docker 來部署服務,後文我們將一一論述這些問題,並看看 docker 如何解決這些問題。
所以不會 docker 的去學吧,不然人家都激光時代了,你還在石器時代,直接退網不要玩了。
安裝服務套件複雜
安裝一個服務套件難易度是不可控的,一些簡單的套件直接輸入一條命令即可安裝完成,但一些複雜套件可能需要解決各種依賴或者還要自己編譯。並且一些依賴可能無法解決,例如套件需要運行在一個與你宿主機不兼容的系統上。
對此 docker 則沒有這一問題,基本上一條指令運行指定 image 就安裝完成。
此兩種差異在於套件在不同系統需要不同的環境設定和依賴,而 docker 屏蔽了這一問題,它使用虛擬化技術模擬了一個系統環境,套件發佈者可以直接創建一個 docker image 並設置好套件需要的一切,docker 用戶只需要執行這個 image 即可。
混亂不堪的檔案路徑
不同的套件服務,通常存在設定檔案和數據檔案,設定檔案控制了服務如何運行,數據檔案存儲了服務運行的數據。
但是每個服務的檔案路徑是不同的,這完全由套件本身的代碼決定。這存在兩個問題:
- 大量設定檔案分散在不同位置,調整服務時不好尋找
- 要備份設定和數據檔案很麻煩,因爲不同套件的檔案路徑不同
使用 docker 則完美解決這一問題,docker提供了 volume 它將宿主機的磁盤映射到 image 中。
以本喵爲例會在宿主機下創建兩個檔案夾:
- $HOME/docker 下面依據服務名稱存儲了各種服務的設定檔案
- /opt/data 下面依據服務名稱存儲了各種服務數據
這樣當需要修改設定時,直接去 $HOME/docker 下面即可快速定位。而當需要備份時只需要直接將這兩個檔案夾備份即可。
同一服務運行多個副本
以 mysql 數據庫爲例,直接安裝到宿主機你很難運行兩個副本。但使用 docker 你簡單的運行兩個 mysql 的 image 即可。這是相當實用的功能。
例如很多服務都需要數據庫支持。如果只能創建一個數據庫,你所有服務的數據都存儲在一起,你很難單獨備份,並且它們訪問時的全局鎖也會相互響應,但我們知道它們是完全不同服務數據庫絕對不會出現鎖的問題。此外一個服務導致的數據庫損毀可能會影響到其它服務數據。
隔離性
如果服務存在bug,安裝在宿主機的服務會直接影響服務,如果是一個遠程訪問bug你的服務器就直接被hacker掌控了。但對於docker 中的服務,受影響的只有這個docker 不會影響到宿主機和其它服務
你還可以隨便在 docker 裏面做危險的實驗,它不會影響到宿主(除了通過 volume 映射進來的磁盤,或者佔用過多的cpu,但通常沒有不可逆的損毀)
當然 docker 也不是絕對安全,但它無疑比宿主機直接部署安全