Docker是一種讓人能更加容易使用、部署以及運行Container的工具,Container使開發人員能夠只打包所需服務與其依賴的套件,並將打包後的結果進行部署,並且該應用程序能夠在任何平台上執行(linux, windows, unix...),且由於Docker為開源專案,這意味著任何人都能對Docker做出貢獻,並commit所缺失之功能與bugs的修正。
所以
Docker engine 主要用來運行Container,而它由三大組件所組成,分別為Docker daemon、REST API與CLI
Docker daemon是一個長時間運行的服務,經由他來進行container的啟動、停止與刪除...等各項動作。通常使用者都是通過預設路徑為/var/run/docker.sock(Unix domain socket) 來與Docker daemon進行溝通。
REST API相信大家都不陌生,Docker內透過REST的架構來進行Client與Server的溝通。
但這部分範圍稍稍超出新手的程度,所以我會將相關連結貼在reference,有興趣的人在參考看看。
使用者能夠在command line上透過docker所制定好的命令,去告知Docker daemon以此操作Container。
Client透過docker command來進行container的操作,Host在接受到命令同時,會去確認本地的image是否存在與版本是否正確,若無此版本的Image則去使用者所選之Registry(像是 Docker hub, Google, Google Registry..etc)進行pull image動作,並執行Client想執行之Container操作。
Docker底層主要依賴於Linux kernal以及其現有技術所衍生而已。
Docker底層技術由四個部分組成: Namespace、Control groups、Union file systems及Container format
命名空間有著以下幾個功能。
依據不同功能,Namespace會將相關的process分為一組並放同個namespace當中,同一namespace中的processes能互相溝通,但無法與其他namesapce中的processes溝通。
Control groups又稱cgroups,用來限制與管理Container的資源配置與限制(像是cpu, memory..etc)。每個Container生成時,Docker daemone都會生成一相對應的cgroups來記錄其resource的使用情況,當使用者透過cli或是api來限制資源時,也會記錄在cgroups當中。
Union File System(UFS)將多個目錄結合成一個目錄,並只以最上層為讀寫層提供外界使用(下面只會有一或多個讀層),藉此增加容器建構的效率。
Docker engine 將上述三種技術包裝成一種容器格式,並默認格式為libcontainer,後續可能會加入其他格式,像是BSD Jails 或 Solaris Zones。
若想在細讀上述技術是如何實現,建議在對Docker有一定掌握度後再回來看會比較好。
本章節後,各位讀者應該了解了Docker的原理以及Docker想要達成的願景。在下一章節會開始帶著大家下載並使用Docker,敬請期待!
https://docs.docker.com/get-started/overview/
https://docs.docker.com/engine/api/sdk/
https://docker-py.readthedocs.io/en/stable/