使用 Docker Stack 部署多服务集群

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 Docker Stack 部署多服务集群相关的知识,希望对你有一定的参考价值。

参考技术A

单机模式下,我们可以使用 Docker Compose 来编排多个服务,而在 上一篇文章 中介绍的 Docker Swarm 只能实现对单个服务的简单部署。于是就引出了本文的主角 Docker Stack ,通过 Docker Stack 我们只需对已有的 docker-compose.yml 配置文件稍加改造就可以完成 Docker 集群环境下的多服务编排。

注意:如果有多个 manager 节点,portainer 和 visualizer 可能分别部署在两台机器上,所以ip可能会不一样。

评论区有小伙伴提到,容器间通过服务名 ( 比如文中的 nginx ) 通讯时,对应的 IP 却和容器的实际 IP 对不上。出现这个情况是因为负载均衡( 对外表现为一个服务,内部为多个服务 )。下面是我做的试验,希望能帮助大家理解。

总结下:

整个请求的调用流程应该就是: 通过服务名 nginx 访问 -- 指向 --> stack 集群网关 ( 10.0.6.5 ) -- 转发 --> stack 集群中,位于当前服务器的负载均衡实例 ( 10.0.6.4 ) -- 分发 --> 最终的应用

如果你还没玩过Docker Stack管理服务,你已经out了,(送Portainer集群管理教程)

​ 在上面我们学会了如何配置一个swarm集群,并且知道如何在swarm集群上部署应用,现在,我们开始了解Docker层级关系中的最高一个层级——stack。一个stack就是一组有关联的服务的组合,可以编排在一起,一起管理。

​ 单机模式下,我们可以使用 Docker-Compose来编排多个服务,而 Docker Swarm 只能实现对单个服务的简单部署。于是就引出了本文的主角 Docker Stack ,通过 Docker Stack 我们只需对已有的 docker-compose.yml 配置文件稍加改造就可以完成 Docker 集群环境下的多服务编排。

集群搭建案例

应用部署情况
服务名称 数量
mysql 1
nacos 1
learn-docker-gateway 1
learn-docker-web 2
learn-docker-storage 2
创建docker-compose.yml
version: 3.9   
services:
    mysql:
        image: mysql:5.7.33
        networks:
            - learn-docker-network
        volumes:
            - "/tmp/etc/mysql:/etc/mysql/mysql.conf.d/"
            - "/tmp/data/mysql:/var/lib/mysql"
        environment:
            MYSQL_ROOT_PASSWORD: root
        deploy:
            mode: replicated
            replicas: 1
            placement:
                constraints:
                    - node.labels.role == data
            restart_policy:
                condition: on-failure
                delay: 5s
                
    nacos:
        image: nacos/nacos-server
        ports:
            - "8848:8848"
        networks:
            - learn-docker-network
        environment:
            MODE: standalone
            JVM_XMS: 128m
            JVM_XMX: 128m
        deploy:
            mode: replicated
            replicas: 1
            restart_policy:
                condition: on-failure
                delay: 5s
    
    learn-docker-web:
        image: manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-web:1.0-SNAPSHOT
        networks:
            - learn-docker-network
        depends_on:
            - nacos
            - mysql
        deploy:
            mode: replicated
            replicas: 2
            restart_policy:
                condition: on-failure
                delay: 5s
                
            
    learn-docker-storage:
        image: manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-storage:1.0-SNAPSHOT
        networks:
            - learn-docker-network
        depends_on:
            - nacos
            - mysql
        deploy:
            mode: replicated
            replicas: 2
            restart_policy:
                condition: on-failure
                delay: 5s
    learn-docker-gateway:
        image: manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-gateway:1.0-SNAPSHOT
        ports:
            - "8888:8888"
        networks:
            - learn-docker-network
        depends_on:
            - nacos
            - mysql
        deploy:
            mode: replicated
            replicas: 1
            restart_policy:
                condition: on-failure
                delay: 5s
                
    visualizer:
        image: dockersamples/visualizer
        ports:
            - "8080:8080"
        volumes:
            - "/var/run/docker.sock:/var/run/docker.sock"
        deploy:
            mode: replicated
            replicas: 1
            restart_policy:
                condition: on-failure
                delay: 5s

networks:
    learn-docker-network:
        driver: overlay

配置介绍

​ Stack文件就是Docker Compose文件。唯一的要求就是version:一项需要是3.0或者更高的值。在Docker根据某个Stack文件部署应用的时候,首先会检查并创建networks:关键字对应网络。如果网络不存在,Docker会进行创建。下面我们详细看下这几个模块。

overlay网络

​ 这里定义了1个网络,默认情况下网络都是使用overlay驱动,新建对应的覆盖类型的网络。

networks:
    learn-docker-network:
        driver: overlay
部署节点副本数
        deploy:
            mode: replicated
            replicas: 2
            restart_policy:
                condition: on-failure
                delay: 5s
  • replicas: 2 设置了期望服务的副本数量为2,默认为1.如果服务正在运行,需要调整副本数。可以调整stack文件中的 replicas 的数值,然后重新部署stack。重新部署stack并不会影响那些没有改动的服务。
  • restart_policy: 定义了Swarm针对容器异常退出的重启策略。当前服务的重启策略是:如果某个副本以非0返回值退出,会立即重启当前副本。重启最多尝试3次,每次都是等待之多120s来检测是否成功。每次重启的间隔是5s。
节点约束
    mysql:
        image: mysql:5.7.33
        networks:
            - learn-docker-network
        volumes:
            - "/tmp/etc/mysql:/etc/mysql/mysql.conf.d/"
            - "/tmp/data/mysql:/var/lib/mysql"
        environment:
            MYSQL_ROOT_PASSWORD: root
        deploy:
            mode: replicated
            replicas: 1
            placement:
                constraints:
                    - node.labels.role == data
            restart_policy:
                condition: on-failure
                delay: 5s
部署服务
部署应用
docker stack deploy -c docker-compose.yml learn-docker-test

查看部署情况

服务部署情况
查看nacos节点信息

测试访问服务
curl http://192.168.64.153:8888/employeapi/find/10001| python -m json.tool

集群管理

更新服务
参数详解
  • --force 强制更新重启服务,无论是否配置或镜像改变都更新

  • --image <image:tag> 制定更新的镜像

  • --with-registry-auth 向 Swarm 代理发送 Registry 认证详细信息,私有仓库需要携带该参数

更新镜像
#查看服务详情
docker service ls
# 更新服务
docker service update --image manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-storage:1.0-SNAPSHOT learn-docker-test_learn-docker-storage

删除应用
查看部署集群

执行删除
docker stack rm learn-docker-test

相关命令(手册)
docker stack 常用命令
命令 说明
docker stack deploy 部署新的堆栈或更新现有堆栈
docker stack ls 列出现有堆栈
docker stack ps 列出堆栈中的任务
docker stack rm 删除堆栈
docker stack services 列出堆栈中的服务
docker stack down 移除某个堆栈(不会删除数据)
docker service 常用命令
命令 说明
docker service create 部署服务
docker service inspect 查看服务详情
docker service logs 产看某个服务日志
docker service ls 查看所有服务详情
docker service rm 删除某个服务(-f强制删除)
docker service scale 设置某个服务个数
docker service update 更新某个服务
docker node 常用命令
命令 说明
docker node ls 查看所有集群节点
docker node rm 删除某个节点(-f强制删除)
docker node inspect 查看节点详情
docker node demote 节点降级,由管理节点降级为工作节点
docker node promote 节点升级,由工作节点升级为管理节点
docker node update 更新节点
docker node ps 查看节点中的 Task 任务
docker swarm 常用命令
命令 说明
docker swarm init 初始化集群
docker swarm join-token worker 查看工作节点的 token
docker swarm join-token manager 查看管理节点的 token
docker swarm join 加入集群中

portainer集群管理(扩展)

Portainer介绍

​ Portainer 的目的是部署和使用一样简单。它由一个可以在任何 Docker 引擎上运行的单一容器组成(可以部署为Linux容器或Windows本地容器,也支持其他平台)。Portainer允许你管理所有的Docker资源(容器、镜像、卷、网络等等)。它与独立的Docker引擎和Docker Swarm模式兼容。

swarm集群安装Portainer

# 下载部署配置文件
curl -L https://downloads.portainer.io/portainer-agent-stack.yml -o portainer-agent-stack.yml 
# 部署节点
docker stack deploy -c portainer-agent-stack.yml portainer

注意:此方法将自动部署Portainer服务器的单个实例,并将Portainer代理作为全局服务部署到集群中的每个节点上。

portainer使用

注册用户

查看管理服务

查看swarm节点

管理微服务

服务部署情况
服务名称 数量
mysql 1
nacos 1
learn-docker-gateway 1
learn-docker-web 2
learn-docker-storage 2
准备工作
管理节点标签

添加网络信息

创建仓库配置

创建stack任务

查看节点部署情况

以上是关于使用 Docker Stack 部署多服务集群的主要内容,如果未能解决你的问题,请参考以下文章

如果你还没玩过Docker Stack管理服务,你已经out了,(送Portainer集群管理教程)

Docker SwarmLabel 节点标签与服务约束

Docker Swarm - 节点标签与服务约束

Elasticsearch:使用 Docker compose 来一键部署 Elastic Stack 8.x

如何在服务器上部署docker

Docker Get Started V