docker swarm 搭建与服务更新

Posted on 2019-03-23 16:13 ejiyuan 阅读() 评论() 编辑 收藏

,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.99.100

此时将本机ip“192.168.99.100”,会默认当前节点为 Leader

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

docker swarm join-token [worker|manager]

执行 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: stop-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:设置服务资源分配,在下例中,wordpress服务限制使用不超过50M的内存和0.50(50%)的可用处理时间(CPU),并且拥有20M的内存和0.25个CPU时间(总是可用)。

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

 

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

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

2,更新节点

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之前的配置

八,参考

Docker swarm搭建总结

使用 Docker Swarm 管理 Docker 集群

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

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

 Docker swarm – 使用体验 1+2

docker node update命令

版权声明:本文为ejiyuan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ejiyuan/p/10580331.html