先容的 Docker Swarm 只能实现对单个做事的大略支配,于是就引出了Docker Stack。
上面我们先容到
那Docker Stack(堆栈) 是将docker-compose和docker swarm结合起来,在多台做事器集群,支配多个做事。Docker Stack 利用与 Docker Compose 相同的 YAML 文件格式来定义做事堆栈。

同样以支配nginx为例子,用YAML文件格式编排来支配运用。
2.1、编写YAML文件
创建文件夹,在此文件夹进行事情
mkdir stack-webcd 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_netnetworks: 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-stackSince --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_nginxubuntu@ubuntu:~/stack-web$ sudo docker stack lsNAME SERVICESnginx-stack 1ubuntu@ubuntu:~/stack-web$ sudo docker stack ps nginx-stackID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTSwexhzl04qrr0 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 lsID NAME MODE REPLICAS IMAGE PORTSqme9n3kq0zxu nginx-stack_nginx replicated 2/2 nginx:latest :80->80/tcp, :443->443/tcpubuntu@ubuntu:~/stack-web$ sudo docker service ps nginx-stack_nginxID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTSwexhzl04qrr0 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 == managernetworks: 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 lsNAME SERVICESwordpress-stack 2ubuntu@ubuntu:~/stack-web$ sudo docker stack ps wordpress-stackID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS9e8ustjfy021 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 lsID NAME MODE REPLICAS IMAGE PORTSubgozw57txda wordpress-stack_db global 1/1 mysql:latest 060g92r8f8ys wordpress-stack_wordpress replicated 2/2 wordpress:latest :80->80/tcpubuntu@ubuntu:~/stack-web$ sudo docker service ps 060g92r8f8ysID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTSpzxcwpxoupmw 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 ubgozw57txdaID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS9e8ustjfy021 wordpress-stack_db.xcpn4el8vvs2hymojpbay8m6q mysql:latest ubuntu Running Running 8 minutes ago
浏览器IP访问测试,两个IP都可以正常访问。
这里集群多做事支配就完成了。