docker compose swarmswarm 中怎么更新node的角色

Docker Swarm学习笔记(二)_马哥Linux运维_传送门
Docker Swarm学习笔记(二)
马哥Linux运维
搭建基础环境 官方文档中演示时用到了五台主机/虚拟机;这里因为资源有限,只用三台;创建虚拟机(可以用主机,也可以用虚拟机);安装Ubuntu 16.04 Server amd64系统(系统版本最好不要低于Ubuntu 14.04);开启并配置ssh服务(方便操作);安装Docker(仅作参考,也可以根据下面的步骤操作);Docker Registry搭建私有仓库点击预览 和 批量上传镜像到私有仓库(非必需,便于镜像快速复用);启用root用户登录及SSH远程连接(包含失败情况的解决);配置节点 接下来的所有操作都是以root用户进行的。升级软件包(操作对象:manager0,node0,node1);apt-get update && apt-get -y upgrade && apt-get -y install curl安装Docker引擎(操作对象:manager0,node0,node1);curl -sSL / | sh配置并启动Docker引擎,令其监听Swarm节点的2375端口(操作对象:node0,node1)docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock配置发现后端 (操作对象:manager0)前面已经列出了本次学习用到的三台主机的主机名以及其IP地址,下面的操作用到的IP也是这三个主机IP。拉取镜像docker pull progrium/consul启动发现后端docker run -d -p
--name=consul progrium/consul -server -bootstrap创建Swarm集群 创建主管理员(操作对象:manager0)docker run -d -p
swarm manage -H :4000 --replication --advertise 192.168.2.56:4000 consul://192.168.2.56:8500因为这里的manager0既是主管理员又是发现服务后台,所以--advertise和consul的ip都是192.168.2.56。配置节点(操作对象:node0,node1)# 操作对象:node0(IP:192.168.2.77)docker run -d swarm join --advertise 192.168.2.77:2375 consul://192.168.2.56:8500# 操作对象:node1(IP:192.168.2.129)docker run -d swarm join --advertise 192.168.2.129:2375 consul://192.168.2.56:8500获取主管理员和各节点的信息(操作对象:manager0):docker -H :4000 info使用集群 在集群中运行容器(操作对象:manager0):docker -H :4000 run hello-world通过多次重复上面的操作出现了下面的结果,主管理员在两个节点上创建的容器的数量趋于相等(这里运行的容器是跑的一个core api demo,如果运行的是上面的指令,状态应该是Exited)。主管理员操作节点的容器:# 查看集群节点的容器列表docker -H :4000 ps# 删除容器docker -H :4000 rm -f ContainerID# 启/停容器docker -H :4000 start/stop/restart ContainerID与直接操作的区别就是docker后面加了-H :4000马哥教育历经近10年发展,已成为面向企业级资深运维工程师、架构师的专业集训营式高端就业Linux培训学院。凭借多年良好口碑,其已经成为业内知名互联网公司重要人才战略合作伙伴,获得了百度、腾讯、阿里、大众点评、51CTO、唯品会、京东、中移动、新浪、红帽等互联网巨头的合作支持。毕业学员平均薪资达10K以上,累计受益人员达百万+。? 咨询电话:400-080-6560? 官方站点:? 官方博客:详询咨询QQ:课程顾问-云豆:课程顾问-豌豆:课程顾问-土豆:课程顾问-糖豆:课程顾问-仙豆:微信:magedu-Linux微博:马哥Linux培训长按二维码加关注原文链接:/a/6670
觉得不错,分享给更多人看到
马哥Linux运维 微信二维码
分享这篇文章
8月12日 21:48
马哥Linux运维 最新头条文章
马哥Linux运维 热门头条文章我要上头条:Docker集群管理之Docker Swarm | Alauda
我要上头条:Docker集群管理之Docker Swarm
前言:在和中,我们通过源码分析了解了Docker Machine和Docker Compose的工作原理,本文将带你了解Docker集群管理三剑客的Docker Swarm。本文为灵雀云()活动的投稿。??
在Docker项目的初期,Docker开发团队着力于打造一个稳定的Docker容器运行环境以及构建一套Docker镜像的标准,长久以来只能在单主机运行Docker容器便成为了其最大的局限性。Docker Swarm的出现宣告了Docker对于集群的支持,虽然还处于初级阶段,功能和稳定性与其他集群管理工具也还有不小的差距,但其与Docker的原生集成使其有得天独厚的优势。
Docker Swarm是Docker原生的集群管理工具,它把多个Docker主机抽象成一个单一的虚拟主机。Docker Swarm支持标准的Docker API,所以任何可以与Docker Daemon通信的工具都可以使用Docker Swarm扩展到多个主机。特别值得关注的是对Docker命令行的支持,为使用者提供了从单一Docker主机到Docker集群的无缝切换。
安装Docker Swarm
用户可以通过下载Swarm镜像的方式安装Docker Swarm,这大大简化了使用者编译二进制文件所带来的复杂度。
使用者也可以通过Docker Machine来构建由Swarm管理的Docker集群。Docker集群按角色可分为Master node和Slave node。 Master node负责管理所有slave nodes并根据策略将Docker容器调度到相应的slave node。Slave node为在Swarm master管理下的Docker主机,提供Docker容器的运行环境。Master node同时也可以是Slave node。
通过docker machine构建Swarm master node命令如下 – 我们会在接下来的篇幅里详细讲–swarm-discovery参数
Docker Machine在创建好Docker虚拟主机之后会运行swarm镜像,启动swarm manager容器
同时还会在master node上启动一个worker容器,使本机既是master又是slave
通过Docker Machine创建Slave node命令如下:
至此一个简单的swarm cluster已经装好了,运行eval “$(docker-machine env –swarm swarm-master)”设置docker client运行的环境变量,运行docker info可以看到Docker集群的信息。
运行docker run命令可以看到制定容器运行于Docker集群中的node-00上
Docker Swarm工作原理
Docker Swarm使用cli.go(/codegangsta/cli)作为CLI的框架开发Swarm CLI,目前支持4个子命令:
Create – 向Docker Hub服务发现服务器申请一个全球唯一的token标识此集群
List – 列举当前集群的所有节点
Join – 加入一个集群
Manage – 管理一个集群
Docker Swarm支持多种服务发现机制添加或删除Slave节点,主要可分为静态管理和动态管理两种。
静态管理包括静态文件配置(file://)和静态IP地址列表(nodes://)的方式。静态文件的方式是将每一个节点的IP地址:端口写到一个文件中,并将此配置文件以参数的形式传给swarm manage容器。静态IP地址列表的方式是将每一个节点的IP地址:端口以参数的形式传给swarm manager容器(nodes://&node_ip1:port&,&node_ip2:port&)。
动态Slave节点的添加和删除主要利用了服务发现工具,包括Docker Hub Hosted Discovery(token://), etcd(etcd://), consul(consul://)以及zookeeper(zk://),本文分析了Docker Hub Hosted Discovery以及etcd两种服务发现解决方案。
Docker Hub Hosted Discovery
使用Docker Hub提供的服务发现工具首先需要创建一个唯一的token,swarm提供了create命令向discovery-stage.发送一个POST请求,得到一个全球唯一的token用于表示本集群。
接下来将得到的token值设置为–swarm-discovery token://81fa078f0caeb6c3616c参数传递给docker-machine。
节点上的slave容器会调用swarm join命令加入到一个集群当中。当使用Token作为发现服务的时候,slave node会定期(默认心跳时间为20s)向discovery-stage.发送一个POST请求注册本节点。其中Token值即为通过create从docker hub得到的唯一值, ttl表示经过节点保留的时间(默认为60s,即超过60s没有心跳请求便删除此节点)
Swarm manager容器会定期轮训docker hub获取当前节点列表, 并监控列表变化
使用etcd作为服务发现
使用etcd作为服务发现的时候不需要调用create命令生成token,将etcd的地址作为–swarm-discovery etcd://&etcd address:port&作为参数传递给docker-machine.
节点上的slave容器调用swarm join调用docker libkv中的etcd库定期(心跳间隔默认20s)向指定的etcd服务器注册自己的信息key为/docker/swarm/nodes/&node_ip:port&,同样设置本记录超时时间(默认为60s)。
Swarm manage容器会监控目录/docker/swarm/nodes,当其发生变化时会通过通道传递消息,将变化的节点加入集群或者从集群中删除 。
Docker Swarm通过Join的方式动态的添加节点,通过节点信息在服务发现服务器中的默认超时机制删除出现故障的节点。Docker Swarm的manager容器定期从服务发现服务器获取当前可用的所有节点以供调度容器使用。
Swarm manager
Swarm manager以Docker容器的方式运行于Master node上,其监听在端口3376并开启tls证书认证,只有通过证书认证的客户端才能访问Swarm的API服务器,此行为与Docker Machine一致。
Swarm manager的启动过程如下(swarm docker容器内):
加载证书以供client与server之间做TLS通信使用
初始化容器状态存储仓库 – 以文件的形式记录运行在整个集群的容器信息,通过映射宿主机逻辑卷轴的方式确保数据持久化。
初始化服务发现类(token/kv/file/nodes)
初始化容器调度策略(strategies),目前Swarm支持三种策略,可以通–strategy配置:
spread – 此策略首先排除剩余CPU和内存不够的节点,计算各节点可用CPU和内容资源进行排序,若多个节点可用CPU和内存数相等则将容器调度到当前运行容器数量最少的节点上,此策略旨在平衡各节点的压力
binpack – 此策略首先排除剩余CPU和内存不够的节点,计算各节点可用CPU和内容资源进行排序,若多个节点可用CPU和内存数相等则将容器调度到当前运行容器数量最多的节点上,此策略旨在充分利用所有资源,将资源预留给未来可能需求更大资源用量的容器
random – 随机分配到一个节点
初始化容器调度过滤器(filter),目前支持的过滤器主要包括以下几种:
限制过滤器(constraint):限制过滤器是一个定义每个节点的key/value对,也可以认为是节点的标记。当创建容器的时候(docker run –lable xxx=xxx或docker run –e constraint:xxx=xxx),你可以选择一些符合要求的节点子集部署容器。主要用例如将容器运行在支持指定硬件的节点上(storage=ssd),指定的区域(zone=china)或逻辑集群分组(env=production)
关联过滤器(affinity):将容器运行在有关联关系的节点上。关联关系包括:关联容器(-e affinity:container==&container name&),将容器运行于有关联容器运行的节点;镜像关联(-e affinity:image==&image name&,将容器运行于存在某镜像的节点;标记关联(-e affinity:lable==&lable name&),将容器运于存在此标记的容器节点。
端口过滤器(port):将容器运行于此端口可用的节点,避免端口冲突导致的容器运行失败
依赖过滤器(dependency):将容器运行于依赖的容器运行的节点。此依赖关系包括–link, –volume-from以及—net
健康过滤器(Health):避免容器运行于不健康的节点上
初始化集群类Cluster – 目前支持Swarm Cluster以及Mesos Cluster,本文分析的是Swarm Cluster。在此初始化过程中会并行执行对服务发现系统中节点列表的监控。当有新节点添加时Swarm manager会连接到新节点的Docker Daemon获取当前节点的信息,如CPU,内存等(如下,红色的为转换成当前引擎类engine成员变量),同时还会获取节点Docker的版本,并监控节点Docker引擎状态变化。当需要删除节点的时候,断掉到节点Docker daemon的链接,停止接收Docker引擎状态变化事件。
"ID":"P5YI:5HCG:TC42:VL2U:N3CG:GJX7:IZLQ:G5XN:BV2C:AXJ7:JFST:A5DF",
"Containers":2,
"Images":14,
"Driver":"aufs",
"DriverStatus":[
"Root Dir",
"/mnt/sda1/var/lib/docker/aufs"
"Backing Filesystem",
"Dirperm1 Supported",
"MemoryLimit":true,
"SwapLimit":true,
"CpuCfsPeriod":true,
"CpuCfsQuota":true,
"IPv4Forwarding":true,
"Debug":true,
"OomKillDisable":true,
"NGoroutines":38,
"SystemTime":"T03:11:05.Z",
"ExecutionDriver":"native-0.2",
"LoggingDriver":"json-file",
"NEventsListener":1,
"KernelVersion":"4.0.7-boot2docker",
"OperatingSystem":"Boot2Docker 1.7.1 (TCL 6.3); master : c202798 - Wed Jul 15 00:16:02 UTC 2015",
"IndexServerAddress":"https://index.docker.io/v1/",
"RegistryConfig":{
"InsecureRegistryCIDRs":[
"127.0.0.0/8"
"IndexConfigs":{
"docker.io":{
"Name":"docker.io",
"Mirrors":null,
"Secure":true,
"Official":true
"InitSha1":"",
"InitPath":"/usr/local/bin/docker",
"MemTotal":,
"DockerRootDir":"/mnt/sda1/var/lib/docker",
"HttpProxy":"",
"HttpsProxy":"",
"NoProxy":"",
"Name":"swarm-node-00",
"Labels":[
"provider=virtualbox"
"ExperimentalBuild":false
7.若当前是单master节点模式,则注册API处理函数,此API服务器主要处理来自Docker客户端或其他工具的Docker标准API请求。若当前是多master节点确保高可用性的部署方式,则进行领导者选举,当选的节点注册API处理函数,备份的节点注册备份API处理函数,此处区别是若请求发送到备份节点则转发给领导者的master节点。
至此,Swarm manager便启动成功,其动态添加可用节点删除不可用节点,监听来自Docker Client或其他工具的API请求转发给相应的节点进行容器操作。
接下来我们看一下Swarm manager的API server。API Server监听3376端口,处理标准的Docker API,支持Docker Client及其他工具启动管理Docker容器。下面看两个简单的例子 :
docker build – 发送POST /build请求到Swarm API server
初始化Build参数,如Dockerfile,tag等
根据过滤器以及调度策略选择一个节点
将POST /build请求转发给选取节点的Docker Daemon
将返回值转发给Docker Client
刷新选取节点的镜像列表
至此,docker build命令就已完成。
docker run – 发送POST /containers/create请求到Swarm API server,创建成功得到container UUID后发送POST /containers/&uuid&/start请求启动容器。
若含有–name参数则确保name在整个cluster唯一,否则返回启动失败
创建一个Swarm集群唯一标识,设置在容器标签(label)中
根据过滤器以及调度策略选择一个节点
在选定的节点创建Docker容器,若镜像不存在在下载镜像
若在选择的节点因为找不到镜像而创建失败则加入镜像关联(image==~)再次选择节点
若创建成功则将新创建的容器添加到状态存储仓库
返回创建成功,docker client会发送start请求启动容器
API server找到创建此容器的节点,发送start API到节点的Docker Daemon完成容器启动
通过这两个例子,我们发现Swarm api server其实是一个代理,它通过自己的调度规则(调度策略以及调度过滤器)选择合适的节点,将Docker API请求转发给相应节点的Docker Daemon,将返回值做简单处理之后返回给Docker Client实现对Docker容器的启动,停止,删除以及对镜像的管理。
Swarm高可用
在整个Swarm集群中,Swarm manager负责整个集群并管理多个节点的资源调度。如果Swarm manager出现故障,则整个集群都会出现服务中断的现象。Swarm支持master节点的高可用,当master节点出现故障时,可以将服务切换到另一个备用replica节点上,实现服务的高可用。
实现Swarm master的高可用,你需要自己搭建一套服务发现系统,如etcd,consul或zookeeper。目前docker-machine还不支持创建swarm replica服务器,你需要手动启动swarm容器。
本文的测试环境包括一台swarm-master(由docker-machine创建,没有replica支持),一台swarm-replica(由docker-machine创建的slave node,手动启动manage容器支持replica)和一台swarm-node-00(slave node)
从log中我们可以看到当前这台机器经过选举成为集群主master(原master未支持replica,所以新创建的swarm-replica在选举中得选)。
接下来我们进入到swarm-master中,停止原manager容器,手动启动支持replica的manager容器
从log中我们可以看到当前这台机器在选举中并未当选,成为备用master。
通过curl命令看一下etcd中键值/docker/swarm/leader也表明了192.168.99.104(swarm-replica为leader)
[root@registry swarm]# curl -k -X GET http://10.236.14.20:4001/v2/keys/docker/swarm/leader
{“action”:”get”,”node”:{“key”:”/docker/swarm/leader”,”value”:&#.99.104:;,”expiration”:&#-19T07:24:16.Z”,”ttl”:19,”modifiedIndex&#,”createdIndex&#}}
得到leadership的master主机会定期重置ttl占有leadship,备用主机监控此键值变化并定期参与竞选,若当选主机服务中断,键值超时则备用主机被选中作为新的leader实现服务的高可用性。
到此为止,一套高可用的Docker Swarm集群的工作原理就分析完成了。从Swarm的Roadmap中可以看到接下来Swarm会继续优化其调度系统,支持包括容器重新调度(应对Slave节点服务中断,将运行在其上的容器调度到其他可用的节点上)以及全局部署(即在每个节点上部署选定容器,此应用场景包括在每个节点部署监控容器,log收集容器等)。Swarm还会在多个备选master节点中共享状态信息,目前每台master节点保存的容器信息相对独立,在master切换的时候会出现状态不匹配的问题。目前Swarm API与Docker API的匹配度是75%,在接下来会尽量做到最大程度的匹配。Swarm会借鉴Docker libnetwork项目支持多主机间容器网络连通。Swarm还会与其他容器管理工具如Mesos以及Kubernetes集成去管理更大的集群。
Docker Swarm作为Docker在容器集群化道路上的尝试已经初步取得的成果,但其目前还处于初级阶段,不建议用于生产环境。随着Swarm 项目的完善,在集群中部署Docker容器将会变得越来越简单,使用者可以像在单一主机上运行Docker使用同样的命令集,为Docker容器从单机化到集群化提供无缝迁移,真正解决了环境部署问题。
作者简介:杜航,资深用户,Websense云基础架构组开发经理,专注于Openstack和Docker。
转载请注明。Docker1.12以后的swarmkit
Docker 1.12 在 2016 年 7 月 28 日正式 GA,除了大量的在使用上的改进和 bug 修复外,最引人瞩目的是Docker原生支持了 Swarm 模式,而不是将Swarm作为一个容器对集群进行管理。而docker1.12的操作命令并不向下兼容,于是过去所有创建swarm集群的文档都不能参考了。
4.1 几个概念
4.1.1 节点类型
docker-swarm 把节点分为manager和worker,顾名思义,manager是管理节点,worker是工作节点。
4.1.2 service
区别于旧的swarm管理容器,新的docker-swarm抽象了一个service的概念,有点类似于kubernates的pod,它是管理的最小单元。
一个service是一个以上的容器的集合。
4.2 搭建swarm环境
仍然使用前面的节点服务来测试,第1、2节的工作还是需要有效的。
4.2.1 在node-1节点创建swarm环境
$ docker swarm init
Swarm initialized: current node (9vpgoqj65y3kqo52jj3y6gcnj) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
192.168.33.201:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.12345678910
他是使用Raft来管理节点的。事实上,如果你只有一个外网地址(即除了lo和docker网络等虚拟网络之外没有其他网络接口),可以直接执行:docker
swarm init
4.2.2 将node-2节点加入到创建的swarm cluster
在node-2 执行:
$ docker swarm join \
192.168.33.201:2377
This node joined a swarm as a worker.1234
4.2.3 在更多节点加入swarm cluster
token没有记录下来?没关系,在node-1执行如下命令查看完整的命令提示:
$ docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join \
192.168.33.201:2377123456
如果要加入的是manager节点,则如下查看:
$ docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join \
192.168.33.201:2377123456
4.3 集群管理
4.3.1 查看集群节点
在manager节点:
$ docker node list
AVAILABILITY
MANAGER STATUS
9vpgoqj65y3kqo52jj3y6gcnj *
dc5t7rc04a69rzuahky6qh53x
e4k1fjd93ukncipzy9cer0lcg
Active12345
可以看到,一共有三个节点,node-1自身已经是一个worker了,他的MANAGER是Leader。
该命令只有在manager节点才有权限使用,如果你想在node-3上使用,则需要让node-3成为manager。。
一种方法是让node-3先从cluster重新以manager身份加入cluster。
$ docker swarm leave
Node left the swarm.12
注意:有时自己退出重新加入,反复操作,会让manager混乱,导致一些问题。如,test3已经leave,但manager看到它还是Reading状态,无法删除掉。docker
node rm test3只能删除down状态的节点, 加上--force不是那么好使。
4.3.2 节点角色转换
接上,将node-3转换为manager最简单的方法是,角色提权:是在manager中把node-3的角色提升为manager:
vagrant@test1:~$ docker node promote test3
Node test3 promoted to a manager in the swarm.
vagrant@test1:~$ docker node ls
AVAILABILITY
MANAGER STATUS
5awz4cd6auchp0knq0iljfudh
a02rv4zuex14p03erer1h6zkz *
cq9q1su8ipkp9w80sabv16mmz
Reachable1234567
与之相反的就是降权:
一种方法是在manager中把node-3的角色提升为manager:
vagrant@test1:~$ docker node ls
AVAILABILITY
MANAGER STATUS
5awz4cd6auchp0knq0iljfudh
a02rv4zuex14p03erer1h6zkz *
cq9q1su8ipkp9w80sabv16mmz
Active12345
从安全性考虑,一个集群应该指定多个manager。但需要注意的是,如果一个manager宕机,那么另一个manager需要接管服务,需要至少有三个以上存活的节点。
4.3.3 删除节点
[node_id]1
如果节点状态是Down,可以直接删除,否则可以增加--force开关强制删除。
4.3.4 manager容灾测试
再增加一个node-4,并将node-3提权为manager。
vagrant@test1:~$ docker node ls
AVAILABILITY
MANAGER STATUS
2n3x7y0oaez6pdoxq91r5lng9
77pnoup6clbxgwfd58dp9reu4
84n1fg849v49i2ezobmps5vwg *
8v5r3wb9sujlluqda6jv981ut
Reachable123456
关闭node-1,在node-3检查节点:
vagrant@test3:~$ docker node ls
AVAILABILITY
MANAGER STATUS
2n3x7y0oaez6pdoxq91r5lng9
77pnoup6clbxgwfd58dp9reu4
84n1fg849v49i2ezobmps5vwg
Unreachable
8v5r3wb9sujlluqda6jv981ut *
Leader123456
此时test3接管Leader了。
启动node-1,检查节点:
vagrant@test1:~$ docker node ls
AVAILABILITY
MANAGER STATUS
2n3x7y0oaez6pdoxq91r5lng9
77pnoup6clbxgwfd58dp9reu4
84n1fg849v49i2ezobmps5vwg *
8v5r3wb9sujlluqda6jv981ut
Leader123456
node-1已经变成了Reachable。
4.4 使用入门
4.4.1 创建service
折腾了半天,办点正事吧。
vagrant@test1:~$ docker service create --name web1 nginx
bojkn65bzwpv2az82y3p7qssv
vagrant@test1:~$ docker ps -a
CONTAINER ID
vagrant@test1:~$ docker service ls
bojkn65bzwpv
vagrant@test1:~$ docker service ls
bojkn65bzwpv
nginx1234567891011
REPLICAS 表示一共指定了1个副本,开始启动了0个,启动完成后,变成1/1。
4.4.2 查看服务中的容器
vagrant@test1:~$ docker service ps web1
DESIRED STATE
CURRENT STATE
3tu8qr42a74tzudu8xta46u9h
Running 3 minutes ago123
4.4.3 调整容器副本
我们可以把web1服务中的容器多启动几个副本,如6个:
vagrant@test1:~$ docker service scale web1=6
web1 scaled to 6
vagrant@test1:~$ docker service ps web1
DESIRED STATE
CURRENT STATE
3tu8qr42a74tzudu8xta46u9h
Running 4 minutes ago
chy2qbqz3pbboyxxz90gb9vxb
Preparing 12 seconds ago
2ae4vz4lx8zcpacjepdzcxx5y
Preparing 13 seconds ago
dfg1pul4brwa8xqutls2dddm1
Preparing 13 seconds ago
2o39qlezex2ddk8ie0bzs9drv
Preparing 13 seconds ago
bsduc9qvegikjs8fj94k4ogi8
Running 6 seconds ago
vagrant@test1:~$ docker service ls
bojkn65bzwpv
nginx12345678910111213
其中的2/6以及前面看到的列表信息状态可以看出,我们指定了6个副本,目前web1.1和web1.6已经启动完成,其他还在Preparing。
6个副本中分别在test1启动了1个、test2启动了2个、test3启动了1个、test4启动了2个。
过一会再刷新:
vagrant@test1:~$ docker service ps web1
DESIRED STATE
CURRENT STATE
3tu8qr42a74tzudu8xta46u9h
Running 7 minutes ago
chy2qbqz3pbboyxxz90gb9vxb
Preparing 3 minutes ago
2ae4vz4lx8zcpacjepdzcxx5y
Preparing 3 minutes ago
dfg1pul4brwa8xqutls2dddm1
Running 9 seconds ago
2o39qlezex2ddk8ie0bzs9drv
Running 9 seconds ago
bsduc9qvegikjs8fj94k4ogi8
Running 3 minutes ago
vagrant@test1:~$ docker service ls
bojkn65bzwpv
nginx1234567891011
最终会完全启动。
vagrant@test1:~$ docker service ls
bojkn65bzwpv
处理scale子命令,还可以使用update子命令完成同样的工作:
vagrant@test1:~$ docker service update web1 --replicas=3
vagrant@test1:~$ docker service ls
bojkn65bzwpv
nginx12345
4.5 负载均衡
多个副本容器启动后, swarm集群的service:
公共的端口会暴露在每一个swarm集群中的节点服务器上.
请求公共端口时,会负载均衡到所有的sevice实例上.
负载均衡模式有两种,vip和dnsrr,可以在出啊构建服务时指定:
如果使用vip模式,应该有VirtualIP:
$ docker service inspect --format='{{.Endpoint.VirtualIPs}}' web1
怎么木有?你可能忘记在创建服务时发布端口了。
vagrant@test1:~$ docker service create --name web1 --replicas=6 -p 8888:80 nginx
8qlkxx7v643z7aenfrmfnksxk
vagrant@test1:~$ docker service inspect --format='{{.Endpoint.VirtualIPs}}' web1
[{9h4hrcm7bv1ijdpzpyezy4pld 10.255.0.6/16}]
可以直接访问”“吗?no,它只是为容器间通信的,你可以访问任一台节点的IP:http://192.168.33.201:8888
4.6 启动时指定副本数
vagrant@test1:~$ docker service create --name nginx1 --replicas 2 nginx
czrfg74a9qp8ji
vagrant@test1:~$ docker service ps nginx1
DESIRED STATE
CURRENT STATE
1ghmia00xkxucrisadlwyitv9
Running 5 seconds ago
193mdx2xcja4qv8s9ssakt8w1
Running 6 seconds ago123456
4.7 swarm网络
由于容器在不同的docker主机上,swarm是如何保证网络层的互通呢?swarm是使用overlay网络来解决这个问题的。
vagrant@test1:~$ docker network ls
NETWORK ID
180d624cf798
4d225a25b2b4
docker_gwbridge
9h4hrcm7bv1i
839e8db03b09
local1234567
其中的swarm是缺省创建的overlay网络。
你可以自己创建网络来管理一组服务的互通。
vagrant@test1:~$ docker network create --driver overlay test
17wzxz29pxdf6are8an6u0ep2
vagrant@test1:~$ docker network ls |grep test
17wzxz29pxdf
在指定子网启动服务
vagrant@test1:~$ docker service create --network test --name myservice hello-world
5kz0imiep9fztvsev0c101568
vagrant@test1:~$ docker service ps myservice
DESIRED STATE
CURRENT STATE
6zww5ci2jhnvy05aj68ohb3do
myservice.1
hello-world
Preparing 5 seconds ago12345
通过docker service inspect myservice返回的json中Networks元素可以看到网络信息,Target正是前面创建的test接口的id:
&Networks&: [
&Target&: &17wzxz29pxdf6are8an6u0ep2&
你只要保证你启动的多个服务在同一个网络接口,就可以保证他们之间互相通信。
swarmkit的引入,在docker中引入了三个子命令:
docker swarm——swarm集群搭建
docker service——服务管理
docker node——集群节点管理123
4.8.1 docker swarm 子命令
查看子命令 vagrant@test1:~$ docker swarm –help
初始化swarm集群
将当前节点加入到集群中
join-token
管理加入token
动态更新swarm配置
当前节点主动退出集群(仅限worker节点)12345
4.8.2 docker service 子命令
查看子命令 vagrant@test1:~$ docker service –help
显示服务详情
列出服务中的容器
列出所有服务及简介
调整服务的副本数
动态更新服务配置1234567
4.8.3 docker node 子命令
查看子命令 vagrant@test1:~$ docker node –help
管理节点为指定子节点降权
显示节点详情
列出集群中的节点
管理节点为指定子节点提权
删除一个节点
列出指定子节点中running的容器
动态更新节点配置1234567
4.8 使用帮助
本节实际上只是给出了查看帮助的方法。想了解某个命令的使用,只需要在子命令后面加上--help即可,逐级深入。如想了解docker
node的子命令rm,则是:
vagrant@test1:~$ docker node rm
docker node rm [OPTIONS] NODE [NODE...]
Remove one or more nodes from the swarm
rm, remove
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4836次
排名:千里之外
原创:37篇
(20)(9)(15)}

我要回帖

更多关于 docker swarmkit 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信