admin

Docker Stack 部署应用参数详解

admin 虚拟化 2023-12-06 427浏览 0

Docker Stack 只需对已有的 docker-compose.yml 配置文件稍加改造就可以完成 Docker 集群环境下的多服务编排。


docker stack deploy 不支持的参数:

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

build
cgroup_parent
container_name
devices
tmpfs
external_links
links
network_mode
restart
security_opt
userns_mode

stack参数详解(没事多翻翻看)

deploy:指定与服务的部署和运行有关的配置。注:只在 swarm 模式和 stack 部署下才会有用。且仅支持 V3.4 及更高版本。

可以选参数:

endpoint_mode:访问集群服务的方式。3.2版本开始引入的配置。用于指定服务发现,以方便外部的客户端连接到swarm

vip:默认的方案。即通过 Docker 集群服务一个对外的虚拟 ip对外暴露服务,所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器,客户端无法察觉有多少个节点提供服务,也不知道实际提供服务的IP和端口。

dnsrr:DNS的轮询调度。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。客户端访问的时候,Docker集群会通过DNS列表返回对应的服务一系列IP地址,客户连接其中的一个。这种方式通常用于使用自己的负载均衡器,或者window和linux的混合应用。

labels:在服务上设置标签,并非附加在service中的容器上。如果在容器上设置标签,则在deploy之外定义labels。可以用容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels。

mode:用于指定是以副本模式(默认)启动还是全局模式

replicated:副本模式,复制指定服务到集群的机器上。默认。

global:全局模式,服务将部署至集群的每个节点。类似于k8s中的DaemonSet,会在每个节点上启动且只启动一个服务。

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

placement:主要用于指定约束和偏好。这个参数在运维的时候尤为关键

constraints(约束):表示服务可以部署在符合约束条件的节点上,包含了:

node attribute matches example

Home | NODE.ID 节点id Home | 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

preferences(偏好):表示服务可以均匀分布在指定的标签下。

preferences 只有一个参数,就是spread,其参数值为节点的属性,即约束表中的内容

例如:node.labels.zone这个标签在集群中有三个值,分别为west、east、north,那么服务中的副本将会等分为三份,分布到带有三个标签的节点上。

max_replicas_per_node:3.8版本中开始引入的配置。控制每个节点上最多的副本数。

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

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

示例:配置 redis 集群运行需要的 cpu 的百分比 和 内存的占用。避免占用资源过高出现异常。

limit:用于限制最大的资源使用数量

cpus:cpu占比,值的格式为百分比的小数格式

memory:内存的大小。示例:512M

reservation:为最低的资源占用量。

cpus

memory

restart_policy:容器的重启策略

condition:重启的条件。可选 none,on-failure 或者 any。默认值:any

delay:尝试重启的时间间隔(默认值:5s)。

max_attempts:最大尝试重启容器的次数,超出次数,则不再尝试(默认值:一直重试)。

window:判断重启是否成功之前的等待时间(一个总的时间,如果超过这个时间还没有成功,则不再重启)。

rollback_config:更新失败时的回滚服务的策略。3.7版本加入。和升级策略相关参数基本一致。

update_config:配置应如何更新服务,对于配置滚动更新很有用。

parallelism:同时升级[回滚]的容器数

delay:升级[回滚]一组容器的时间间隔

failure_action:若更新[回滚]失败之后的策略:continue、 pause、rollback(仅在update_config中有) 。默认 pause

monitor:容器升级[回滚]之后,检测失败的时间检测 (支持的单位:ns|us|ms|s|m|h)。默认为 5s

max_failure_ratio:最大失败率

order:升级[回滚]期间的操作顺序。可选:stop-first(串行回滚,先停止旧的)、start-first(并行回滚,先启动新的)。默认 stop-first 。注意:只支持v3.4及更高版本

compose.yml 文件示例

version: "3"# 版本号,deploy功能是3版本及以上才有的
services:# 服务,每个服务对应配置相同的一个或者多个docker容器
  redis:# 服务名,自取
    image: redis:alpine# 创建该服务所基于的镜像。使用stack部署,只能基于镜像
    ports: # 容器内外的端口映射情况
      - "1883:1883"
      - "9001:9001"
    networks:# 替代了命令行模式的--link选项
      - fiware
    volumes: # 容器内外数据传输的对应地址
      - "/srv/mqtt/config:/mqtt/config:ro"
      - "/srv/mqtt/log:/mqtt/log"
      - "/srv/mqtt/data/:/mqtt/data/"
    command: -dbhost stack_mongo # 此条没有固定的格式,根据具体情况定义
    deploy:
      mode: replicated
      replicas: 6# replicas模式, 副本数目为6
      endpoint_mode: vip
      labels: 
        description: "This redis service label"
      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
      placement:
        constraints:
          - "node.role==worker"# 部署位置,只在工作节点部署
          - "engine.labels.operatingsystem==ubuntu 18.04"
        preferences:
          - spread: node.labels.zone
      update_config:
        parallelism: 2
        delay: 10s
        order: stop-first
networks: # 定义部署该项目所需要的网络
  fiware:

stack 常用命令

docker stack:编排部署应用

# 部署一个新的stack(堆栈)或更新现有的stack。别名:deploy, up
docker stack deploy [OPTIONS] 自定义STACK名称
# 选项:
-c, --compose-file strings # Compose文件的路径,或从标准输入中读取的“-”
--prune # 表示削减不再引用的服务。可以把一些down掉的service进行自动清理。
--orchestrator string # 指定编排模式 (swarm|kubernetes|all)
--resolve-image string # 请求仓库来重新解析镜像的摘要和支持的平台。("always"|"changed"|"never") (默认 "always")
--with-registry-auth # 发送仓库的授权详情到Swarm代理
--orchestrator # 使用的容器编排服务

# 通过compose.yml文件指令部署
docker stack deploy -c 文件名.yml 自定义STACK名称

# 列出现有堆栈。别名:ls, list
docker stack ls [OPTIONS]

# 列出堆栈中的任务
docker stack ps [OPTIONS] STACK
# 选项:
--no-trunc # 输出完整信息

# 删除一个或多个堆栈。别名:rm, remove, down
docker stack rm [OPTIONS] STACK [STACK...]
# 选项
--orchestrator string   # 指定适配器 (swarm|kubernetes|all)

# 列出堆栈中的服务
docker stack services [OPTIONS] STACK

nginx简单示例(可根据自身情况添加需要的参数和配置,注意configs参数3.4以后才有):

version: '3.8'
services:  
  nginx:
    image: nginx
    ports:
      - "90:80"
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - /opt/web/:/usr/share/nginx/html
    configs:
      - source: nginx_config
        target: /etc/nginx/nginx.conf
    command: /bin/bash -c "nginx -g 'daemon off;'"
    networks:
     - lanweb
    deploy:
      replicas: 3
      update_config:
        parallelism: 1    
        delay: 10s
      restart_policy:
        condition: on-failure
configs:
  nginx_config:
    file: /opt/nginx.conf
networks:
  lanweb:
    driver: overlay
    driver_opts:
      encrypted: "true"

启动:

docker stack deploy -c docker-stack.yml mhsjweb

image.png

查看:

docker stack services mhsjweb

docker stack ps mhsjweb

image.png

版权声明

本站《作品展示》类文章均为原创,转载必须注明出处,技术分享类文章部分来源于网络,版权归原作者所有,若侵权请留言。

发表评论