Docker Compose 原理

Docker 的優點很是明顯,尤爲是對於開發者來講,它提供了一種全新的軟件發佈機制。也就是說使用 docker 鏡像做爲軟件產品的載體,使用 docker 容器提供獨立的軟件運行上下文環境,使用 docker hub 等提供鏡像的集中管理,這其中最重要的是使用 Dockerfile 定義容器的內部行爲和關鍵屬性來支持軟件運行。可是實際的生產環境每每須要定義數量龐大的 docker 容器,而且容器之間具備錯綜複雜的聯繫。手動的記錄和配置這些複雜的容器關係,不只效率低下並且容易出錯。因此,咱們迫切須要一種像 Dockerfile 定義 docker 容器同樣可以定義容器集羣的編排和部署工具。因而,Docker Compose 出現了(其實應該說 Fig 出現了,docker 收購了 Fig 並更名爲 compose)。
Dockerfile 重現一個容器,compose 則用來重現容器的集羣。
說明:本文的演示環境爲 ubuntu 16.04。html

編排和部署

編排(orchestration)
編排指根據被部署的對象之間的耦合關係,以及被部署對象對環境的依賴,制定部署流程中各個動做的執行順序,部署過程所須要的依賴文件和被部署文件的存儲位置和獲取方式,以及如何驗證部署成功。這些信息都會在編排工具中以指定的格式(好比配置文件或特定的代碼)來要求運維人員定義並保存起來,從而保證這個流程可以隨時在全新的環境中可靠有序地重現出來。redis

部署(deployment)
部署是指按照編排所指定的內容和流程,在目標機器上執行環境初始化,存放指定的依賴文件,運行指定的部署動做,最終按照編排中的規則來確認部署成功。docker

因此說,編排是一個指揮家,他的大腦裏存儲了整個樂曲此起彼伏的演奏流程,對於每個小節每一段音樂的演奏方式都瞭然於胸。而部署就是整個樂隊,他們嚴格按照指揮家的意圖用樂器來完成曲譜的執行。最終,二者經過協做就能把每一位演奏者獨立的演奏經過組合、重疊、銜接來造成高品位的交響樂。這也是 docker compose 要完成的使命。ubuntu

Compose 原理

筆者在前文《Docker Compose 簡介》中演示了官方的示例,本文再也不贅述,接下來咱們去探索 compose 的工做原理。先來了解兩個 compose 中經常說起的概念:數據結構

project
經過 docker compose 管理的一個項目被抽象稱爲一個 project,它是由一組關聯的應用容器組成的一個完整的業務單元。簡單點說就是一個 docker-compose.yml 文件定義一個 project。
咱們能夠在執行 docker-compose 命令時經過 -p 選項指定 project 的名稱,若是不指定,則默認是 docker-compose.yml 文件所在的目錄名稱。運維

service
運行一個應用的容器,實際上能夠是一個或多個運行相同鏡像的容器。能夠經過 docker-compose up 命令的 --scale 選項指定某個 service 運行的容器個數,好比:工具

$ docker-compose up -d --scale redis=2

瞭解了上面的基本概念以後,讓咱們一塊兒看看 compose 的一次調用流程:spa

右上角的 docker-compose 定義了一組 service 來組成一個 project,經過 docker-compose.yml 中 service 的定義與 container 創建關係(service 與容器的對應關係),最後使用 container 來完成對 docker-py(Python 版的 docker client) 的調用,向 docker daemon 發起 http 請求。注意,這裏的 project, service 和 container 對應的都是 docker-compose 實現中的數據結構。下面讓咱們結合上圖來介紹 docker-compose 工做的大體流程。命令行

首先,用戶執行的 docker-compose up 命令調用了命令行中的啓動方法,功能很是簡單。一個 docker-compose.yml 文件定義了一個 project,docker-compose up 提供的命令行參數則做爲這個 project 的啓動參數交由 project 模塊處理。3d

而後,若是當前宿主機已經存在與該應用對應的容器,docker-compose 則進行行爲邏輯判斷。若是用戶指定能夠從新啓動已有服務,docker-compose 就會執行 service 模塊的容器重啓方法,不然就直接啓動已有容器。這兩種操做的區別在於前者會中止舊的容器,建立並啓動新的容器,並把舊容器移除掉。在這個過程當中建立容器的各項自定義參數都是從 docker-compose up 命令和 docker-compose.yml 中傳入的。

接下來,啓動容器的方法也很簡潔,這個方法中完成了一個 docker 容器啓動所需的主要參數的封裝,並在 container 模塊執行啓動。

最後,contaier 模塊會調用 docker-py 客戶端來執行向 docker daemon 發起建立容器的 POST 請求。

因而可知 docker-compose 工做的總體流程很是清晰、簡潔!

從新啓動 services

前面咱們提到當前宿主機已經存在與該應用對應的容器,docker-compose 會進行判斷並決定是否從新啓動已有服務。下面咱們就經過 demo 來演示幾個常見的場景(咱們依然使用前文中提到的官方 demo)。

強制 recreate
Recreate 就是刪除現有的容器而且從新建立新的容器,爲 docker-compose up 命令指定 --force-recreate 選項能夠強制 recreate 容器:

建立個別容器
若是應用中的個別 service 對應的容器被刪除了,docker-compose up 命令會新建相關的容器:

啓動個別容器
與上面相似,若是應用中的個別 service 對應的容器被中止(stop)了,docker-compose up 命令會從新啓動相關的容器:

總結

Docker-compose 整體上給人的感受是並不複雜。本文只是從概覽的角度梳理了一遍 docker-compose 的總體執行流程,主要目的是理解它的工做原理。至於相關的使用技巧等細節,筆者會在接下來的文章中進行介紹。

參考:
《Docker 容器和容器雲》

相關文章
相關標籤/搜索