实例解读Docker Swarm

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 为提高项目服务可用性评价值(SLA),决心从docker-compose切换到docker stack生产部署。


背景


回顾docker-compose vs docker stack差异:


docker-compose是docker引擎之外的容器编排工具(Python实现),需要单独安装;docker stack 是docker引擎原生支持的容器编排技术(Go实现)


两者都支持最新docker-compose.yml 版本3容器编排文件,部分指令有差异。


docker-compose 能现场Build镜像,更适用于开发、测试时候单机迭代部署;docker stack须预先准备镜像,具备生产环境诸多特性。


为提高项目服务可用性评价值(SLA),决心从docker-compose切换到docker stack生产部署。


头脑风暴


docker swarm 集群部署有如下优点和特性:


  1. 集群管理和Docker Engine集成
  2. 分散式设计,Swarm分为Manager,Worker, Manager节点故障不会影响Worker节点
  3. 期望的状态协调
  4. 多主机网络,overlay网络支撑不同主机之间容器通信
  5. 服务发现
  6. 负载平衡:集群节点负载均衡、服务容器负载均衡
  7. 滚动更新、失败策略


业务模型角度


【Stack、Service、Container模型】定义了适用于生产的应用架构(支持副本集、重启策略、滚动更新、更新、回滚策略)


image.gif4f968a21679790966ba537bbbf7f684e.jpg


  • task是Docker Swarm中最小部署单位,task与容器是一对一的关系


  • service是一个或一组容器在生产环境的预期状态(也可说是一组task的集合),在Worker节点上执行;有两种模式(对应下面docker-stack.yml-deploy-mode配置节)


  • (默认)replicated: 指定容器数量
  • global: 每个节点一个容器(容器数量由可用节点决定)

 

  • 服务发现(外部客户端连接到Swarm中暴露的服务),有两种模式(对应下面docker-stack.yml-deploy-endpoint_mode)


  • (默认)vip:  Docker Swarm为每个服务分配1个虚拟ip,服务后有多少节点、服务请求到哪个节点容器对于客户端是透明的,也就是由Docker Swarm负载均衡服务内容器
  • dnsrr: Docker Swarm 为每个服务建立DNS记录,返回可用容器的ip列表, 客户端直接请求其中一个ip, 这种方式一般用于自建负载均衡器


部署模型角度


Docker Swarm以多主机模型支撑业务,对于开发者来说, 一个节点或多节点部署的配置流程是类似的。


Docker Swarm有3个重要的网络概念:


 overlay network:覆盖物网络,在Docker宿主机底层网络之上搭建的分布式网络, 支撑不同主机之间容器的通信。


在初始化或刚加入Swarm集群时,会创建以下ingress、docker-gwbridge网络


 ingress network:入口网络,是一种特殊的overlay网络,外部客户端访问集群暴露的服务,在入口负载均衡(存在Swarm loadbancer将请求路由到可用节点容器)。


 docker-gwbridge: 将overlay网络上容器连接到docker宿主机的网络。

33f76f60849bbca3cf3f1e0d9d200a86.png

以上可选配置都可以在docker-compose.yml 版本3官方文档找到对应的配置字段:


deploy:  endpoint_mode: 服务发现的方式:vip、 dnsrr labels:为服务指定的标签 mode:replicated、global replicas:实例数量 resources:配置资源 restart_policy:重启策略 update_config:  服务更新策略  parallelism:同时更新容器数量  delay:容器组更新的间隔时间  failure_action:  更新失败的操作:continue、rollbak,pause(默认)  monitor:监视更新失败的等待时间  max_failure_ratio: 更新的失败容错率  order:操作策略:stop-first、start-first rollback_config:回滚策略    ...同上...


走向集群

改造目标

  • 三个服务-->nginx--> receiver-->app,容器之间通过{webnet} overlay网络通信;


  • nginx开放外部访问端口80和8080,关注ingress网络


  • receiver、app服务需要访问宿主机上搭建的Redis,关注docker-gwbridge网络


f01f5d067778905759e382aa3c60f5bf.png


一般两个步骤:① 搭建集群   ② 发布服务

P1

搭建Docker Swarm集群

单节点/多节点的初始化方式:参考docker swarm  -- help指令;

集群节点的管理:参考docker  node --help指令


$ docker swarm --helpUsage:  docker swarm COMMANDManage Swarm
Commands:  ca          Display and rotate the root CA  init        Initialize a swarm  join        Join a swarm as a node and/or manager  join-token  Manage join tokens,  如果忘记Token,可以执行这个参数  leave       Leave the swarm  unlock      Unlock swarm  unlock-key  Manage the unlock key  update      Update the swarm


P2  


docker stack发布服务

可使用docker service create方式创建服务,

个人偏好定义docker-stack.yml文件发布。

下面在生产部署中追加的production.yml


version: "3.7"
services:
  proxy:
    networks:
      - webnet
  receiver:
    deploy:
      replicas: 1 
      restart_policy:
        condition: on-failure
    networks:
      - webnet
  app:
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
      update_config:
        parallelism: 1
        delay: 5s
        order: stop-first
    networks:
      - webnet
networks:
   webnet:


# docker stack不加载同目录下的.env环境变量文件,原有适用于docker-compose工具的yml文件可采用变通方法

docker stack deploy -c <(docker-compose -f docker-stack.yml -f production.yml config) eqidstack


服务部署效果:注意其中的Ports指的是 服务对外暴露的端口


#docker stack ls:NAME           SERVICES     ORCHESTRATOReqidstack      3       Swarm
#docker service ls:ID      NAME        MODE       REPLICAS       IMAGE     PORTS jml6ecfa330r    eqidstack_app         replicated    2/2       12205500/eqidmanager:master 3381stpkirgj    eqidstack_proxy        replicated    1/1     nginx:latest              *:80->80/tcp, *:8080->8080/tcpvhz4ef8p4ffp    eqidstack_receiver     replicated    1/1     12205500/eqidreceiver:master


可通过

docker network inspect ingress 验证容器eqidstack_proxy.1连接到ingress网络;

docker network inspect eqidstack_webnet 验证有4个容器连接到overlay网络


P+


不停服更新/不停服扩容

手动更新服务:docker service update  [opton]  {some_service_name}

为{eqidstack_proxy}服务添加 [重启策略]


c35a0e0468229246a9012cae55ae30a9.png\


手动扩容:docker service scale [option] {service=replicas}

将{eqidstack_proxy}服务扩容为2容器

030e06607d28c297c57bd328c7048f3d.png


🐽 可通过docker service  inspect eqidstack_proxy验证操作结果


总结


docker service 定义某个(副本集)容器在生产环境下的状态,一般业务含义上的服务相关;

docker stack 定义一组服务,服务间协作、调用,支撑整个业务架构;

docker swarm 管理一组服务在集群节点上的的部署。

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
1月前
|
网络安全 Docker 容器
|
1月前
|
Docker 容器
|
1月前
|
安全 Docker 容器
|
1月前
|
Docker 容器
docker swarm 移除 Worker 节点
【10月更文挑战第12天】
46 5
|
1月前
|
网络安全 Docker 容器
|
1月前
|
网络安全 数据安全/隐私保护 Docker
|
13天前
|
应用服务中间件 nginx Docker
Docker Swarm、Docker Stack和Portainer的使用
Docker Swarm、Docker Stack 和 Portainer 各有其独特的功能和优势。Docker Swarm 适用于分布式服务的管理和编排,Docker Stack 便于多容器应用的定义和部署,而 Portainer 提供了直观的 UI,简化了 Docker 环境的管理。结合使用这些工具,可以大大提高容器化应用的部署和管理效率。希望本文对您理解和应用这些工具有所帮助。
28 5
|
29天前
|
负载均衡 应用服务中间件 网络安全
docker swarm添加更多的服务
【10月更文挑战第16天】
21 6
|
29天前
|
Docker 容器
docker swarm启动服务并连接到网络
【10月更文挑战第16天】
26 5
|
29天前
|
调度 Docker 容器
docker swarm创建覆盖网络
【10月更文挑战第16天】
18 5
下一篇
无影云桌面