一、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