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