Docker Stack 教程
# Docker Stack是什么
- Docker Stack 为解决大规模场景下的多服务部署和管理问题而生
- Docker Stack 通过提供期望状态、滚动升级、简单易用、扩缩容、健康检查等特性简化了应用的管理,这些功能都封装在一个完美的声明式模型当中
- Docker Stack 能够在单个声明文件中定义复杂的多服务应用
- Docker Stack 还提供了简单的方式来部署应用并管理其完整的生命周期:初始化部署 -> 健康检查 -> 扩容 -> 更新 -> 回滚 等功能
- 在 Compose 文件中定义应用,然后通过 docker stack deploy 命令完成部署和管理。Compose 文件中包含了构成应用所需的完整服务栈。此外还包括了卷、网络、安全以及应用所需的其他基础架构。然后基于该文件使用 docker stack deploy 命令来部署应用。
- Docker 适用于开发和测试。Docker Stack 则适用于大规模场景和生产环境。
# 与 Docker Compose 区别
docker stack 不支持 compose file中的“build”指令, 相比之下docker-compose可现场创建镜像,更适合迭代开发、测试和 快速验证原型
必须单独安装docker-compose工具包才能将其与Docker一起使用, docker stack的能力来源自docker引擎原生支持,你不需要安装额外工具包去启动docker 容器堆栈(docker stack 是docker swarm的一部分)
docker stack 支持与docker-compose 相似能力, 但是在Docker引擎内Go语言环境中运行的, 在使用docker stack命令之前你还必须创建一个swarm机器(一般情况下这也不是问题)
docker stack 不支持版本2规范编写 (opens new window)的compose.yml文件,必须使用最新的V3 版本。docker-compose工具依然可以处理版本2,3(如上所述,会忽略掉不再适用于该工具的某些指令)
docker-compose 更像是被定义为单机容器编排工具;docker stack被定义为适用于生产环境的编排工具,强化了( 复制集、 容器重启策略、回滚策略、服务更新策略 )等生产特性
docker-compose 不支持 compos版本3中 deploy配置节(定义适用于生产部署的配置), 这个deploy配置节专属于docker stack.
-
# 与 Docker Swarm 关系
Docker Swarm 构建了docker集群,并且可以通过docker service在不同集群节点上运行容器服务,但是缺点是不能同时编排多个服务; Docker Stack 可以简单地理解为Stack是集群下的Compose;
Stack 是基于 Docker Swarm 之上来完成应用的部署。因此诸如安全等高级特性,其实都是来自 Swarm;
从体系结构上来讲,Stack 位于 Docker 应用层级的最顶端。Stack 基于服务进行构建,而服务又基于容器;
# 配置文件
Stack 文件就是 Docker Compose 文件。唯一的要求就是 version:一项需要是“3.0”或者更高的值
demo
version: "3.5" # 版本 networks: # 网络 base-gateway: driver: overlay # 覆盖网络类型 name: base-gateway configs: # 配置文件 base-redis: external: true # 外部必须提前声明,必须已经存在 base-clickhouse-config: external: true volumes: # 存储卷 mysql: driver: local redis: driver: local secrets: # 密钥 postgres_password: external: true staging_token: external: true revprox_key: external: true revprox_cert: external: true services: # 服务 redis: image: hub.deepin.com/wuhan_udcp/redis:5.0.9 # image 关键字是服务对象中唯一的必填项 networks: - base-gateway command: - "redis-server" - "/etc/redis.conf" - "--requirepass" - ${UDCP_REDIS_AUTH} volumes: - ${UDCP_HOME}/basedata/redis:/data logging: driver: "json-file" options: max-size: "512m" max-file: "5" ports: [ ] configs: - source: base-redis target: /etc/redis.conf appserver: image: dockersamples/atsea_app networks: - base-gateway deploy: replicas: 2 # 设置期望服务的副本数量为 2 update_config: # Docker 在服务滚动升级的时候具体如何操作。Docker 每次会更新两个副本(parallelism),并且在升级失败后自动回滚 parallelism: 2 failure_action: rollback placement: constraints: - 'node.role == worker' restart_policy: # Swarm 针对容器异常退出的重启策略:如果某个副本以非 0 返回值退出(condition: onfailure),会立即重启当前副本。重启最多重试 3 次,每次都会等待至多 120s 来检测是否启动成功。每次重启的间隔是 5s。 condition: on-failure delay: 5s max_attempts: 3 window: 120s secrets: - postgres_password reverse_proxy: image: dockersamples/atseasampleshopapp_reverse_proxy ports: - "80:80" - "443:443" secrets: - source: revprox_cert target: revprox_cert - source: revprox_key target: revprox_key networks: - front-tier database: image: dockersamples/atsea_db environment: POSTGRES_USER: gordonuser POSTGRES_DB_PASSWORD_FILE: /run/secrets/postgres_password POSTGRES_DB: atsea networks: - back-tier secrets: - postgres_password deploy: placement: constraints: - 'node.role == worker'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# 基础命令
docker stack --help
$ docker stack --help Usage: docker stack [OPTIONS] COMMAND Manage Docker stacks Options: --orchestrator string Orchestrator to use (swarm|kubernetes|all) Commands: deploy Deploy a new stack or update an existing stack # 根据Stack文件(通常是 docker-stack.yml)部署和更新Stack 服务 ls List stacks # 列出 Swarm 集群中的全部 Stack ps List the tasks in the stack #某个已经部署的 Stack 相关详情 rm Remove one or more stacks # 从 Swarm 集群中移除 Stack services List the services in the stack Run 'docker stack COMMAND --help' for more information on a command.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16