什麼是 stack ?
在回答這個問題之前我們先回憶一下前面部署 WordPress 應用的過程:
首先建立 secret。
然後建立 MySQL service,這是 WordPress 依賴的服務。
最後建立 WordPress service。
也就是說,這個應用包含了兩個 service:MySQL 和 WordPress,它們之間有明确的依賴關系,必須先啟動 MySQL。
為了保證這個依賴關系,我們控制了 <code>docker secret</code> 和 <code>docker service</code> 指令的執行順序,隻不過這個過程是手工完成的。
假如我們需要頻繁地在不同環境中部署 WordPress 應用,如果每次都手工執行效率就太低了,而且容易出錯。這是自動化的一個好機會,首先我們能想到的就是把這個過程寫成腳本,大概内容如下:
稍微複雜一點的是第三步,通過 <code>if</code> 判斷 MySQL service 是否運作,如果是,則運作 WordPress service,否則通過 <code>while</code> 繼續等待,直到 MySQL 運作。
這個腳本大體上能夠工作,實作了自動化,但有兩個缺點:
目前隻有兩個 service,還比較簡單。現在的應用通常都包含多個 service,特别是采用 microservices 架構的應用,幾十個 service 是很正常的。用 shell 腳本啟動和管理如此多的 service 将是一件非常有挑戰的任務。
用 <code>while</code> 和 <code>if</code> 維護 service 之間的依賴關系也是很有挑戰的,容易出錯。而且如何判斷 service 正常運作也不是件容易的事,腳本中隻簡單檢查了 service 是否存在,并沒有考慮 service 的實際運作狀态。
我們希望有一種更高效和可靠的方法來部署基于 service 的應用,這就是 stack。
stack 包含一系列 service,這些 service 組成了應用。stack 通過一個 YAML 檔案定義每個 service,并描述 service 使用的資源和各種依賴。
如果将前面 WordPress 用 stack 來定義,YAML 檔案可以是這樣:
YAML 是一種閱讀性很強的文本格式,上面這個 stack 中定義了三種資源:service、secret 和 volume。
① <code>services</code> 定義了兩個 service:<code>db</code> 和 <code>wordpress</code>。
② <code>secrets</code> 定義了兩個 secret:<code>db_password</code> 和 <code>db_root_password</code>,在 service <code>db</code> 和 <code>wordpress</code> 的定義中引用了這兩個 secret。
③ <code>volumes</code> 定義了一個 volume:<code>db_data</code>,service <code>db</code> 使用了此 volume。
④ <code>wordpress</code> 通過 <code>depends_on</code> 指定自己依賴 <code>db</code> 這個 service。Docker 會保證當 <code>db</code> 正常運作後再啟動 <code>wordpress</code>。
stack 的 YAML 有了,下一節我們學習 stack 的相關操作。
書籍:
1.《每天5分鐘玩轉Docker容器技術》
<a href="https://item.jd.com/16936307278.html" target="_blank">https://item.jd.com/16936307278.html</a>
2.《每天5分鐘玩轉OpenStack》
<a href="https://item.jd.com/12086376.html" target="_blank">https://item.jd.com/12086376.html</a>
本文轉自CloudMan6 51CTO部落格,原文連結:http://blog.51cto.com/cloudman/2054990