Docker Swarm集群实践——部署篇

最新消息

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集群的操作。

时间: 2024-11-18 16:44:44

Docker Swarm集群实践——部署篇的相关文章

同一个Docker swarm集群中部署多版本的测试环境

先介绍下用到的技术 Docker swarm: Docker官方的集群管理工具,相比kubernetes更加简单,容易入门.https://docs.docker.com/engine/swarm/ Traefik: 一个现代化的反向代理工具,原生支持Docker swarm模式,可以实现swarm的动态代理.https://docs.traefik.io/user-guide/swarm-mode/ 下图展示主要的思路: 在Docker swarm中创建某个测试版本service时,通过设置s

Docker Swarm集群中部署Traefik负载均衡器

一.创建单节点的Docker Swarm集群 docker swarm init 二.在Swarm集群中创建一个网络 docker network create --driver=overlay traefik --attachable 三.在Swarm集群中部署traefik负载均衡器服务 docker service create \ --name traefik \ --constraint=node.role==manager \ --publish 80:80 --publish 80

云计算之路-阿里云上:3个manager节点异常造成 docker swarm 集群宕机

今天 11:29 - 11:39 左右,docker swarm 集群 3 个 manager 节点同时出现异常,造成整个集群宕机,由此给您带来很大的麻烦,请您谅解. 受此次故障影响的站点有:博问,闪存,班级,园子,短信息,招聘,小组,网摘,新闻,openapi 最近我们刚刚确认我们所有遇到的 docker swarm 不稳定问题都与部分节点的异常状况有关,即使是一直让我们非常头疼的 docker-flow-proxy 路由问题,也是因为路由容器所在的节点出现异常状况,只要通过阿里云控制台重启这

【故障公告】10:30-10:45 左右 docker swarm 集群节点问题引发故障

非常抱歉,今天 10:30-10:45 左右由于 docker swarm 集群节点出现问题,造成除博客之外的站点出现访问异常,由此给您带来很大的麻烦,请您谅解. 故障开始时出现有时访问正常有时访问出现 502 或 500 ,当时我们就判断是某个节点出现问题,但无法直接定位出哪个节点,只能依次将一个个节点下线-上线.但是,不走运的是出现问题的节点恰恰是我们最后下线的一个节点.所以,在下线正常节点的过程中,更多的容器被迁移到了问题节点,结果造成更大范围的故障,直到我们下线问题节点,才恢复正常. 自

docker swarm集群及其UI部署

一.规划 ①swarm01作为manager节点,swarm02和swarm03作为worker节点. # cat /etc/hosts 127.0.0.1   localhost 192.168.139.175  swarm01  192.168.139.176  swarm02  192.168.139.177  swarm03 ②配置SSH免密登陆 # ssh-keygen -t rsa -P '' # ssh-copy-id -i .ssh/id_rsa.pub [email prote

Docker Swarm集群部署应用

在Docker Swarm集群部署应用 我们过去使用docker run的命令创建容器, 把前面替换成docker service create就行了. 建议搭建一个registry,为所的docker主机提供镜像下载,否则你需要在每个docker主机本地存在容器镜像. 所以搭建一个私有仓库,由私有仓库提供所需要的镜像, 本实验环境中用node1同时作为registry. 拉取本地私有仓库registry,查看registry镜像 基础环境 全部为CentOS7系统,Docker 版本为1.12

Docker Swarm集群部署实战

基本概念: Swarm介绍:Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Docker集群,它将一群Docker宿主机变成一个单一的虚拟的主机.Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(dockerclient in Go, docker_py,docker等)均可以直接与Swarm通信.Swarm几乎全部用Go语言来完成开发,Swarm0.2版本增加了一个新的策略来调度集群中的容器,使得在可

docker swarm集群部署

docker swarm 集群构建: swarm 在docker 1.12 版本后内置 #h官方文档tps://docs.docker.com/engine/swarm/#feature-highlights 系统环境: centos7.3 docker17.06 1.初始化manager节点: docker swarm init 为实现高可用,manager节点需要有奇数个,类似zookerper选举制度. 2.复制生成的命令,在node节点运行. #docker swarm join-tok

通过docker-machine和etcd部署docker swarm集群

本片文章介绍一下 使用docker-machine 搭建docker swarm 集群:docker swarm是docker 官方搭建的容器集群编排工具:容器编排,就是可以使你像使用一太机器一样来使用一个集群,你运行的容器可能会在容器中的任何一个节点上运行: 首先盗一张 docker swarm的架构图: 图片来源 https://yeasy.gitbooks.io/docker_practice/content/swarm/intro.html 在使用 Swarm 管理docker 集群时,