1、Docker Stack简介
Docker Stack(堆栈) 是在 Swarm 上管理服务堆栈的工具。而在以前文章docker swarm集群搭建
介绍的 Docker Swarm 只能实现对单个服务的简单部署,于是就引出了Docker Stack。
上面我们介绍到
- docker-compose:可以在一台机器上使用docker-compose.yml轻松部署多个服务(如nginx,php,mysql)
- docker swarm:将一个服务部署至多台机器(如nginx,部署到机器1,机器2,机器3)
那Docker Stack(堆栈) 是将docker-compose和docker swarm结合起来,在多台服务器集群,部署多个服务。Docker Stack 使用与 Docker Compose 相同的 YAML 文件格式来定义服务堆栈。
2、Docker Stack部署应用
同样以部署nginx为例子,用YAML文件格式编排来部署应用。
2.1、编写YAML文件
创建文件夹,在此文件夹进行工作
mkdir stack-web
cd stack-web
编辑docker-compose.yml
vim docker-compose.yml
内容如下:
version: '3.6'
services:
nginx:
image: nginx:latest
environment:
- TZ=Asia/Shanghai
deploy:
replicas: 2
restart_policy:
condition: on-failure
update_config:
parallelism: 2
delay: 10s
monitor: 30s
max_failure_ratio: 0.1
order: start-first
ports:
- 80:80
- 443:443
networks:
- nginx_net
networks:
nginx_net:
external: true
在 Swarm 中,你可以使用相同的 Compose 文件来部署这个应用。但有些参数是 Swarm 特有的配置,比如副本数量和部署模式,如deploy标签下是针对堆栈我们在原有 Compose 文件里增加的内容。
上面关于deploy的参数说明:
- restart_policy
配置容器的重新启动,代替 restart
condition:值可以为 none 、on-failure 以及 any(默认)
delay:尝试重启的等待时间,默认为 0
max_attempts:在放弃之前尝试重新启动容器次数(默认:从不放弃)。如果重新启动在配置中没有成功 window,则此尝试不计入配置 max_attempts 值。例如,如果 max_attempts 值为 2,并且第一次尝试重新启动失败,则可能会尝试重新启动两次以上。windows:在决定重新启动是否成功之前的等时间,指定为持续时间(默认值:立即决定)。
- update_config
配置更新服务,用于无缝更新应用(rolling update)
parallelism:一次性更新的容器数量
delay:更新一组容器之间的等待时间。
failure_action:如果更新失败,可以执行的的是 continue、rollback 或 pause (默认)
monitor:每次任务更新后监视失败的时间(ns|us|ms|s|m|h)(默认为 0)
max_failure_ratio:在更新期间能接受的失败率
order:更新次序设置,top-first(旧的任务在开始新任务之前停止)、start-first(新的任务首先启动,并且正在运行的任务短暂重叠)(默认 stop-first)
2.2、部署堆栈
接下来用以下命令运行部署堆栈
sudo docker stack deploy -c docker-compose.yml nginx-stack
这个命令会创建一个名为 nginx-stack 的堆栈,并根据 Compose 文件中的定义创建服务。
参数说明:
–bundle-file:【实验阶段】分布式应用程序包文件的路径
-c --compose-file :Stack File 路径
–prune:删除不再被引用的服务
–resolve-image: 查询 Registry 以解决镜像摘要和支持的平台可选值:always(默认)、changed、never
–with-registry-auth:向 Swarm 代理发送 Registry 认证详细信息
部署完成后可以用docker stack ls 和 docker stack ps 查看服务节点。
也可以用上面的swarm命令查看服务,docker service ls 和docker service ps。
运行结果如下显示,部署完成。
ubuntu@ubuntu:~/stack-web$ sudo docker stack deploy -c docker-compose.yml nginx-stack
Since --detach=false was not specified, tasks will be created in the background.
In a future release, --detach=false will become the default.
Creating service nginx-stack_nginx
ubuntu@ubuntu:~/stack-web$ sudo docker stack ls
NAME SERVICES
nginx-stack 1
ubuntu@ubuntu:~/stack-web$ sudo docker stack ps nginx-stack
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
wexhzl04qrr0 nginx-stack_nginx.1 nginx:latest ubuntu Running Running 7 minutes ago
wxt7ovydh38t nginx-stack_nginx.2 nginx:latest ubuntu Running Running 7 minutes ago
ubuntu@ubuntu:~/stack-web$ sudo docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
qme9n3kq0zxu nginx-stack_nginx replicated 2/2 nginx:latest *:80->80/tcp, *:443->443/tcp
ubuntu@ubuntu:~/stack-web$ sudo docker service ps nginx-stack_nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
wexhzl04qrr0 nginx-stack_nginx.1 nginx:latest ubuntu Running Running 31 seconds ago
wxt7ovydh38t nginx-stack_nginx.2 nginx:latest ubuntu Running Running 31 seconds ago
浏览器输入IP访问测试,部署完成。
常用命令:
docker stack deploy 部署新的堆栈或更新现有堆栈
docker stack ls 列出现有堆栈
docker stack ps 列出堆栈中的任务
docker stack rm 删除一个或多个堆栈
docker stack services 列出堆栈中的服务
docker stack和docker service 命令有点类似,实际上,Docker Stack是建立在Docker Service之上的一种更高级的抽象。
使用Docker Service时,可以单独管理每个服务,并对其进行伸缩、更新和删除。而使用Docker Stack时,可以将一组相关的服务捆绑在一起,并通过编排文件定义它们之间的关系和依赖性,方便一次性部署和管理整个应用程序。根据您的需求选择合适的工具,单个服务使用Docker Service,复杂应用程序使用Docker Stack。
3、Docker Stack部署多服务应用
上面我们部署了单服务nginx应用,有点简单,为了实现stack更大的左右,我们可以同时部署多服务应用。
示例,同时部署wordpress和mysql服务
编辑YAML文件
vim docker-compose.yml
内容如下
version: '3.8'
services:
wordpress:
image: wordpress:latest
ports:
- "80:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: qwe12345
networks:
- web-network
deploy:
replicas: 2
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
update_config:
parallelism: 1
delay: 10s
db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: qwe12345
volumes:
- ./mysql-data:/var/lib/mysql
#设置网络
networks:
- web-network
deploy:
#当前容器的扩展类型 replicated可扩展,global不可扩展
mode: global
placement:
constraints:
# 指定容器部署节点manager
- node.role == manager
networks:
web-network:
driver: overlay
以上mysql的deploy有所不同,因为这里考虑mysql只需要一个就行,不需要多个服务器,所以部署在管理节点即可,根据使用情况调整。
由于上面mysql挂载了文件夹存储数据,所以在当前创建文件夹,否则会因找不到文件夹mysql启动失败。
mkdir mysql-data
启动部署编排
sudo docker stack deploy -c docker-compose.yml wordpress-stack
用docker stack ls 和docker stack ps wordpress-stack查看启动服务信息
ubuntu@ubuntu:~/stack-web$ sudo docker stack ls
NAME SERVICES
wordpress-stack 2
ubuntu@ubuntu:~/stack-web$ sudo docker stack ps wordpress-stack
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
9e8ustjfy021 wordpress-stack_db.xcpn4el8vvs2hymojpbay8m6q mysql:latest ubuntu Running Running 7 seconds ago
pzxcwpxoupmw wordpress-stack_wordpress.1 wordpress:latest ubuntu Running Running 12 seconds ago
jjdn4s2a53e8 wordpress-stack_wordpress.2 wordpress:latest ubuntu Running Running 12 seconds ago
也可以用swarm的命令 service,查看每个服务对于的node节点信息,如下显示。
wordpress已经分配2个副本,db按要求只有一个节点。
ubuntu@ubuntu:~/stack-web$ sudo docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ubgozw57txda wordpress-stack_db global 1/1 mysql:latest
060g92r8f8ys wordpress-stack_wordpress replicated 2/2 wordpress:latest *:80->80/tcp
ubuntu@ubuntu:~/stack-web$ sudo docker service ps 060g92r8f8ys
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
pzxcwpxoupmw wordpress-stack_wordpress.1 wordpress:latest ubuntu Running Running 8 minutes ago
jjdn4s2a53e8 wordpress-stack_wordpress.2 wordpress:latest ubuntu Running Running 8 minutes ago
ubuntu@ubuntu:~/stack-web$ sudo docker service ps ubgozw57txda
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
9e8ustjfy021 wordpress-stack_db.xcpn4el8vvs2hymojpbay8m6q mysql:latest ubuntu Running Running 8 minutes ago
浏览器IP访问测试,两个IP都可以正常访问。
这里集群多服务部署就完成了。