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

发布于:2024-03-29 ⋅ 阅读:(19) ⋅ 点赞:(0)

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都可以正常访问。
在这里插入图片描述
这里集群多服务部署就完成了。

本文含有隐藏内容,请 开通VIP 后查看