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 文件,它定义了一个或多个服务,并定义了服务的环境变量、部署标签、容器数量以及相关的环境特定配置等。
二,启动Swarm,并创建集群
Docker 默认包含了 Swarm,因此可以直接使用,初始化命令:docker swarm init 
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之前的配置
七,注意:
如果一台机器启用多个服务注意,合理分配cpu与内存资源,因tomcat在启动编译时会很吃内存,且docker是多线程启动的,所有最好是限定一下(设置resources.limits)否者会导致内存在同一时刻用光,某些服务启动失败当然也可是设置出错重启(restart_policy.condition:on-failure),另外设置resources.reservations要注意,不要超出总内存或cpu百分比,否者会导致后面服务无法获取cpu或内存资源出现“no suitable node (insufficien”错误(这个错误很奇怪,某个service不启动,也不输出日志,使用“docker stack ps [xxxx]”查看状态会显示此错误)无法启动
八,参考

Docker swarm搭建总结

Docker 三剑客之 Docker Swarm

使用 Docker Swarm 管理 Docker 集群

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

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

 Docker swarm - 使用体验 1+2

docker node update命令

Docker(六):Docker 三剑客之 Docker Swarm

Docker 引擎的 Swarm 模式:入门教程

posted @ 2019-03-23 16:13  ejiyuan  阅读(8873)  评论(0编辑  收藏  举报