首页 资讯 社群 我的社区 搜索

Docker Swarm集群实践——部署篇

chinagissoft
2018-10-01 08:55:53

最新消息

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

  1. root@controller:~# docker run --rm swarm create
  2. 88b70a0603a97f3e51be1d83f471a1df

该token是其他机器加入集群的凭证,需要记录。


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

  1. root@controller:~# docker run -d swarm join -addr=192.168.12.132:2375 token://88b70a0603a97f3e51be1d83f471a1df
  2. 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集群管理请求。

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

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

查看一下当前的Swarm参与集群的机器列表

  1. root@controller:~# docker run --rm swarm list token://88b70a0603a97f3e51be1d83f471a1df
  2. 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机器执行

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


在132机器查看节点列表

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


在134机器执行

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


在132机器查看节点列表

  1. root@controller:~# docker run --rm swarm list token://88b70a0603a97f3e51be1d83f471a1df
  2. 192.168.12.134:2375
  3. 192.168.12.133:2375
  4. 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文件,也就解决该问题了。


重新执行该命令

  1. root@controller:~# docker -H 192.168.12.132:2376 info
  2. Containers: 23
  3. Running: 6
  4. Paused: 0
  5. Stopped: 17
  6. Images: 23
  7. Server Version: swarm/1.2.3
  8. Role: primary
  9. Strategy: spread
  10. Filters: health, port, containerslots, dependency, affinity, constraint
  11. Nodes: 3
  12. controller: 192.168.12.132:2375
  13. └ ID: CTCC:NH3C:3LID:NMV6:IPEZ:BEXX:GQEH:74GY:RMS6:4MCW:NWOT:MG5Q
  14. └ Status: Healthy
  15. └ Containers: 12
  16. └ Reserved CPUs: 0 / 2
  17. └ Reserved Memory: 1 GiB / 2.046 GiB
  18. └ Labels: executiondriver=, kernelversion=3.13.0-92-generic, operatingsystem=Ubuntu 14.04 LTS, storagedriver=aufs
  19. └ UpdatedAt: 2016-07-10T07:34:54Z
  20. └ ServerVersion: 1.11.2
  21. docker1: 192.168.12.133:2375
  22. └ ID: MBI4:BY3Z:FOJN:XDLB:6I24:JYKJ:QQKY:MWBS:ZTRI:ATM6:QTDO:7XRR
  23. └ Status: Healthy
  24. └ Containers: 6
  25. └ Reserved CPUs: 0 / 1
  26. └ Reserved Memory: 0 B / 1.012 GiB
  27. └ Labels: executiondriver=, kernelversion=3.13.0-24-generic, operatingsystem=Ubuntu 14.04 LTS, storagedriver=aufs
  28. └ UpdatedAt: 2016-07-10T07:34:31Z
  29. └ ServerVersion: 1.11.2
  30. docker2: 192.168.12.134:2375
  31. └ ID: ZU2Y:GUAK:CMAK:NDMG:HKII:JY3R:7FLM:VM74:5FNJ:X6ON:ZDKM:LQI7
  32. └ Status: Healthy
  33. └ Containers: 5
  34. └ Reserved CPUs: 0 / 2
  35. └ Reserved Memory: 0 B / 2.045 GiB
  36. └ Labels: executiondriver=, kernelversion=3.13.0-24-generic, operatingsystem=Ubuntu 14.04 LTS, storagedriver=aufs
  37. └ UpdatedAt: 2016-07-10T07:34:31Z
  38. └ ServerVersion: 1.11.2
  39. Plugins:
  40. Volume:
  41. Network:
  42. Kernel Version: 3.13.0-92-generic
  43. Operating System: linux
  44. Architecture: amd64
  45. CPUs: 5
  46. Total Memory: 5.103 GiB
  47. Name: c8714a5864d1
  48. Docker Root Dir:
  49. Debug mode (client): false
  50. Debug mode (server): false
  51. 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机器上了。

  1. root@controller:~# docker ps -a
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 3d73f706d1ba 322cacd8b1ca "/bin/sh -c /opt/run." 15 minutes ago Up 14 minutes 0.0.0.0:51237->809 0/tcp sm_iserver-51237
  4. c38dd3d3e671 322cacd8b1ca "/bin/sh -c /opt/run." 16 minutes ago Up 16 minutes 0.0.0.0:53796->809 0/tcp sm_iserver-53796
  5. c8714a5864d1 swarm "/swarm manage token:" 55 minutes ago Up 55 minutes 0.0.0.0:2376->2375 /tcp sick_lichterman
  6. f099c42cc02f swarm "/swarm join -addr=19" 55 minutes ago Up 55 minutes 2375/tcp evil_lovelace
  7. 201248c1e82a swarm "/swarm manage token:" 21 hours ago Exited (2) 20 hours ago hopeful_albattani
  8. cdac07b03439 swarm "/swarm join -addr=19" 21 hours ago Exited (2) 20 hours ago focused_kirch
  9. e8295720300b swarm "/swarm manage token:" 39 hours ago Exited (2) 38 hours ago adoring_mayer
  10. 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
  11. 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
  12. d3c0d9431c28 zabbix/zabbix-db-mariadb "/run.sh" 41 hours ago Up 39 minutes 0.0.0.0:3306->3306 /tcp root_zabbix-db_1
  13. 012b3744d455 swarm "/swarm join -addr=19" 42 hours ago Exited (2) 38 hours ago condescending_dijkstra
  14. 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

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


我们在docker2机器上看到已经创建的实例

  1. root@docker2:~# docker ps -a
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 850f4f774623 ubuntu:14.04 "/bin/bash" 2 minutes ago Up 2 minutes ubuntu
  4. ed47f31a032f swarm "/swarm join -addr=19" 57 minutes ago Up 57 minutes 2375/tcp jolly_golick
  5. 982c4c9a615b swarm "/swarm join -addr=19" About an hour ago Exited (2) About an hour ago jolly_mcclintock
  6. 3095e60cb60f swarm "/swarm join -addr=19" 20 hours ago Exited (2) 20 hours ago adoring_cray
  7. 56b828a44daa swarm "/swarm join -addr=19" 21 hours ago Exited (2) 20 hours ago high_meitner
  8. c2cf9a779a3b swarm "/swarm join -addr=19" 31 hours ago Exited (2) 28 hours ago modest_newton


我们继续创建同样的实例ubuntu1

  1. root@controller:~# docker -H 192.168.12.132:2376 run -id --name ubuntu1 ubuntu:14.04
  2. e791527c382c454b99f70aeb732b154c500f5586eff2ba124f472e26ec8e3a69


我们看到ubuntu1已经创建到了docker1机器上了

  1. root@docker1:~# docker ps -a
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. e791527c382c ubuntu:14.04 "/bin/bash" 20 seconds ago Up 19 seconds ubuntu1
  4. 8f186a1bc3f4 swarm "/swarm join -addr=19" 57 minutes ago Up 57 minutes 2375/tcp kickass_archimedes
  5. e636fb8a6084 swarm "/swarm join -addr=19" 21 hours ago Exited (2) 20 hours ago clever_raman
  6. 1a5e6b6eb667 swarm "/swarm join -addr=19" 23 hours ago Exited (2) 23 hours ago goofy_varahamihira
  7. e6244ba8f845 swarm "/swarm join -addr=19" 42 hours ago Exited (2) 39 hours ago suspicious_sinoussi
  8. 07438a67cc7a swarm "/swarm join -addr=19" 42 hours ago Exited (2) 39 hours ago admiring_leavitt


如果我们继续创建ubuntu实例,会报已经有同名的错误

  1. root@controller:~# docker -H 192.168.12.132:2376 run -id --name ubuntu ubuntu:14.04
  2. 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..
  3. See 'docker run --help'.


但是这个错误应该跟调度有关系,同一集群同一个节点内不应该有同样的实例名,但是同一集群不同的节点应该可以有同样的实例名,接下来我们就看看关于Swarm集群的调度以及过滤机制


接下来我们就针对Docker Swarm的集群进行操作,包括SuperMap iCloudManager在Swarm集群的操作。



用户评论