【每天学一点】docker-compose中的deploy

起因

由于要进行服务的微服务化部署,由于硬件限制,我们目前采用的是Swarm作为容器编排的工具。对应于k8s中的pod,swarm中有dab这种概念,即分布式应用包,目前还没有去探索这个的使用,由于还是实验性的特性,目前还不涉及,这里主要还是通过docker-compose.yaml的方式将多个微服务统一运维。

采用的技术

使用的是docker stack deploy <args>命令进行的部署。

官网上该命令有如下的参数:


docker stack 的可选参数

由于使用的是docker-compose文件,这里直接通过compose-file进行部署即可,例如官网的例子

docker stack deploy --compose-file docker-compose.yml vossibility

甚至可以通过叠加compose文件,来修改前一个文件中的配置

docker stack deploy --compose-file docker-compose.yml -c docker-compose.prod.yml vossibility

那么再来看看其他的可选命令:
namespacekubeconfig是k8s的专属命令,这里就不做过多解释,直接看swarm相关的。

可选参数 参数含义
prune 表示削减不再引用的服务
resolve-image 请求仓库来重新解析镜像的摘要和支持的平台
with-registry-auth 发送仓库的授权详情到Swarm代理
orchestrator 使用的容器编排服务

目前觉得prune这个参数比较关键,可以把一些down掉的service进行自动清理。

回归正题

如何通过docker-compose.yml配置文件进行集群化部署呢?

首先需要知道的,docker-compose文件中哪个部分主要对应了swarm中的运维需求,答案就是deploy参数下的各种配置。

deploy下的各种配置

上图中的配置一个个来看;

首先来看,最下面标注的docker stack deploy不支持的参数,具体可以参考下图:

不支持的参数

上面的参数,就算yaml中包含,在stack的时候也会被忽略,当然也可以为了docker-compose up留着这些配置。

下面对于各个参数的说明中的例子,直接偷懒粘贴官网的例子了。

endpoint_mode:

这个命令是在 3.2版本中开始引入的,主要是用于指定服务发现方法,以方便外部的客户端连接到swarm

主要包含两个:

  • vip: 这个是默认的方案。即通过虚拟的IP对外暴露服务,客户端无法察觉有多少个节点提供服务,也不知道实际提供服务的IP和端口。
  • dnsrr:这个是DNS的轮询调度。客户端访问的时候,Docker会通过DNS列表返回对应的服务一系列IP地址,客户连接其中的一个。这种方式通常用于使用自己的负载均衡器,或者window和linux的混合应用。
version: "3.9"

services:
  wordpress:
    image: wordpress
    ports:
      - "8080:80"
    networks:
      - overlay
    deploy:
      mode: replicated
      replicas: 2
      endpoint_mode: vip

  mysql:
    image: mysql
    volumes:
       - db-data:/var/lib/mysql/data
    networks:
       - overlay
    deploy:
      mode: replicated
      replicas: 2
      endpoint_mode: dnsrr

volumes:
  db-data:

networks:
  overlay:

labels

标签是用于service之上,并非附加在service中的容器上。

如果像将其附在所有容器上,则在deploy之外定义labels.

version: "3.9"
services:
  web:
    image: web
    deploy:
      labels:
        com.example.description: "This label will appear on the web service"

mode

用于指定是以副本模式(默认)启动还是全局模式,如果是全局模式,类似于开始于k8s中的DaemonSet,会在每个节点上启动且只启动一个服务。

version: "3.9"
services:
  worker:
    image: dockersamples/examplevotingapp_worker
    deploy:
      mode: global

placement

这个参数在运维的时候尤为关键,主要用于指定容忍偏好,这个在k8s中同样有对应的概念

version: "3.9"
services:
  db:
    image: postgres
    deploy:
      placement:
        constraints:
          - "node.role==manager"
          - "engine.labels.operatingsystem==ubuntu 18.04"
        preferences:
          - spread: node.labels.zone

其中,容忍包含了:

node attribute matches example
node.id 节点id node.id==2ivku8v2gvtg4
node.hostname 节点主机名 node.hostname!=node-2
node.role 节点角色 (manager/worker) node.role==manager
node.platform.os 姐节点操作系统 node.platform.os==windows
node.platform.arch 节点架构 node.platform.arch==x86_64
node.labels 用户定义的labels node.labels.security==high
engine.labels Docker 引擎的 labels engine.labels.operatingsystem==ubuntu-14.04

容忍,表示服务可以部署在符合容忍限定的节点上。

至于偏好,只有一个参数,就是spread,其参数值为节点的属性,即容忍表中的内容。

偏好,表示的是服务可以均匀分布在指定的标签下,如:node.labels.zone这个标签在集群中有三个值,分别为west、east、north,那么服务中的副本将会等分为三份,分布到带有三个标签的节点上。

max_replicas_per_node

这个是3.8中添加的配置。

字面意思,就是控制每个节点上最多的副本数

version: "3.9"
services:
  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 6
      placement:
        max_replicas_per_node: 1

要注意的是,当最大副本数*集群中可部署服务的节点数<副本数,会报错。

replicas

用于指定副本数,只有mode为副本模式的时候生效。

resources

这个参数在运维的时候尤为关键,主要用于限制服务的资源。

注意这里的配置在版本3中和版本2有较大差别。

version: "3.9"
services:
  redis:
    image: redis:alpine
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M

limit用于限制最大的资源使用数量,reservation为最低的资源占用量。

restart_policy

重启策略

version: "3.9"
services:
  redis:
    image: redis:alpine
    deploy:
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s
  • condition: 表示的是重启的条件,分为 none,on-failure,any(默认)
  • delay:表示尝试重启的时间间隔(默认5s)
  • max_attempts: 最多的尝试次数(默认一直重试)
  • window:在判断重启是否成功之前等待时间(一个总的时间,如果超过这个时间还没有成功,则不再重启)

rollback_config

3.7版本加入

用于指定回滚的策略

由于和升级策略相关参数基本一直,放在下面讲

update_config

用于指定升级的策略

version: "3.9"
services:
  vote:
    image: dockersamples/examplevotingapp_vote:before
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
        order: stop-first
  • parallelism:同时升级[回滚]的容器数
  • delay:升级[回滚]的时间间隔
  • failure_action:失败后如何做:continue, rollback(仅在update_config中有), or pause (默认 pause)
  • monitor: 检测失败的时间检测(默认为5s,支持ns、us、ms、s、m、h)
  • max_failure_ratio:最大失败率
  • order:有两个stop-first(默认)和start-first,一个是先停止旧的,一个是先启动新的,之后覆盖旧的

以上。

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