Docker Stack(堆栈) 部署多服务集群,多服务编排

Docker Stack(堆栈) 部署多服务集群,多服务编排

首页冒险解谜快餐堆栈更新时间:2024-09-23
1、Docker Stack简介

Docker Stack(堆栈) 是在 Swarm 上管理服务堆栈的工具。而在以前文章

介绍的 Docker Swarm 只能实现对单个服务的简单部署,于是就引出了Docker Stack。

上面我们介绍到

那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

condition:值可以为 none 、on-failure 以及 any(默认)

delay:尝试重启的等待时间,默认为 0

max_attempts:在放弃之前尝试重新启动容器次数(默认:从不放弃)。如果重新启动在配置中没有成功 window,则此尝试不计入配置 max_attempts 值。例如,如果 max_attempts 值为 2,并且第一次尝试重新启动失败,则可能会尝试重新启动两次以上。windows:在决定重新启动是否成功之前的等时间,指定为持续时间(默认值:立即决定)。

配置更新服务,用于无缝更新应用(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都可以正常访问。

这里集群多服务部署就完成了。

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved