如果了解Docker Compose,就会发现Docker Stack非常简单 。事实上在许多方面,Stack一直是期望的Compose——完全集成到Docker中,并能够管理应用的整个生命周期 。
从体系结构上来讲,Stack位于Docker应用层级的最顶端 。Stack基于服务进行构建,而服务又基于容器,如图14.1所示 。
文章插图
图14.1 AtSea商店架构图
接下来的章节分为如下几部分 。
- 简单应用 。
- 深入分析Stack文件 。
- 部署应用 。
- 管理应用 。
使用该应用是因为其复杂度适中,不会因为太复杂而难以完整解释 。除此之外,该应用还是个多服务应用,并且利用了认证和安全相关的技术 。应用架构如图14.2所示 。
如图所示,该应用由5个服务、3个网络、4个密钥以及3组端口映射构成 。具体细节将会结合Stack文件进行分析 。
注:
在本章中用到服务一词时,指的是Docker服务(由若干容器组成的集合,作为一个整体进行统一管理,并且在Docker API中存在对应的服务对象) 。
文章插图
图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' 。
正如前面提到的,全部的3个网络均会先于密钥和服务被创建 。
推荐阅读
- Mac使用Socket报错
- 如何使用Python执行js代码
- 使用Swoole协程实现 WebRTC 信令服务器
- 利用docker部署solo并升级为https
- Mybaits中Like 的使用方式以及一些注意点
- 人马该怎样玩?
- 使用 Go 语言实现凯撒加密
- 对讲机电池原理和使用注意事项
- 学会这些,操作docker image镜像就够了
- 使用cors完成跨域请求处理