docker swarm 搭建与服务更新
一,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 文件,它定义了一个或多个服务,并定义了服务的环境变量、部署标签、容器数量以及相关的环境特定配置等。
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之前的配置 |
如何滚动更新 Service?- 每天5分钟玩转 Docker 容器技术(102)
Docker 小记 — 微信斗牛棋牌源码搭建Compose & Swarm
docker swarm 搭建与服务更新的更多相关文章
- Docker consul的容器服务更新与发现(超详细配图)
Docker consul的容器服务更新与发现 1.概述 2.部署 1.概述: (1)什么是服务注册与发现: 服务注册与发现是微服务架构中不可或缺的重要组件.起初服务都是单节点的,不保障高可用性,也不 ...
- Docker consul的容器服务更新与发现
Docker consul的容器服务更新与发现 目录 Docker consul的容器服务更新与发现 一.Consul简介 1. 服务注册与发现 2. consul概述 3. consul的两种模式 ...
- Docker Swarm搭建多服务器下Docker集群
对于有多台服务器来讲,如果每一台都去手动操控,那将会是一件非常浪费时间的事情,毕竟时间这东西,于我们而言,十分宝贵,或许在开始搭建环境的时候耗费点时间,感觉是正常的,我也如此,花费大堆时间在采坑和填坑 ...
- 使用Docker Swarm搭建分布式爬虫集群
https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653195618&idx=2&sn=b7e992da6bd1b2 ...
- docker~swarm搭建docker高可用集群
回到目录 Swarm概念 Swarm是Docker公司推出的用来管理docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机.Swarm使用标准的Docker API接口作为其前端访问入 ...
- docker swarm overlay stack 服务部署记录
项目xxx(后端),xxx-ui前端(前后端分离的项目) 依赖mysql,elasticsearch.分别制作了四个镜像来做这件事.希望可以制作跨主机的部署,使用了swarm,以下是学习记录. 参考 ...
- docker swarm搭建tidb踩坑日记
背景 公司新项目数据量翻了一倍,每天上亿数据量的读写,传统的单库单表已经满足不了目前的需求,得考虑下分布式存储了.那用啥呢,之前有考虑用到mycat,但是一进官网,一股山寨气息扑面而来,技术群进群还收 ...
- docker swarm 搭建及跨主机网络互连案例分析
准备工作 安装docker,不建议直接使用Docker官方的yum install docker wget http://yum.dockerproject.org/repo/main/centos/ ...
- 33. docker swarm 集群服务通信 之 RoutingMesh - Ingress 网络
1.作用 当在 任何 一个 swarm 节点去访问 端口服务的时候 会通过 本节点 的 IPVS ( ip virtual service ) 到 真正的 swarm 节点上 当访问 docker h ...
随机推荐
- Python标准库之textwrap模块
textwrap通过调整换行符的位置来格式化文本:以下是全部方法 __all__ = ['TextWrapper', 'wrap', 'fill', 'dedent', 'indent', 'shor ...
- linux下安装python3(转)
一.Linux下安装Python 二.Linux下Python安装完成后如何使用pip命令 三.Linux下Python安装完成后如何使用yum命令 四.Linux下安装Anaconda 五.Linu ...
- Spherical CNNs代码配置过程
ICLR18 best paper: Spherical CNNs 论文链接:https://arxiv.org/abs/1801.10130 GITHUB地址:https://github.com/ ...
- Gym101889J. Jumping frog(合数分解+环形dp预处理)
比赛链接:传送门 题目大意: 一只青蛙在长度为N的字符串上跳跃,“R”可以跳上去,“P”不可以跳上去. 字符串是环形的,N-1和0相连. 青蛙的跳跃距离K的取值范围是[1, N-1],选定K之后不可改 ...
- 解题报告 『[USACO08NOV]Mixed Up Cows(状压动规)』
原题地址 观察数据范围:4 ≤ N ≤ 16. 很明显,这是一道状压DP. 定义:dp[i][j]表示队尾为奶牛i,当前含奶牛的状态为j,共有多少组符合条件的队伍. 代码实现如下: #include ...
- Python 模块调用的变量与路径
自己编写的python代码经常需要分模块文件以及包,梳理一下调用顺序.执行顺序.工作路径.函数与变量等 工作路径 首先是工作路径,当模块代码放在统一的包内的时候,其路径和外层的包路径不同,当作为主调用 ...
- 20164301 Exp1 PC平台逆向破解
逆向及Bof基础实践 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常执行流程是:main调用foo函数, foo函数会简单回显任何用户输入的字符串.该程序同时包含另一 ...
- Django(其二)
session def session_login(request): if request.method=='POST': username = request.POST.get('user') p ...
- vue原生table合并单元格并可编辑
<template> <div> <div class="el-card box-card table_container"> <div ...
- AE插件:能量激光描边光效特效Saber Mac汉化版
与大家分享一款非常好用的AE插件Saber插件汉化版.videocopilot saber是一款能量激光描边光效特效AE插件,可以帮助用户制作出能量激光.传送门.霓虹灯.电流.光束.光剑等效果.小编现 ...