大規(guī)模場景下的多服務(wù)部署和管理是一件很難的事情。
幸運(yùn)的是,Docker Stack 為解決該問題而生,Docker Stack 通過提供期望狀態(tài)、滾動升級、簡單易用、擴(kuò)縮容、健康檢查等特性簡化了應(yīng)用的管理,這些功能都封裝在一個完美的聲明式模型當(dāng)中。
在筆記本上測試和部署簡單應(yīng)用很容易。但這只能算業(yè)余選手。在真實的生產(chǎn)環(huán)境進(jìn)行多服務(wù)的應(yīng)用部署和管理,這才是專業(yè)選手的水平。
幸運(yùn)的是,Stack 正為此而生!Stack 能夠在單個聲明文件中定義復(fù)雜的多服務(wù)應(yīng)用。Stack 還提供了簡單的方式來部署應(yīng)用并管理其完整的生命周期:初始化部署 -> 健康檢查 -> 擴(kuò)容 -> 更新 -> 回滾,以及其他功能!
步驟很簡單。在 Compose 文件中定義應(yīng)用,然后通過 docker stack deploy 命令完成部署和管理。
Compose 文件中包含了構(gòu)成應(yīng)用所需的完整服務(wù)棧。此外還包括了卷、網(wǎng)絡(luò)、安全以及應(yīng)用所需的其他基礎(chǔ)架構(gòu)。然后基于該文件使用 docker stack deploy 命令來部署應(yīng)用。warm 之上來完成應(yīng)用的部署。因此諸如安全等高級特性,其實都是來自 Swarm。
簡而言之,Docker 適用于開發(fā)和測試。Docker Stack 則適用于大規(guī)模場景和生產(chǎn)環(huán)境。
如果了解 Docker Compose,就會發(fā)現(xiàn) Docker Stack 非常簡單。事實上在許多方面,Stack 一直是期望的 Compose——完全集成到 Docker 中,并能夠管理應(yīng)用的整個生命周期。
從體系結(jié)構(gòu)上來講,Stack 位于 Docker 應(yīng)用層級的最頂端。Stack 基于服務(wù)進(jìn)行構(gòu)建,而服務(wù)又基于容器,如下圖所示。
在后續(xù)的講解中會一直使用示例應(yīng)用 AtSea Shop。該示例托管在 Github 的 dockersamples/atsea-sample-shop-app 庫中,基于 Apache 2.0 許可證開源。
使用該應(yīng)用是因為其復(fù)雜度適中,不會因為太復(fù)雜而難以完整解釋。除此之外,該應(yīng)用還是個多服務(wù)應(yīng)用,并且利用了認(rèn)證和安全相關(guān)的技術(shù)。應(yīng)用架構(gòu)如下圖所示。
如上圖所示,該應(yīng)用由 5 個服務(wù)、3 個網(wǎng)絡(luò)、4 個密鑰以及 3 組端口映射構(gòu)成。具體細(xì)節(jié)將會結(jié)合 Stack 文件進(jìn)行分析。
提示:服務(wù)一詞時,指的是 Docker 服務(wù)(由若干容器組成的集合,作為一個整體進(jìn)行統(tǒng)一管理,并且在 Docker API 中存在對應(yīng)的服務(wù)對象)。
復(fù)制 Github 倉庫,以獲取全部源代碼文件。
$ git clone https://github.com/dockersamples/atsea-sample-shop-app.git Cloning
into 'atsea-sample-shop-app'...
remote: Counting objects: 636, done.
remote: Total 636 (delta 0), reused 0 (delta 0), pack-reused 636
Receiving objects: 100% (636/636), 7.23 MiB | 28.25 MiB/s, done.
Resolving deltas: 100% (197/197), done.
該應(yīng)用的代碼由若干目錄和源碼文件組成。讀者可以隨意瀏覽這些文件。但是接下來,重點關(guān)注的文件是 docker-stack.yml。該文件通常被稱為 Stack 文件,在該文件中定義了應(yīng)用及其依賴。
在該文件整體結(jié)構(gòu)中,定義了 4 種頂級關(guān)鍵字。
? version:代表了Compose文件格式的版本號。為了應(yīng)用于Stack,需要3.0或者更高的版本。
? services:中定義了組成當(dāng)前應(yīng)用的服務(wù)都有哪些。
? networks:列出了必需的網(wǎng)絡(luò)。
? secrets:定義了應(yīng)用用到的密鑰。
如果展開頂級的關(guān)鍵字,可以看到類似上圖中的結(jié)構(gòu)。Stack 文件由 5 個服務(wù)構(gòu)成,分別為“reverse_proxy”“database”“appserver”“visualizer”“payment_gateway”。Stack 文件中包含 3 個網(wǎng)絡(luò),分別為“front-tier”“back-tier”“payment”。
最后,Stack 文件中有 4 個密鑰,分別為“postgres_password”“staging_token”“revprox_key”“revprox_cert”。
version: "3.2"
services:
reverse_proxy:
database:
appserver:
visualizer:
payment_gateway:
networks:
front-tier:
back-tier:
payment:
secrets:
postgres_password:
staging_token:
revprox_key:
revprox_cert:
Stack 文件定義了應(yīng)用的很多依賴要素,理解這一點很重要。因此,Stack 文件是應(yīng)用的一個自描述文件,并且作為一個很好的工具彌合了開發(fā)和運(yùn)維之間的隔閡。