springcloud+vue docker部署记录—3

前言

目前为止我们已经实现了多宿主机下的部署,但是面对微服务复杂的部署场景,目前的部署方式还是略显复杂与不合理,因此本篇介绍docker stack

阶段

该阶段我们通过编写简单的yml文件,就可以部署一系列复杂的场景需求,而通过传统方式是基本无法完成的,这也是docker部署最大的优势

环境准备

虚拟机3台(centOS7)
安装docker

部署架构

主机 ip 集群角色 部署服务
hyper1 10.18.32.215 manager
hyper2 10.18.32.161 worker mysql, redis, nginx
hyper3 10.18.32.68 worker

没有明确的说明服务部署在哪台服务器上是因为我们将完全交由集群管理,不再关注容器名、端口,只需要通过配置告诉集群它根据什么规则启动相应的服务即可

docker compose和docker service

在介绍docker stack之前我们简单介绍一下docker composedocker service

docker compose

docker compose可以理解为批量的docker run,通过一定规则编写yml文件,便可以指定启动容器的数量、网络环境、端口、挂载等,批量启动一系列容器,示例

version: "3"
services:
  config:
    deploy:
      replicas: 2
      placement:
        constraints: [node.role == worker]
      restart_policy:
        condition: on-failure
    image: shuiniudocker/config:1.2

  service:
    deploy:
      replicas: 3
      placement:
        constraints: [node.role == worker]
      restart_policy:
        condition: on-failure
    image: shuiniudocker/service:1.3
    depends_on:
      - config
     
networks:
  default:
    external:
      name: test-swarm

#version 脚本编写版本
#service 部署的各服务
#deploy 在单机部署时,该命令只会部署在当前宿主机下
#replicas 复制容器个数,如果使用之后介绍的docker stack,则会随机的部署在的集群节点中
#restart_policy 重启条件 on-failure 异常退出时重启 none 永不  any 始终
#image 镜像(单机部署的话完全可以以指定Dockerfile的方式部署,但是如果是集群部署,则之前介绍过的指定脚本及jar包的方式就不好用了,因为需要在所有节点下都维护对应的脚本和jar,如果有更好的方式,可以提出交流)实例中的镜像是本地构建后push到docker hub上,虚拟机通过docker login登录后pull下来的
#depends_on 依赖,即指定容器启动后才启动当前容器,但是容器启动并不代表jar包启动完成,因此会出现配置中心还未启动,子服务先启动导致找不到配置失败设置各服务的restart_policy为on-failure可以解决该问题
#networks 网络指定,如果不指定会默认维护一个共享的网络

启动命令

docker compose up

docker service

docker service个人理解为docker stack的前身,通过docker service create命令可以将服务部署在集群上,由集群通过制定规则去分配服务到各个node上,语法不再赘述,可自行搜索学习,下面直接进入主题docker stack

docker stack

docker stackdocker service好比docker composedocker run,通过yml配置对要部署的服务进行编排,示例一个完整的yml

version: "3"
services:
  eureka1:
    ports:
      - "10100:10100"
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == worker]
      restart_policy:
        condition: on-failure
    image: shuiniudocker/eureka:1.0

  eureka2:
    ports:
      - "10101:10100"
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == worker]
      restart_policy:
        condition: on-failure
    image: shuiniudocker/eureka:1.0

  config:
    deploy:
      replicas: 2
      placement:
        constraints: [node.role == worker]
      restart_policy:
        condition: on-failure
    image: shuiniudocker/config:1.2
    depends_on:
      - eureka1
      - eureka2

  zuul:
    ports:
      - "10301"
    deploy:
      replicas: 2
      placement:
        constraints: [node.role == worker]
      restart_policy:
        condition: on-failure
    image: shuiniudocker/zuul:1.2
    depends_on:
      - config

  serviceA:
    deploy:
      replicas: 3
      placement:
        constraints: [node.role == worker]
      restart_policy:
        condition: on-failure
    image: shuiniudocker/serviceA:1.3
    depends_on:
      - config

  serviceB:
    deploy:
      replicas: 3
      placement:
        constraints: [node.role == worker]
      restart_policy:
        condition: on-failure
    image: shuiniudocker/serviceB:1.3
    depends_on:
      - config

  portainer:
    image: portainer/portainer
    ports:
      - "9000:9000"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]

  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "9001:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]

networks:
  default:
    external:
      name: test-swarm
      
#port 端口映射,等同于-p,将注册中心分别映射到10100和10101上,避免端口冲突。注册中心网关将启动端口映射到宿主机随机端口上,之后在nginx反向代理、负载均衡时可在容器内或者portinaer(下面介绍)查看映射端口
#镜像的版本建议通过一个简单的yml进行管理(对于小版本的升级更新可以在推送镜像时直接覆盖,然后使用docker stack deploy命令更新或者portainer图形化界面更新,后者会提示你是否拉取最新镜像)
#上述配置指定容器名部署eureka1和eureka2,其他服务由集群统一管理部署,容器名默认
#portinaer图形化管理界面,在manager节点运行,访问ip:9000即可
#visualizer节点部署情况一目了然,在manager节点运行,访问ip:9001即可

portainer
visualizer
启动命令

docker stack deploy examplename -c xxx.yml 

反向代理、负载均衡

查看portainer发现网关被部署在hyper1(10.18.32.215:30001)和hyper3(10.18.32.68:30001)上,则nginx的代理、负载地址修改为上述地址即可

总结

至此,一套高可用的微服务算是部署完成,nginx代理vue,并对微服务的网关进行代理与负载,请求通过nginx 轮询(默认方式)分发给网关,再由网关轮询分发给各子服务,极大的分担了服务的压力。
如果某个服务还不满足,可以部署数十个上百个(只要服务器顶得住),只需简单的修改一下yml文件即可(传统方式怎么部!)再借助可视化界面对服务的部署地址、状态一目了然!

上一篇:springcloud+vue docker部署记录—2

猜你喜欢

转载自blog.csdn.net/weixin_42189048/article/details/106235534