,docker swarm 是什么

Docker Swarm、Docker Machine与Docker Compose号称Docker三剑客
Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,可以将组成某个应该的多个docker容器编排在一起,同时管理。
而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口(docker stack)统一管理这些Docker主机上的各种Docker资源。

Swarm的基本架构如下图所示,

  • stack 是构成特定环境中的 service 集合, 它是自动部署多个相互关联的服务的简便方法,而无需单独定义每个服务。
  • stack file 是一种 yaml 格式的文件,类似于 docker-compose.yml 文件,它定义了一个或多个服务,并定义了服务的环境变量、部署标签、容器数量以及相关的环境特定配置等。
二,启动Swarm,并创建集群
Docker 默认包含了 Swarm,因此可以直接使用,初始化命令:docker swarm init 
docker swarm init --advertise-addr 192.168.100.129

此时将本机ip“192.168.100.126”,会默认当前节点为 Leader,执行 docker info 查看

通过下面命令获取加入token,其他节点可以用 manager 或者 worker 的身份加入到当前集群

docker swarm join-token [worker|manager]

需要加入的节点无需再执行“docker swarm init”初始化,直接加入节点即可

出错了,需要在管理管设置防火墙

firewall-cmd --permanent --add-port=2377/tcp # 允许某端口放行

然后执行防火墙重新加载

firewall-cmd --reload

再次在需要加入的节点上执行加入

这里我们加入2个节点,执行 docker info 查看

在管理端执行“docker info” 查看, 显示工3个节点

脱离集群

docker swarm leave 

结果如下:

三,docker-stack.yml文件编排

Docker stack 也是一个yaml文件,和一份docker-compose.yml文件差不多,指令也基本一致。但是与compose相比其不支持build、links和network_mode。Docker stack有一个新的指令deploy。

注:stack不支持的指令

Deploy是用来指定swarm服务部署和运行时的相关配置,并且只有使用docker stack deploy 部署swarm集群时才会生效。如果使用docker-compose up 或者docker-compose run时,该选项会被忽略。要使用deploy选项,compose-file中version版本要在3或3+。

下面通过一个demo说明 deploy关键选项version: "3.4"

version: "3.4"
services:
demo-docker:
image: ejiyuan/demo-docker
ports:
- 8081:8081
environment:
- DF_NOTIFY_CREATE_SERVICE_URL=http://proxy:8080/v1/docker-flow-proxy/reconfigure
deploy:
mode: replicated
replicas: 2
endpoint_mode: vip
labels:
com.example.description: "This label will appear on the web service"
resources:
limits:
cpus: '0.50'
memory: 50M
reservations:
cpus: '0.25'
memory: 20M
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
update_config:
parallelism: 1
delay: 10s
order: start-first
visualizer:
image: dockersamples/visualizer
ports:
- "9080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints: [node.role == manager]
portainer:
image: portainer/portainer
ports:
- "9000:9000"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints: [node.role == manager]

visualizer,portainer 为服务管理与监听服务,这里先不做详细介绍

1,mode :global 全局(每个群集节点只有一个容器)replicated 副本(指定容器的数量)。默认值:replicated。

2,replicas:副本模式下每个节点启动副本的数量

3,endpoint_mode:指定swarm服务发现的模式

  • vip - Docker为swarm集群服务分配一个虚拟IP(VIP),作为客户端到达集群服务的“前端”。Docker 在客户端和可用工作节点之间对服务的请求进行路由。而客户端不用知道有多少节点参与服务或者是这些节点的IP/端口。(这是默认模式)
  • dnsrr - DNS轮询(DNSRR)服务发现不使用单个虚拟IP。 Docker为服务设置DNS条目,使得服务名称的DNS查询返回一个IP地址列表,并且客户端直接连接到其中的一个。如果您想使用自己的负载平衡器,或者混合Windows和Linux应用程序,则DNS轮询功能非常有用。

4,labels:指定服务的标签。这些标签仅在服务上设置,而不在服务的任何容器上设置

5,resources:设置服务资源分配

  • limits:最大使用限制
  • reservations:表示预留,即最小使用
  • cpus: '0.50' 表示最大或预留50%
  • memory: 20M:表示最大或预留20M

6,restart_policy:配置在容器退出时是否并如何重启容器。取代docker-compose 中的 restart指令。

  • condition :none、on-failure和any(默认any)
  • delay :在重启尝试之间等待多久(默认0)
  • max_attempts :尝试重启的次数(默认一直重启,直到成功)
  • window : 在确实一个重启是否成功前需要等待的窗口时间 

7,update_config :配置更新服务,用于无缝更新应用(rolling update)

  • parallelism:同一时间升级的容器数量
  • delay:容器升级间隔时间
  • failure_action:升级失败后的动作(continue、rollback和pause。默认pause)。
  • monitor:更新完成后确实成功的时间(ns|us|ms|s|m|h)。(默认0s)
  • max_failure_ratio:更新期间允许的失败率
  • order: 更新期间的操作顺序。停止优先(旧任务在开始新任务之前停止)或者先启动(首先启动新任务,并且正在运行的任务短暂重叠)(默认停止优先)注意:只支持v3.4及更高版本。 

四,docker stack相关命令

1, docker stack deploy:部署新的堆栈或更新现有堆栈

docker stack deploy [OPTIONS] STACK

参数

  • --bundle-file:【实验阶段】分布式应用程序包文件的路径
  • -c --compose-file :Stack File 路径
  • --prune:删除不再被引用的服务
  • --resolve-image: 查询 Registry 以解决​​镜像摘要和支持的平台可选值:always(默认)、changed、never
  • --with-registry-auth:向 Swarm 代理发送 Registry 认证详细信息

私有仓库需要携带"--with-registry-auth"参数,否则提示

image registry.cn-beijing.aliyuncs.com/ejiyuan/app:latest could not be accessed on a registry to record 
its digest. Each node will access registry.cn-hangzhou.aliyuncs.com/ejiyuan/app:latest,
possibly leading to different nodes running different

需要先登录到阿里私有仓 

sudo docker login --username=ejiyuan@aliyun.com registry.cn-beijing.aliyuncs.com 

内网地址

sudo docker login --username=ejiyuan@aliyun.com registry-vpc.cn-beijing.aliyuncs.com

执行命令开始使用 docker-stack.yml 文件部署服务堆,堆名为“test”

 docker stack deploy -c docker-stack.yml test --with-registry-auth

结果如下:

2,docker stack ls:列出现有堆栈以及堆中的服务数量

docker stack ls [flags]

SERVICES 显示堆中有多少个服务

3,docker stack ps:列出堆栈中的任务

docker stack ps [OPTIONS] STACK [flags]

对应 docke run为 上图中,绿、蓝、黄分别代表上面文件中定义的三个服务

  • 第一行,任务NAME “test_demo-docker.1”,"test"表示服务栈名称,“_”后面的demo-docker是文件中定义的服务名称,“.1”表示第一个实例;
  • 第四列 NODE表示所在的节点;
  • 第五列:desired state 状态running运行中;
  • 下面一行 “\_”表示为第一次重启,跟部署配置文件(docker-stack.yml)中的“restart_policy”,重启策略有关,文件中设置了 出错重启,最多重启3次,所以3行的,“\_”,第五列状态显示为 shutdown停止
  • 第七列 显示错误原因
  • task:non-zero exit(137) 错误原因服务容器内容不足,上面部署配置文件(docker-stack.yml)中设置了内存为20M,所以导致服务反复重启知道达到  max_attempts 限制, by:https://success.docker.com/article/what-causes-a-container-to-exit-with-code-137

4,docker stack services :列出堆栈中的服务

docker stack services [OPTIONS] STACK [flags]

  • NAME 表示堆中的服务
  • MODE 文件中配置的启动模式,这里都是 replicated (副本模式)
  • REPLICAS 表示正在运行的/启动的副本数量

5,docker stack rm :删除一个或多个堆栈

 docker stack rm STACK [STACK...] [flags]

六,服务升级

docker service upadte 命令参数详解

  • --force 强制更新重启服务,无论是否配置或镜像改变都更新
  • --image <image:tag> 制定更新的镜像
  • --with-registry-auth 向 Swarm 代理发送 Registry 认证详细信息,私有仓库需要携带该参数

1,更新镜像:

docker service update --image ejiyuan/demo-docker:latest test_demo-docker

使用 portainer/portainer:latest镜像,更新  portainer_portainer服务,此方法执行前,必须将 镜像文件上传到远程仓中,程序会自动拉取远程仓中镜像文件与启动服务的镜像对比,如果没有变化不会启动更新,也不会重启服务

即使设置了update_config.order: start-first,服务会先启动在停止,但是tomcat 启动 spring 项目需要一定时间,这段时间服务是不可用的,但是服务状态是Runing的,所以,这里启用两个副本,每次更新一个,等待一个服务启动完成后,在执行另一个更新,主要目的是为了,无缝的升级系统,具体update_config.delay设置为多少可以参考tomcat的启动时间

Tomcat started on port(s): 8081 (http) with context path ''
Started DemoDockerApplication in 17.292 seconds (JVM running for 18.745)

注意:如果有多个同名images,最后一次编译的会被加tag :latest,push时 要加上

docker push registry.cn-beijing.aliyuncs.com/ejiyuan/demo-docker:latest

2,更新节点数目

docker service scale test_demo-docker=3

运行结果:

3,添加或者更新一个对外端口

docker service update -–publish-add 8090 test_demo-docker 

结果如下

七,更新节点

docker node update [OPTIONS] NODE [flags]

参数:

  • --availability 节点的可用性(有效/暂停/耗尽)
  • --label-add 添加或更新节点标签(key = value)
  • --label-rm 删除节点标签(如果存在)
  • --role 节点的作用(worker / manager)

NODE:节点名称 可以使用 “docker info” 查看得到

执行下面语句查看节点详情

docker node inspect atv61b72x9qa5dpbrew2n016g

该命令只会更改角色,部分权限并没有立即更新,因此执行服务操作时有可能提示该错误Error response from daemon: rpc error: code = DeadlineExceeded desc = context deadline exceeded

立即生效更新节点为manger 执行

docker node promote NODE [NODE...]

七,常用命令

 

常用命令

  • docker swarm 命令用于管理 Swarm 群集
命令 描述
docker swarm init 初始化一个 swarm 群集
docker swarm join 加入群集作为节点或管理器
docker swarm join-token 管理用于加入群集的令牌
docker swarm leave 离开 swarm 群集
docker swarm unlock 解锁 swarm 群集
docker swarm unlock-key 管理解锁钥匙
docker swarm update 更新 swarm 群集
  • docker node 命令用于管理 Swarm 群集中的机器节点
命令 描述
docker node demote 从 swarm 群集管理器中降级一个或多个节点
docker node inspect 显示一个或多个节点的详细信息
docker node ls 列出 swarm 群集中的节点
docker node promote 将一个或多个节点推入到群集管理器中
docker node ps 列出在一个或多个节点上运行的任务,默认为当前节点
docker node rm 从 swarm 群集删除一个或多个节点
docker node update 更新一个节点
  • docker service 命令用于管理服务
命令 描述
docker service create 创建服务
docker service inspect 显示一个或多个服务的详细信息
docker service logs 获取服务的日志
docker service ls 列出服务
docker service rm 删除一个或多个服务
docker service scale 设置服务的实例数量
docker service update 更新服务
docker service rollback 恢复服务至update之前的配置
七,注意:
如果一台机器启用多个服务注意,合理分配cpu与内存资源,因tomcat在启动编译时会很吃内存,且docker是多线程启动的,所有最好是限定一下(设置resources.limits)否者会导致内存在同一时刻用光,某些服务启动失败当然也可是设置出错重启(restart_policy.condition:on-failure),另外设置resources.reservations要注意,不要超出总内存或cpu百分比,否者会导致后面服务无法获取cpu或内存资源出现“no suitable node (insufficien”错误(这个错误很奇怪,某个service不启动,也不输出日志,使用“docker stack ps [xxxx]”查看状态会显示此错误)无法启动
八,参考

Docker swarm搭建总结

Docker 三剑客之 Docker Swarm

使用 Docker Swarm 管理 Docker 集群

如何滚动更新 Service?- 每天5分钟玩转 Docker 容器技术(102)

Docker 小记 — 微信斗牛棋牌源码搭建Compose & Swarm

Docker swarm - 使用体验 1+2

docker node update命令

Docker(六):Docker 三剑客之 Docker Swarm

Docker 引擎的 Swarm 模式:入门教程

docker swarm 搭建与服务更新的更多相关文章

  1. Docker consul的容器服务更新与发现(超详细配图)

    Docker consul的容器服务更新与发现 1.概述 2.部署 1.概述: (1)什么是服务注册与发现: 服务注册与发现是微服务架构中不可或缺的重要组件.起初服务都是单节点的,不保障高可用性,也不 ...

  2. Docker consul的容器服务更新与发现

    Docker consul的容器服务更新与发现 目录 Docker consul的容器服务更新与发现 一.Consul简介 1. 服务注册与发现 2. consul概述 3. consul的两种模式 ...

  3. Docker Swarm搭建多服务器下Docker集群

    对于有多台服务器来讲,如果每一台都去手动操控,那将会是一件非常浪费时间的事情,毕竟时间这东西,于我们而言,十分宝贵,或许在开始搭建环境的时候耗费点时间,感觉是正常的,我也如此,花费大堆时间在采坑和填坑 ...

  4. 使用Docker Swarm搭建分布式爬虫集群

    https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653195618&idx=2&sn=b7e992da6bd1b2 ...

  5. docker~swarm搭建docker高可用集群

    回到目录 Swarm概念 Swarm是Docker公司推出的用来管理docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机.Swarm使用标准的Docker API接口作为其前端访问入 ...

  6. docker swarm overlay stack 服务部署记录

    项目xxx(后端),xxx-ui前端(前后端分离的项目) 依赖mysql,elasticsearch.分别制作了四个镜像来做这件事.希望可以制作跨主机的部署,使用了swarm,以下是学习记录. 参考 ...

  7. docker swarm搭建tidb踩坑日记

    背景 公司新项目数据量翻了一倍,每天上亿数据量的读写,传统的单库单表已经满足不了目前的需求,得考虑下分布式存储了.那用啥呢,之前有考虑用到mycat,但是一进官网,一股山寨气息扑面而来,技术群进群还收 ...

  8. docker swarm 搭建及跨主机网络互连案例分析

    准备工作 安装docker,不建议直接使用Docker官方的yum install docker wget http://yum.dockerproject.org/repo/main/centos/ ...

  9. 33. docker swarm 集群服务通信 之 RoutingMesh - Ingress 网络

    1.作用 当在 任何 一个 swarm 节点去访问 端口服务的时候 会通过 本节点 的 IPVS ( ip virtual service ) 到 真正的 swarm 节点上 当访问 docker h ...

随机推荐

  1. git同步遇到报错

    git同步遇到报错 “fatal: unable to access ‘https://github.com/ruanwenwu/newp.git/‘: Peer reports incompatib ...

  2. exp迁移测试库10.2.0.5

    目的: 将一套10.2.0.5的UP-UNIX系统的数据,迁移到一台Windows环境下. 迁移方案:由于不同的操作系统,为了方便迁移,只是测试,使用EXP/IMP方式. 迁移流程: 一.源端导出 1 ...

  3. Debug程序的使用

    一.什么是Debug程序: Debug是DOS, Windows(但是Win7 64位没有,8 10不清楚.)都提供的实模式程序的调试工具, 使用它,可以查看CPU各种寄存器中的内容,内存的情况和在机 ...

  4. 记录一次axios请求造成的数组初始化失败

    axios请求是一个异步的请求,简单来讲就是在做其他事情的时候可以把这个先放一边等其他的事情做完后再来做这件事件. 我之前这样调用了一个方法: mounted() { this.first() thi ...

  5. 异常详细信息: System.BadImageFormatException: 未能加载文件或程序集“Maticsoft.Common”或它的某一个依赖项。试图加载格式不正确的程序。

    异常详细信息: System.BadImageFormatException: 未能加载文件或程序集“Maticsoft.Common”或它的某一个依赖项.试图加载格式不正确的程序. 解决方法: 点击 ...

  6. 第四次Scrum冲刺----Life in CCSU

    一.第四次Scrum任务 小组GitHub地址链接 个人GitHub地址链接:https://github.com/2505486985/FirstScrum 继续上次完成的任务,这次完成校园服务中的 ...

  7. js ·节点的知识点

    1. DOM document object model (1) 节点树状图 Document>documentElement>body>tagname 2. 我们常用的节点类型 元 ...

  8. linux systemd详解

    CentOS 7 使用systemd替换了SysV.Systemd目的是要取代Unix时代以来一直在使用的init系统,兼容SysV和LSB的启动脚本,而且够在进程启动过程中更有效地引导加载服务. s ...

  9. Far manager界面混乱问题解决

    刚装完,win7和XP上运行,都是界面混乱,看到网上说是属性里改字体,改编码,我试了半天不行: 最后发现,需要far.exe创建快捷方式,在快捷方式的属性里设置字体,编码,窗口大小,废话不多说,上图: ...

  10. 【SQL】 借助游标来实现文本的分列与合并

    有时我们会遇到需要把表中个别字段拆分成多条数据或是把多条数据合并到一起的情况.一般的编程语言都有函数“split”和“join”来实现,而SQL中既没有这些函数也没有类似数组和列表这类方便保存成组数据 ...