使用Docker Stack部署应用

如果了解Docker Compose,就会发现Docker Stack非常简单 。事实上在许多方面,Stack一直是期望的Compose——完全集成到Docker中,并能够管理应用的整个生命周期 。
从体系结构上来讲,Stack位于Docker应用层级的最顶端 。Stack基于服务进行构建,而服务又基于容器,如图14.1所示 。

使用Docker Stack部署应用

文章插图
 
图14.1 AtSea商店架构图
接下来的章节分为如下几部分 。
  • 简单应用 。
  • 深入分析Stack文件 。
  • 部署应用 。
  • 管理应用 。
14.2.1 简单应用本章后续的内容会一直使用示例应用AtSea Shop 。该示例托管在Github的dockersamples/atsea-sample-shop-App库中,基于Apache 2.0许可证开源 。
使用该应用是因为其复杂度适中,不会因为太复杂而难以完整解释 。除此之外,该应用还是个多服务应用,并且利用了认证和安全相关的技术 。应用架构如图14.2所示 。
如图所示,该应用由5个服务、3个网络、4个密钥以及3组端口映射构成 。具体细节将会结合Stack文件进行分析 。
注:

在本章中用到服务一词时,指的是Docker服务(由若干容器组成的集合,作为一个整体进行统一管理,并且在Docker API中存在对应的服务对象) 。

使用Docker Stack部署应用

文章插图
 
图14.2 AtSea商店架构图
复制Github仓库,以获取全部源代码文件 。
$ git clone https://github.com/dockersamples/atsea-sample-shop-app.git Cloninginto 'atsea-sample-shop-app'...remote: Counting objects: 636, done.remote: Total 636 (delta 0), reused 0 (delta 0), pack-reused 636Receiving objects: 100% (636/636), 7.23 MiB | 28.25 MiB/s, done.Resolving deltas: 100% (197/197), done.该应用的代码由若干目录和源码文件组成 。读者可以随意浏览这些文件 。但是接下来,重点关注的文件是docker-stack.yml 。该文件通常被称为Stack文件,在该文件中定义了应用及其依赖 。
在该文件整体结构中,定义了4种顶级关键字 。
version:services:networks:secrets:version代表了Compose文件格式的版本号 。为了应用于Stack,需要3.0或者更高的版本 。services中定义了组成当前应用的服务都有哪些 。networks列出了必需的网络,secrets定义了应用用到的密钥 。
如果展开顶级的关键字,可以看到类似图14.2中的结构 。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文件是应用的一个自描述文件,并且作为一个很好的工具弥合了开发和运维之间的隔阂 。
接下来一起深入分析Stack文件的细节 。
14.2.2 深入分析Stack文件Stack文件就是Docker Compose文件 。唯一的要求就是version:一项需要是“3.0”或者更高的值 。具体可以关注Docker文档中关于Compose文件的最新版本信息 。
在Docker根据某个Stack文件部署应用的时候,首先会检查并创建networks:关键字对应的网络 。如果对应网络不存在,Docker会进行创建 。
一起看一下Stack文件中的网络定义 。
1.网络networks:front-tier:back-tier:payment:driver: overlaydriver_opts:encrypted: 'yes'该文件中定义了3个网络:front-tier、back-tier以及payment 。默认情况下,这些网络都会采用overlay驱动,新建对应的覆盖类型的网络 。但是payment网络比较特殊,需要数据层加密 。
默认情况下,覆盖网络的所有控制层都是加密的 。如果需要加密数据层,有两种选择 。
  • 在docker network create命令中指定-o encrypted参数 。
  • 在Stack文件中的driver_opts之下指定encrypted:'yes' 。
数据层加密会导致额外开销,而影响额外开销大小的因素有很多,比如流量的类型和流量的多少 。但是,通常额外开销会在10%的范围之内 。
正如前面提到的,全部的3个网络均会先于密钥和服务被创建 。


推荐阅读