03-Why docker

論述了爲什麼應該使用 docker 來部署服務,而不是直接部署到宿主系統上。

傳統的服務部署方案存在很多問題。docker 能夠很好的解決這些問題,所以我們應該使用 docker 來部署服務,後文我們將一一論述這些問題,並看看 docker 如何解決這些問題。

所以不會 docker 的去學吧,不然人家都激光時代了,你還在石器時代,直接退網不要玩了。

安裝服務套件複雜

安裝一個服務套件難易度是不可控的,一些簡單的套件直接輸入一條命令即可安裝完成,但一些複雜套件可能需要解決各種依賴或者還要自己編譯。並且一些依賴可能無法解決,例如套件需要運行在一個與你宿主機不兼容的系統上。

對此 docker 則沒有這一問題,基本上一條指令運行指定 image 就安裝完成。

此兩種差異在於套件在不同系統需要不同的環境設定和依賴,而 docker 屏蔽了這一問題,它使用虛擬化技術模擬了一個系統環境,套件發佈者可以直接創建一個 docker image 並設置好套件需要的一切,docker 用戶只需要執行這個 image 即可。

混亂不堪的檔案路徑

不同的套件服務,通常存在設定檔案和數據檔案,設定檔案控制了服務如何運行,數據檔案存儲了服務運行的數據。

但是每個服務的檔案路徑是不同的,這完全由套件本身的代碼決定。這存在兩個問題:

  1. 大量設定檔案分散在不同位置,調整服務時不好尋找
  2. 要備份設定和數據檔案很麻煩,因爲不同套件的檔案路徑不同

使用 docker 則完美解決這一問題,docker提供了 volume 它將宿主機的磁盤映射到 image 中。

以本喵爲例會在宿主機下創建兩個檔案夾:

  • $HOME/docker 下面依據服務名稱存儲了各種服務的設定檔案
  • /opt/data 下面依據服務名稱存儲了各種服務數據

這樣當需要修改設定時,直接去 $HOME/docker 下面即可快速定位。而當需要備份時只需要直接將這兩個檔案夾備份即可。

同一服務運行多個副本

以 mysql 數據庫爲例,直接安裝到宿主機你很難運行兩個副本。但使用 docker 你簡單的運行兩個 mysql 的 image 即可。這是相當實用的功能。

例如很多服務都需要數據庫支持。如果只能創建一個數據庫,你所有服務的數據都存儲在一起,你很難單獨備份,並且它們訪問時的全局鎖也會相互響應,但我們知道它們是完全不同服務數據庫絕對不會出現鎖的問題。此外一個服務導致的數據庫損毀可能會影響到其它服務數據。

隔離性

如果服務存在bug,安裝在宿主機的服務會直接影響服務,如果是一個遠程訪問bug你的服務器就直接被hacker掌控了。但對於docker 中的服務,受影響的只有這個docker 不會影響到宿主機和其它服務

你還可以隨便在 docker 裏面做危險的實驗,它不會影響到宿主(除了通過 volume 映射進來的磁盤,或者佔用過多的cpu,但通常沒有不可逆的損毀)

當然 docker 也不是絕對安全,但它無疑比宿主機直接部署安全

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *