我是靠谱客的博主 简单诺言,最近开发中收集的这篇文章主要介绍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 重新恢复运行之后,它会收集重建集群信息。

Screenshot from 2018-06-20 23-03-51.png




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服务

Screenshot from 2018-06-20 23-20-39.png


开启服务

[root@server1 ~]# systemctl start docker


查看版本

Screenshot from 2018-06-20 23-23-00.png


集群搭建

创建docker swarm集群:

[root@server1 ~]# docker swarm init

Screenshot from 2018-06-20 23-24-34.png

加入集群

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

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

Screenshot from 2018-06-20 23-27-01.png 

[root@server1 ~]# docker node  --help 

Screenshot from 2018-06-20 23-27-42.png



三个节点均导入

[root@server1 ~]# docker load -i nginx.tar 

[root@server1 ~]# docker service create --name web -p 80:80 --replicas 2 nginx


[root@server1 ~]# docker node  ls    #查看节点

Screenshot from 2018-06-20 23-28-34.png


[root@server1 ~]# docker service ls #查看服务状态

Screenshot from 2018-06-20 23-30-37.png


[root@server1 ~]# docker service ps web  #查看web状态

Screenshot from 2018-06-20 23-31-07.png


浏览器访问

Screenshot from 2018-06-20 23-32-32.pngScreenshot from 2018-06-20 23-32-42.pngScreenshot from 2018-06-20 23-32-50.png



[root@server1 ~]# docker service scale web=4 #设置服务数量


Screenshot from 2018-06-20 23-33-32.png


添加可视图形界面

[root@server1 ~]# docker load -i visualizer.tar   

Screenshot from 2018-06-20 23-34-22.png


[root@server1 ~]# 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 


Screenshot from 2018-06-20 23-35-32.png


Screenshot from 2018-06-20 23-41-56.png


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


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

导出镜像 [root@foundation12 ~]# docker save -o apache.tar rhel7:v2

各个节点导入


[root@server1 ~]# docker load -i apache.tar

Screenshot from 2018-06-20 23-43-13.png


[root@server1 ~]# docker service update --image rhe7:v2 --update-parallelism 2 --update-delay 2s web

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


Screenshot from 2018-06-20 23-44-18.png


访问

Screenshot from 2018-06-20 23-46-05.png


192.168.122.21/22/23

Screenshot from 2018-06-20 23-46-26.png


写入页面

Screenshot from 2018-06-20 23-47-47.png


分别拷入到容器里

[root@server1 ~]# docker cp index.html 5694899fc975:/usr/share/nginx/html 


Screenshot from 2018-06-20 23-48-29.png


测试  实现负载均衡

浏览器访问IP,页面切换



转载于:https://blog.51cto.com/13362895/2131143

最后

以上就是简单诺言为你收集整理的docker swarm ,滚动更新的全部内容,希望文章能够帮你解决docker swarm ,滚动更新所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部