最新消息
Docker在上周的DockerCon技术大会上发布了1.12版核心产品Docker Engine,最大的新特性是Docker Swarm已经被整合到了Docker Engine里面而不再是一个单独的工具了,这样就可以更容易的把多个Docker主机组合成一整个规模更大可靠性更高的逻辑单元。Docker的掌舵者 Adrian Mouat相信这种新的集群模式可以大大增强Docker在相关领域的竞争力。
把Docker Swarm整合进Docker Engine是一个重大改进,但它也只是一个附加功能,你可以只在需要的时候才使用它。你可以用和以前一样的方式来安装、运行和升级Docker 1.12,而且它也对已有的容器镜像和工具向后兼容。
以上是关于Swarm的最新发展,你可以深切的感受到开源力量对一个技术的快速迭代,相比较一个公司使用激励机制提高员工的积极性,开源的思想让那些有共同理想的技术天才共同协作,为科技的发展提供动力。一点感慨而已!
当然,我们先了解一下现在Swarm的状况,对学习未来的Swarm还是很有帮助的。
Swarm 简介
Swarm是Docker公司在2014年12月初新发布的容器管理工具。和Swarm一起发布的Docker管理工具还有Machine以及Compose。Swarm是一套较为简单的工具,用以管理Docker集群,使得Docker集群暴露给用户时相当于一个虚拟的整体。Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client均可以直接与Swarm通信
Swarm架构
Swarm作为一个管理Docker集群的工具,首先需要将其部署起来,可以单独将Swarm部署于一个节点。另外,自然需要一个Docker集群,集群上每一个节点均安装有Docker。具体的Swarm架构图可以参照下图:
Swarm架构中最主要的处理部分自然是Swarm节点,Swarm管理的对象自然是Docker Cluster,Docker Cluster由多个Docker Node组成,而负责给Swarm发送请求的是Docker Client。
Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受docker客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行之后,它会收集重建集群信息。
Swarm集群部署
部署架构如下
我们有三台服务器,132机器作为Swarm Server服务器,其他服务器作为Docker集群的子节点。
1、132机器上下载Swarm镜像
docker pull swarm
2、在使用Swarm进行集群管理之前,需要先把准备加入集群的所有的节点的docker deamon的监听端口修改为0.0.0.0:2375,修改所有参与Swarm集群的服务器的/etc/default/docker,映射容器端口号.
DOCKER_OPTS="-H 0.0.0.0:2375 -H unix:///var/run/docker.sock"
重启docker 服务
3、在132机器上申请Swarm的token
[email protected]:~# docker run --rm swarm create 88b70a0603a97f3e51be1d83f471a1df
该token是其他机器加入集群的凭证,需要记录。
原则上Swarm Server132机器是无需运行容器的,当然,我们为了保证集群数量尽可能多,将132机器也加入进来
[email protected]:~# docker run -d swarm join -addr=192.168.12.132:2375 token://88b70a0603a97f3e51be1d83f471a1df 012b3744d4554e7db148b3fb35827e18fec9d12029e7e276707b2eb244dbb47b
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。
4、启动Swarm Manager
Swarm中swarm manage是最为重要的管理命令。一旦swarm manage命令在Swarm节点上被触发,则说明用户需要swarm开始管理Docker集群。从运行流程的角度来讲,swarm经历的阶段主要有两点:启动swarm、接收并处理Docker集群管理请求。
[email protected]:~# docker run -p 2376:2375 -d swarm manage token://88b70a0603a97f3e51be1d83f471a1df 62ad831e134a1f2c61385fae4684396b0375deef07c9137cbb80543193ea2e4a
注意的是:在这条命令中,第一:要以daemon的形式运行swarm;第二:端口映射:2376可以更换成任何一个本机没有占用的端口,一定不能是2375,否则就会出问题。
查看一下当前的Swarm参与集群的机器列表
[email protected]:~# docker run --rm swarm list token://88b70a0603a97f3e51be1d83f471a1df 192.168.12.132:2375
可见当前只有132机器加入进来了。
Swarm中的swarm list命令用以列举Docker集群中的Docker Node。Docker Node的信息均来源于Swarm节点上注册的Docker Node。而一个Docker Node在Swarm节点上注册,仅仅是注册了Docker Node的IP地址以及Docker监听的端口号。
5、同理,我们将133,134机器添加进来
在133机器执行
[email protected]:~# docker run -d swarm join -addr=192.168.12.133:2375 token://88b70a0603a97f3e51be1d83f471a1df e6244ba8f845d87bd9398f9e2d98a0757050bbd8fe1b4d39a827dec84c0bc541
在132机器查看节点列表
[email protected]:~# docker run --rm swarm list token://88b70a0603a97f3e51be1d83f471a1df 192.168.12.133:2375 192.168.12.132:2375
在134机器执行
[email protected]:~# docker run -d swarm join -addr=192.168.12.134:2375 token://88b70a0603a97f3e51be1d83f471a1df c2cf9a779a3b4566f5c199c9b1174a57e87cf800a5b4c37f0545b3af9c993478
在132机器查看节点列表
[email protected]:~# docker run --rm swarm list token://88b70a0603a97f3e51be1d83f471a1df 192.168.12.134:2375 192.168.12.133:2375 192.168.12.132:2375
查看完节点列表,我们也看到了相关docker服务器已经加入到了集群中,但是我们需要查询一下集群的节点信息
执行docker -H 192.168.12.132:2376 info
我们从中发现一个问题,所含的三个集群子节点只有一个状态是Healthy,其他都是pending状态,我们也看到Error 信息:Error: ID duplicated.
这是因为,我在本机的虚拟机来实践,我的所有机器都是通过同一个机器进行复制,所以导致ID都是一样,因此报错,在生产环境应该不会出现该问题。当然,这个问题也可以解决,我们只需要将/etc/docker.key.json文件直接删除掉,然后重启一下,系统会新生成一个随机的key.json文件,也就解决该问题了。
重新执行该命令
[email protected]:~# docker -H 192.168.12.132:2376 info Containers: 23 Running: 6 Paused: 0 Stopped: 17 Images: 23 Server Version: swarm/1.2.3 Role: primary Strategy: spread Filters: health, port, containerslots, dependency, affinity, constraint Nodes: 3 controller: 192.168.12.132:2375 └ ID: CTCC:NH3C:3LID:NMV6:IPEZ:BEXX:GQEH:74GY:RMS6:4MCW:NWOT:MG5Q └ Status: Healthy └ Containers: 12 └ Reserved CPUs: 0 / 2 └ Reserved Memory: 1 GiB / 2.046 GiB └ Labels: executiondriver=, kernelversion=3.13.0-92-generic, operatingsystem=Ubuntu 14.04 LTS, storagedriver=aufs └ UpdatedAt: 2016-07-10T07:34:54Z └ ServerVersion: 1.11.2 docker1: 192.168.12.133:2375 └ ID: MBI4:BY3Z:FOJN:XDLB:6I24:JYKJ:QQKY:MWBS:ZTRI:ATM6:QTDO:7XRR └ Status: Healthy └ Containers: 6 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 1.012 GiB └ Labels: executiondriver=, kernelversion=3.13.0-24-generic, operatingsystem=Ubuntu 14.04 LTS, storagedriver=aufs └ UpdatedAt: 2016-07-10T07:34:31Z └ ServerVersion: 1.11.2 docker2: 192.168.12.134:2375 └ ID: ZU2Y:GUAK:CMAK:NDMG:HKII:JY3R:7FLM:VM74:5FNJ:X6ON:ZDKM:LQI7 └ Status: Healthy └ Containers: 5 └ Reserved CPUs: 0 / 2 └ Reserved Memory: 0 B / 2.045 GiB └ Labels: executiondriver=, kernelversion=3.13.0-24-generic, operatingsystem=Ubuntu 14.04 LTS, storagedriver=aufs └ UpdatedAt: 2016-07-10T07:34:31Z └ ServerVersion: 1.11.2 Plugins: Volume: Network: Kernel Version: 3.13.0-92-generic Operating System: linux Architecture: amd64 CPUs: 5 Total Memory: 5.103 GiB Name: c8714a5864d1 Docker Root Dir: Debug mode (client): false Debug mode (server): false WARNING: No kernel memory limit support
至此,Swarm集群部署完毕!
还记得上次我们在介绍SuperMap iCloudManager 8C 新特性,已经支持Docker了,当时只是在Docker单机进行的操作。
SuperMap iCloudManager 8C Sp2新特性——拥抱Docker容器支持
http://blog.csdn.net/chinagissoft/article/details/51545904
现如今,我们已经搭建了Swarm集群,我们就在集群环境下试用一下iCloudManager。
根据上述描述我们可以看到,三台Docker集群总共的计算资源(2CPU+2G RAM,1CPU+1G RAM,2CPU+2G RAM),总共5CPU+5G RAM.
首先,我们在配置初始化的时候,需要输入Swarm Manager的IP和端口号(2376)而不是2375,因为2375代表132机器的信息,2376代表集群的整体信息。
同时,我们可以可以在首页看到整体的资源信息
我们创建个新的iServer实例后可以看到,已经创建在132机器上了。
[email protected]:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3d73f706d1ba 322cacd8b1ca "/bin/sh -c /opt/run." 15 minutes ago Up 14 minutes 0.0.0.0:51237->809 0/tcp sm_iserver-51237 c38dd3d3e671 322cacd8b1ca "/bin/sh -c /opt/run." 16 minutes ago Up 16 minutes 0.0.0.0:53796->809 0/tcp sm_iserver-53796 c8714a5864d1 swarm "/swarm manage token:" 55 minutes ago Up 55 minutes 0.0.0.0:2376->2375 /tcp sick_lichterman f099c42cc02f swarm "/swarm join -addr=19" 55 minutes ago Up 55 minutes 2375/tcp evil_lovelace 201248c1e82a swarm "/swarm manage token:" 21 hours ago Exited (2) 20 hours ago hopeful_albattani cdac07b03439 swarm "/swarm join -addr=19" 21 hours ago Exited (2) 20 hours ago focused_kirch e8295720300b swarm "/swarm manage token:" 39 hours ago Exited (2) 38 hours ago adoring_mayer dd6e3154ea6c supermap/icloudmanager:c802 "/bin/sh -c /etc/iclo" 41 hours ago Up 39 minutes 0.0.0.0:8080->8080 /tcp root_icloudmanager_1 6b22dd275262 zabbix/zabbix-3.0:3.0.0 "/config/bootstrap.sh" 41 hours ago Up 39 minutes 0.0.0.0:80->80/tcp , 0.0.0.0:10051->10051/tcp, 162/udp, 10052/tcp root_zabbix-server_1 d3c0d9431c28 zabbix/zabbix-db-mariadb "/run.sh" 41 hours ago Up 39 minutes 0.0.0.0:3306->3306 /tcp root_zabbix-db_1 012b3744d455 swarm "/swarm join -addr=19" 42 hours ago Exited (2) 38 hours ago condescending_dijkstra 47b06d6ef5e1 registry:2.3.0 "/bin/registry /etc/d" 46 hours ago Up 57 minutes 0.0.0.0:5000->5000 /tcp registry
注意:通过Swarm 集群尽量与Docker Registry进行配合使用,也就是iCM的镜像使用仓库里面的镜像,然后通过iCM创建实例的时候,就可以快速pull过来。
接下来我们之间通过命令行来创建容器实例,
执行如下命令:docker -H 192.168.12.132:2376 run -id --name ubuntu ubuntu:14.04
[email protected]:~# docker -H 192.168.12.132:2376 run -id --name ubuntu ubuntu:14.04 850f4f774623f970a96d10232899cf94761ab0770b98699cd32bdddf88fa4c6f
我们在docker2机器上看到已经创建的实例
[email protected]:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 850f4f774623 ubuntu:14.04 "/bin/bash" 2 minutes ago Up 2 minutes ubuntu ed47f31a032f swarm "/swarm join -addr=19" 57 minutes ago Up 57 minutes 2375/tcp jolly_golick 982c4c9a615b swarm "/swarm join -addr=19" About an hour ago Exited (2) About an hour ago jolly_mcclintock 3095e60cb60f swarm "/swarm join -addr=19" 20 hours ago Exited (2) 20 hours ago adoring_cray 56b828a44daa swarm "/swarm join -addr=19" 21 hours ago Exited (2) 20 hours ago high_meitner c2cf9a779a3b swarm "/swarm join -addr=19" 31 hours ago Exited (2) 28 hours ago modest_newton
我们继续创建同样的实例ubuntu1
[email protected]:~# docker -H 192.168.12.132:2376 run -id --name ubuntu1 ubuntu:14.04 e791527c382c454b99f70aeb732b154c500f5586eff2ba124f472e26ec8e3a69
我们看到ubuntu1已经创建到了docker1机器上了
[email protected]:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e791527c382c ubuntu:14.04 "/bin/bash" 20 seconds ago Up 19 seconds ubuntu1 8f186a1bc3f4 swarm "/swarm join -addr=19" 57 minutes ago Up 57 minutes 2375/tcp kickass_archimedes e636fb8a6084 swarm "/swarm join -addr=19" 21 hours ago Exited (2) 20 hours ago clever_raman 1a5e6b6eb667 swarm "/swarm join -addr=19" 23 hours ago Exited (2) 23 hours ago goofy_varahamihira e6244ba8f845 swarm "/swarm join -addr=19" 42 hours ago Exited (2) 39 hours ago suspicious_sinoussi 07438a67cc7a swarm "/swarm join -addr=19" 42 hours ago Exited (2) 39 hours ago admiring_leavitt
如果我们继续创建ubuntu实例,会报已经有同名的错误
[email protected]:~# docker -H 192.168.12.132:2376 run -id --name ubuntu ubuntu:14.04 docker: Error response from daemon: Conflict: The name ubuntu is already assigned. You have to delete (or rename) that container to be able to assign ubuntu to a container again.. See 'docker run --help'.
但是这个错误应该跟调度有关系,同一集群同一个节点内不应该有同样的实例名,但是同一集群不同的节点应该可以有同样的实例名,接下来我们就看看关于Swarm集群的调度以及过滤机制
接下来我们就针对Docker Swarm的集群进行操作,包括SuperMap iCloudManager在Swarm集群的操作。