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的基本架构如下图所示,

image
  • 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 查看

image

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

docker swarm join-token [worker|manager]
image

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

image

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

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

然后执行防火墙重新加载

firewall-cmd --reload

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

image

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

image

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

image

脱离集群

docker swarm leave

结果如下:

image

三,docker-stack.yml文件编排

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

注:stack不支持的指令

image

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

结果如下:

image

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

docker stack ls [flags]
image

SERVICES 显示堆中有多少个服务

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

docker stack ps [OPTIONS] STACK [flags]
image

对应 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]
image
  • NAME 表示堆中的服务
  • MODE 文件中配置的启动模式,这里都是 replicated (副本模式)
  • REPLICAS 表示正在运行的/启动的副本数量

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

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

image

六,服务升级****

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服务,此方法执行前,必须将 镜像文件上传到远程仓中,程序会自动拉取远程仓中镜像文件与启动服务的镜像对比,如果没有变化不会启动更新,也不会重启服务

image

即使设置了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时 要加上

image

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

2,更新节点数目

docker service scale test_demo-docker=3

运行结果:

image

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

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

结果如下

image

七,更新节点

docker node update [OPTIONS] NODE [flags]

参数:

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

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

image

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

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]”查看状态会显示此错误)无法启动

原文出自:
https://www.cnblogs.com/ejiyuan/p/10580331.html

其他:
Docker Swarm 服务版本更新与回滚
37. docker swarm docker service 的更新

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容