码迷,mamicode.com
首页 > 其他好文 > 详细

Docker Swarm集群实践——部署篇

时间:2016-07-13 10:33:11      阅读:500      评论:0      收藏:0      [点我收藏+]

标签:

最新消息

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

root@controller:~# docker run --rm swarm create
88b70a0603a97f3e51be1d83f471a1df
该token是其他机器加入集群的凭证,需要记录。


原则上Swarm Server132机器是无需运行容器的,当然,我们为了保证集群数量尽可能多,将132机器也加入进来

root@controller:~# 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集群管理请求。

root@controller:~# docker run -p 2376:2375 -d swarm manage token://88b70a0603a97f3e51be1d83f471a1df
62ad831e134a1f2c61385fae4684396b0375deef07c9137cbb80543193ea2e4a

注意的是:在这条命令中,第一:要以daemon的形式运行swarm;第二:端口映射:2376可以更换成任何一个本机没有占用的端口,一定不能是2375,否则就会出问题。

查看一下当前的Swarm参与集群的机器列表
root@controller:~# 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机器执行

root@docker1:~#  docker run -d swarm join -addr=192.168.12.133:2375 token://88b70a0603a97f3e51be1d83f471a1df
e6244ba8f845d87bd9398f9e2d98a0757050bbd8fe1b4d39a827dec84c0bc541

在132机器查看节点列表

root@controller:~# docker run --rm swarm list token://88b70a0603a97f3e51be1d83f471a1df
192.168.12.133:2375
192.168.12.132:2375

在134机器执行

root@docker2:~#  docker run -d swarm join -addr=192.168.12.134:2375 token://88b70a0603a97f3e51be1d83f471a1df
c2cf9a779a3b4566f5c199c9b1174a57e87cf800a5b4c37f0545b3af9c993478

在132机器查看节点列表

root@controller:~# 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文件,也就解决该问题了。


重新执行该命令

root@controller:~# 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机器上了。

root@controller:~# 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

root@controller:~# docker -H 192.168.12.132:2376  run -id --name ubuntu  ubuntu:14.04
850f4f774623f970a96d10232899cf94761ab0770b98699cd32bdddf88fa4c6f


我们在docker2机器上看到已经创建的实例
root@docker2:~# 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
root@controller:~# docker -H 192.168.12.132:2376  run -id --name ubuntu1  ubuntu:14.04
e791527c382c454b99f70aeb732b154c500f5586eff2ba124f472e26ec8e3a69


我们看到ubuntu1已经创建到了docker1机器上了
root@docker1:~# 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实例,会报已经有同名的错误
root@controller:~# 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集群的操作。




Docker Swarm集群实践——部署篇

标签:

原文地址:http://blog.csdn.net/chinagissoft/article/details/51864150

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!