docker swarm ,滚动更新

一、Docker swarm

Swarm 是 Docker 公司在 2014 年 12 月初发布的一套较为简单的工具,用来管理 Docker 集群,它将一群 Docker 宿主机变成一个单一的,虚拟的主机。Swarm 使用标准的 Docker API接口作为其前端访问入口,换言之,各种形式的 Docker Client(docker client in go, docker_py,docker 等)均可以直接与 Swarm 通信。Swarm 几乎全部用 Go 语言来完成开发。Swarm deamon 只是一个调度器(Scheduler)加路由器(router),Swarm 自己不运行容器,它只是接受 docker 客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使Swarm 由于某些原因挂掉了,集群中的节点也会照常运行,当 Swarm 重新恢复运行之后,它会收集重建集群信息。

swarm create
Swarm 中 swarm create 命令用于创建一个集群标志,用于 Swarm 管理 Docker 集群时,Docker Node 的节点发现功能。发起该命令之后,Swarm 会前往 Docker Hub 上内建的发现服务中获取一个全球唯一的token,用以唯一的标识 Swarm 管理的 Docker 集群。

swarm manage
Swarm 中 swarm manage 是最为重要的管理命令。一旦 swarm manage 命令在 Swarm 节点上被触发,则说明用户需要 swarm 开始管理 Docker 集群。从运行流程的角度来讲,swarm 经历的阶段主要有两点:启动 swarm、接收并处理 Docker 集群管理请求。

Swarm 启动的过程包含三个步骤:
发现 Docker 集群中的各个节点,收集节点状态、角色信息,并监视节点状态的变化;初始化内部调度(scheduler)模块;创建并启动 API 监听服务模块;

第一个步骤,Swarm 发现 Docker 集群中的节点。发现(discovery)是 Swarm 中用于维护Docker 集 群 状 态 的 机 制 。 既 然 涉 及 到 发 现 ( discovery ) , 那 在 这 之 前 必 须 先 有 注 册(register)。Swarm 中有专门负责发现(discovery)的模块,而关于注册(register)部分,不同的 discovery 模式下,注册(register)也会有不同的形式。

目 前 , Swarm 中 提 供 了 5 种 不 同 的 发 现 ( discovery ) 机 制 : Node Discovery 、 FileDiscovery、Consul Discovery、EtcD Discovery 和 Zookeeper Discovery。
Hosted Discovery with Docker Hub,Docker Hub 提供的发现服务,需要连接外网。
docker run -d -p <manager_port>:2375 swarm manage token://<cluster_id>
基于 KV 分布式存储系统,支持 etcd,consul,zookeeper
swarm join --advertise=<node_ip:2375> consul://<consul_addr>/<optional path prefix>
静态文件描述
swarm manage -H tcp://<swarm_ip:swarm_port> file:///tmp/my_cluster
静态 IP 列表
swarm manage -H <swarm_ip:swarm_port> nodes://<node_ip1:2375>,<node_ip2:2375>

第二个步骤,Swarm 内部的调度(scheduler)模块被初始化。swarm 通过发现机制发现所有注册的 Docker Node,并收集到所有 Docker Node 的状态以及具体信息。此后,一旦Swarm 接收到具体的 Docker 管理请求,Swarm 需要对请求进行处理,并通过所有 DockerNode 的状态以及具体信息,来筛选(filter)决策到底哪些 Docker Node 满足要求,并通过一定的策略(strategy)将请求转发至具体的一个 Docker Node。

第三个步骤,Swarm 创建并初始化 API 监听服务模块。从功能的角度来讲,可以将该模块抽象为 Swarm Server。需要说明的是:虽然 Swarm Server 完全兼容 Docker 的 API,但是有不少 Docker 的命令目前是不支持的,毕竟管理 Docker 集群与管理单独的 Docker 会有一些区别。当 Swarm Server 被初始化并完成监听之后,用户即可以通过 Docker Client 向 Swarm发送 Docker 集群的管理请求。

Swarm 的 swarm manage 接收并处理 Docker 集群的管理请求,即是 Swarm 内部多个模块协同 合 作 的 结 果 。 请 求 入 口 为 Swarm Server , 处 理 引 擎 为 Scheduler , 节 点 信 息 依 靠Disocovery。

swarm join
Swarm 的 swarm join 命令用于将 Docker Node 添加至 Swarm 管理的 Docker 集群中。从这点也可以看出 swarm join 命令的执行位于 Docker Node,因此在 Docker Node 上运行该命令,首先需要在 Docker Node 上安装 Swarm,由于该 Swarm 只会执行 swarm join 命令,故可以将其当成 Docker Node 上用于注册的 agent 模块。功能而言,swarm join 可以认为是完成 Docker Node 在 Swarm 节点处的注册(register)工作,以便 Swarm 在执行 swarm manage 时可以发现该 Docker Node。然而,上文提及的 5 种discovery 模式中,并非每种模式都支持 swarm join 命令。不支持的 discovery 的模式有 Node Discovery 与 File Discovery。

Docker Node 上 swarm join 执行之后,标志着 Docker Node 向 Swarm 注册,请求加入 Swarm管理的 Docker 集群中。Swarm 通过注册信息,发现 Docker Node,并获取 Docker Node 的状态以及具体信息,以便处理 Docker 请求时作为调度依据。

swarm list
Swarm 中的 swarm list 命令用以列举 Docker 集群中的 Docker Node。

Docker Node 的信息均来源于 Swarm 节点上注册的 Docker Node。而一个 Docker Node 在Swarm 节点上注册,仅仅是注册了 Docker Node 的 IP 地址以及 Docker 监听的端口号。

使用 swarm list 命令时,需要指定 discovery 的类型,类型包括:token、etcd、file、zk 以及<ip>。而 swarm list 并未罗列 Docker 集群的动态信息,比如 Docker Node 真实的运行状态,或者 Docker Node 在 Docker 集群中扮演的角色信息。

实验环境 rhel7

Server1    192.168.122.21      manager

Server2    192.168.122.22      node

Server3    192.168.122.23      node

安装docker服务

开启服务

[[email protected] ~]# systemctl start docker


查看版本

集群搭建

创建docker swarm集群:

[[email protected] ~]# docker swarm init

加入集群

其它两台运行   使其加入集群 

docker swarm join \     --token SWMTKN-1-4shsvq36kx6b0f8h4yma6wnmtkgewqhlbjmi284b223kxa0hdr-bqnj0zo8gbss6hgdbveesfqut \     192.168.122.21:2377

 

[[email protected] ~]# docker node  --help 


三个节点均导入

[[email protected] ~]# docker load -i nginx.tar 

[[email protected] ~]# docker service create --name web -p 80:80 --replicas 2 nginx


[[email protected] ~]# docker node  ls    #查看节点

[[email protected] ~]# docker service ls #查看服务状态


[[email protected] ~]# docker service ps web  #查看web状态


浏览器访问

[[email protected] ~]# docker service scale web=4 #设置服务数量


添加可视图形界面

[[email protected] ~]# docker load -i visualizer.tar   


[[email protected] ~]# docker service create \

> --name=viz \

> --publish=8080:8080/tcp \

> --constraint=node.role==manager \

> --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \

> dockersamples/visualizer 


二、滚动更新(灰度更新)


先从物理机导出镜像,分别发送到个结点

导出镜像
[[email protected] ~]# docker save -o apache.tar rhel7:v2

各个节点导入


[[email protected] ~]# docker load -i apache.tar

[[email protected] ~]# docker service update --image rhe7:v2 --update-parallelism 2 --update-delay 2s web

#每2秒更新一次,每次更新2个



访问

192.168.122.21/22/23

写入页面


分别拷入到容器里

[[email protected] ~]# docker cp index.html 5694899fc975:/usr/share/nginx/html 


测试  实现负载均衡

浏览器访问IP,页面切换

原文地址:http://blog.51cto.com/13362895/2131143

时间: 2024-08-22 17:53:47

docker swarm ,滚动更新的相关文章

Docker Swarm(八)滚动更新、回滚服务

滚动更新.回滚服务 默认情况下, swarm一次只更新一个副本,并且两个副本之间没有等待时间,我们可以通过: --update-parallelism:设置并行更新的副本数量. --update-delay: 指定滚动更新的时间间隔. 创建8个副本的masl服务: docker service create --name masl -e TZ="Asia/Shanghai" --network mrp_net --replicas 8 -p 8081:8080 \--update-de

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

在前面的实验中,我们部署了多个副本的服务,本节将讨论如何滚动更新每一个副本. 滚动更新降低了应用更新的风险,如果某个副本更新失败,整个更新将暂停,其他副本则可以继续提供服务.同时,在更新的过程中,总是有副本在运行的,因此也保证了业务的连续性. 下面我们将部署三副本的服务,镜像使用 httpd:2.2.31,然后将其更新到 httpd:2.2.32. 创建服务: docker service create --name my_web --replicas=3 httpd:2.2.31 将 serv

如何调用docker swarm service的API来创建及更新服务

平衡的推进,先作一个原型吧. #!/usr/bin/env python # -*- coding: utf-8 -*- import requests import json #定义docker swarm的管理节点ip,端口号,API版本,服务名, 服务URL #在后期集成到自动化部署时,需要精简数据结构,完善data, 增加精准判断及空间回收 #API更多用途参考: https://docs.docker.com/engine/api/v1.29/ docker_swarm_ip_port

(转) Docker swarm - 使用体验 1+2

背景 凭借敏捷开发部署理念的推行,相信对于很多人来说docker这项容器技术已经并不陌生,Docker 1.12引擎发布了快两个月,新引擎中包含了许多特性.诸如: Swarm模式,容器集群的健康检查,节点的身份加密,docker Service API调用,容器启动的过滤匹配方式(constraint), docker的内建路由,以及支持在多平台系统上运行docker(MAC.Windows.AWS.AZURE),以及一些插件升级等等. 特性之多,就连Docker 自己的产品经理也表示这次的新版

docker——三剑客之Docker swarm

Docker Swarm是Docker官方的三剑客项目之一,提供Docker容器集群服务,是Docker官方对容器云生态进行支持的核心方案.使用它,用户可以将多个Docker主机封装为单个大型的虚拟Docker主机,快速打造一套容器云平台. Docker Swarm是Docker公司推出的官方容器集群平台,基于Go语言实现.目前,包括Rackspace在内的许多平台都采用了Swarm,用户很容易在AWS等公有云平台使用Swarm. Swarm的前身是Beam项目和libswarm项目,首个正式版

docker swarm英文文档学习-1-概述

参考https://docs.docker.com/engine/swarm/ Swarm mode overview群模式概述 Docker的当前版本包括集群模式,用于本地管理称为集群的Docker引擎集群.使用Docker CLI创建一个集群,将应用程序服务部署到一个集群,并管理集群行为. 1.突出特性: 1)与Docker引擎集成的集群管理 : 使用Docker引擎CLI创建一组Docker引擎的集群,你可以在其中部署应用程序服务.你不需要额外的编配软件来创建或管理集群. 2)去中心化设计

docker swarm英文文档学习-8-在集群中部署服务

Deploy services to a swarm在集群中部署服务 集群服务使用声明式模型,这意味着你需要定义服务的所需状态,并依赖Docker来维护该状态.该状态包括以下信息(但不限于): 应该运行服务容器的镜像名称和标记有多少容器参与服务是否有任何端口暴露给集群之外的客户端当Docker启动时,服务是否应该自动启动重启服务时发生的特定行为(例如是否使用滚动重启)服务可以运行的节点的特征(例如资源约束和位置首选项)有关群模式的概述,请参见 Swarm mode key concepts.有关

Docker系列(十四):Docker Swarm集群

一.Swarm简介 Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源.Swarm和Kubernetes比较类似,但是更加轻便,具有的功能也较kubernetes更少一些. Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令.目前,Swarm 是 Do

linux docker swarm集群安装

1. docker swarm 简介 Docker Swarm是Docker自己的Docker容器本地集群解决方案,具有与Docker生态系统紧密集成并使用自己的API的优势.它监视跨服务器群集的容器数量,是在没有其他硬件的情况下创建群集docker应用程序的最便捷方式.它为Dockerized应用程序提供了一个小规模但有用的编排系统. 使用Docker Swarm的优点 与docker集成的集群管理工具 去中心化设计,只使用docker引擎即可创建各类节点 声明式服务模型.可以声明的方式来定义