简介

Swarm:docker原生的集群管理工具,将一组docker主机作为一个虚拟的docker主机来管理。

对客户端而言,Swarm集群就像是另一台普通的docker主机。

Swarm集群中的每台主机都运行着一个swarm节点代理,每个代理将该主机上的相关Docker守护进程注册到集群中。和节点代理相对应的是Swarm管理者,用于对集群进行管理。

运行Swarm的所有Docker节点必须运行着同一个版本的Docker。

基于zookeeper的Swarm集群搭建

1. 拉取Swarm镜像

docker pull swarm

2. 创建swarm集群

有多种方式可以创建swarm集群,不同的方式本质是基于不同的集群发现后端(discovery backend)。常见的有如下几种方式:

a. 使用默认的Docker Hub:在Docker Hub注意一个集群,然后返回专属的token

b. 使用etcd:将swarm agent信息注册到etcd

c. 使用静态文件:将所有agent信息写入manager节点上的某个文本文件中(不易扩展)

d. 使用Consul:与etcd类似

e. 使用zookeeper:与etcd类似

f. 用户自定义集群创建方式:实现DiscoveryService接口

下面重点介绍下使用我们最熟悉的zookeeper来搭建swarm集群:

首先需要搭建一套zookeeper集群,关于zookeeper集群的搭建见之前的文章。然后通过zkClient创建一个zk节点/swarm-agent用于后续存储swarm agent的信息。

使用该zookeeper集群创建新的swarm集群:

在一台swarm agent机器上执行如下命令:

docker run --name swarm-agent --net zknetwork -d swarm join --addr=10.120.196.36:2375 zk://zkServer1:2181,zkServer2:2181,zkServer3:2181/swarm-agent

其中addr参数是告诉zookeeper本台swarm agent的docker守护进程服务的ip和host。zk://<zk_addr>/<path>则为zookeeper协调服务的数据节点。

此处,因为我们agent所在机器与部署zookeeper集群的容器属于同一台宿主机,所以直接将该swarm agent的容器挂载到zk网络下,后面zk的地址直接写了容器的名字。实际上,尝试过用zk://10.120.196.36:2181,10.120.196.36:2182,10.120.196.36:2183/swarm-agent的方式来连接zookeeper,从日志中看到无法连接上zookeeper端口。而在下面另一台节点使用该<zk_addr>/<path>的时候,可以连接上。

查看swarm agent容器中的log信息:

root@hadoop985:~# docker logs swarm-agent1  -f
time="2017-10-24T09:35:10Z" level=info msg="Initializing discovery without TLS"
time="2017-10-24T09:35:10Z" level=info msg="Registering on the discovery service every 1m0s..." addr="10.120.196.36:2375" discovery="zk://zkServer1:2181,zkServer2:2181,zkServer3:2181/swarm-agent"
2017/10/24 09:35:10 Connected to 192.168.16.3:2181
2017/10/24 09:35:10 Authenticated: id=170934675179241473, timeout=10000
2017/10/24 09:35:10 Re-submitting `0` credentials after reconnect
time="2017-10-24T09:36:10Z" level=info msg="Registering on the discovery service every 1m0s..." addr="10.120.196.36:2375" discovery="zk://zkServer1:2181,zkServer2:2181,zkServer3:2181/swarm-agent"
......

可以看到,agent节点已经连上了zk集群,且每隔一段时间agent会重新注册到dicovery service(这里写的"every 1m0s"不知道是什么意思,《第一本Docker书》和《Docker容器与容器云》中介绍的都是默认25秒发送一次心跳信息。)

类似的,再在另一台swarm agent机器上执行命令(此处因为是不同的机器,需使用不同的<zk_addr>/<path>):

docker run --name swarm-agent -d swarm join --addr=10.120.196.37:2375 zk://10.120.196.36:2181,10.120.196.36:2182,10.120.196.36:2183/swarm-agent

查看容器的日志确定其连接成功:

root@hadoop986:~/docker# docker logs swarm-agent -f
time="2017-10-24T09:50:03Z" level=info msg="Initializing discovery without TLS"
time="2017-10-24T09:50:03Z" level=info msg="Registering on the discovery service every 1m0s..." addr="10.120.196.37:2375" discovery="zk://10.120.196.36:2181,10.120.196.36:2182,10.120.196.36:2183/swarm-agent"
2017/10/24 09:50:03 Connected to 10.120.196.36:2181
2017/10/24 09:50:03 Authenticated: id=98877081139347460, timeout=10000
2017/10/24 09:50:03 Re-submitting `0` credentials after reconnect
......

我们再看下zookeeper中的节点信息:

WatchedEvent state:SyncConnected type:None path:null
ls /
[zookeeper, swarm-agent]
[zk: localhost:2181(CONNECTED) 1] ls /swarm-agent
[docker]
[zk: localhost:2181(CONNECTED) 2] ls /swarm-agent/docker
[swarm]
[zk: localhost:2181(CONNECTED) 3] ls /swarm-agent/docker/swarm
[nodes]
[zk: localhost:2181(CONNECTED) 4] ls /swarm-agent/docker/swarm/nodes
[10.120.196.36:2375, 10.120.196.37:2375]

可以看到两台节点都成功注册到了zookeeper。

还可以通过swarm list的方式来查看节点信息:

root@hadoop986:~/docker# docker run --rm swarm list zk://10.120.196.36:2181,10.120.196.36:2182,10.120.196.36:2183/swarm-agent
time="2017-10-24T09:55:40Z" level=info msg="Initializing discovery without TLS"
2017/10/24 09:55:40 Connected to 10.120.196.36:2183
2017/10/24 09:55:40 Authenticated: id=242992269245284353, timeout=10000
2017/10/24 09:55:40 Re-submitting `0` credentials after reconnect
10.120.196.36:2375
10.120.196.37:2375

其中,--rm参数是让容器退出后自动清理容器内部的文件系统(--rm选项不能与-d同时使用,即只能自动清理foreground容器,不能自动清理detached容器)。

3. 创建swarm manager

在hadoop986机器上执行命令:

docker run --name swarm-manage -d -p 2380:2375 swarm manage zk://10.120.196.36:2181,10.120.196.36:2182,10.120.196.36:2183/swarm-agent

然后可以通过docker info查看swarm集群的信息:

root@hadoop986:~/docker# docker -H tcp://localhost:2380 info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: swarm/1.2.8
Role: primary
Strategy: spread
Filters: health, port, containerslots, dependency, affinity, constraint, whitelist
Nodes: 2
(unknown): 10.120.196.36:2375
└ ID:
└ Status: Pending
└ Containers: 0
└ Reserved CPUs: 0 / 0
└ Reserved Memory: 0 B / 0 B
└ Labels:
└ Error: Cannot connect to the Docker daemon at tcp://10.120.196.36:2375. Is the docker daemon running?
└ UpdatedAt: 2017-10-24T10:42:31Z
└ ServerVersion:
(unknown): 10.120.196.37:2375
└ ID:
└ Status: Pending
└ Containers: 0
└ Reserved CPUs: 0 / 0
└ Reserved Memory: 0 B / 0 B
└ Labels:
└ Error: Cannot connect to the Docker daemon at tcp://10.120.196.37:2375. Is the docker daemon runnindog?
└ UpdatedAt: 2017-10-24T10:42:31Z
└ ServerVersion:
Plugins:
Volume:
Network:
Swarm:
NodeID:
Is Manager: false
Node Address:
Kernel Version: 3.16.0-4-amd64
Operating System: linux
Architecture: amd64
CPUs: 0
Total Memory: 0 B
Name: d66603b3a60a
Docker Root Dir:
Debug Mode (client): false
Debug Mode (server): false
WARNING: No kernel memory limit support
Experimental: false
Live Restore Enabled: false

可以看到,当前两个node都处于Pending未连接状态:

Error: Cannot connect to the Docker daemon at tcp://10.120.196.37:2375. Is the docker daemon runnindog?

这是因为我们的agent机器上的docker守护进程,默认不支持tcp socket访问。

需要修改/etc/default/docker文件开启tcp socket连接的功能:

DOCKER_OPTS="$DOCKER_OPTS -H 0.0.0.0:2375 -H unix:///var/run/docker.sock"

默认的配置在/lib/systemd/system下:

root@hadoop985:/lib/systemd/system# ls -l | grep docker
-rw-r--r-- 1 root root 1037 Jan 17 2017 docker.service
-rw-r--r-- 1 root root 197 Jan 17 2017 docker.socket

修改完/etc/default/docker后,需要重启docker守护进程:

/etc/init.d/docker restart

注意:对于debian8的系统,存在一个bug,致使经过上述操作后,2375端口仍没有起来,是因为/etc/default/docker中的DOCKER_OPTS配置并没有生效。解决的办法可以参考:http://blog.csdn.net/jcjc918/article/details/46564891

经过上述修改后,重新查看docker info信息,可以发现节点成功连接:

root@hadoop986:~#  docker -H tcp://localhost:2380 info
Containers: 10
Running: 10
Paused: 0
Stopped: 0
Images: 5
Server Version: swarm/1.2.8
Role: primary
Strategy: spread
Filters: health, port, containerslots, dependency, affinity, constraint, whitelist
Nodes: 2
hadoop985: 10.120.196.36:2375
└ ID: VP32:TR4C:WQPL:6DRY:75BB:4Q7O:WRHQ:X5RL:Y2GG:VCMO:6KVV:5DU5|10.120.196.36:2375
└ Status: Healthy
└ Containers: 5 (5 Running, 0 Paused, 0 Stopped)
└ Reserved CPUs: 0 / 4
└ Reserved Memory: 0 B / 33.02 GiB
└ Labels: kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux 8 (jessie), ostype=linux, storagedriver=aufs
└ UpdatedAt: 2017-10-25T01:41:30Z
└ ServerVersion: 1.13.0
hadoop986: 10.120.196.37:2375
└ ID: VLY4:UIDQ:DLZC:XYLG:4FMY:5LET:OXPV:7R6O:3JDI:VR3G:MQJU:6VRZ|10.120.196.37:2375
└ Status: Healthy
└ Containers: 5 (5 Running, 0 Paused, 0 Stopped)
└ Reserved CPUs: 0 / 4
└ Reserved Memory: 0 B / 33.02 GiB
└ Labels: kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux 8 (jessie), ostype=linux, storagedriver=aufs
└ UpdatedAt: 2017-10-25T01:41:54Z
└ ServerVersion: 1.13.0
Plugins:
Volume:
Network:
Swarm:
NodeID:
Is Manager: false
Node Address:
Kernel Version: 3.16.0-4-amd64
Operating System: linux
Architecture: amd64
CPUs: 8
Total Memory: 66.05 GiB
Name: d66603b3a60a
Docker Root Dir:
Debug Mode (client): false
Debug Mode (server): false
WARNING: No kernel memory limit support
Experimental: false
Live Restore Enabled: false

4. 在swarm集群中创建容器

后续对swarm集群的使用,完全可以将整个swarm集群当作一台普通的docker主机来对待。通过

 docker -H tcp://localhost:2380 run -d --name zkserver zookeeper

就可以在集群中创建一个运行zookeeper镜像的容器,默认地,swarm会按照“平铺策略”来让所有容器比较平均地分配到每个节点。

相应地,查看集群中运行着的容器:

 docker -H tcp://localhost:2380 ps

基于zookeeper的Swarm集群搭建的更多相关文章

  1. Zookeeper简介与集群搭建【转】

    Zookeeper简介 Zookeeper是一个高效的分布式协调服务,可以提供配置信息管理.命名.分布式同步.集群管理.数据库切换等服务.它不适合用来存储大量信息,可以用来存储一些配置.发布与订阅等少 ...

  2. 基于centos6.5 hbase 集群搭建

    注意本章内容是在上一篇文章“基于centos6.5 hadoop 集群搭建”基础上创建的 1.上传hbase安装包 hbase-0.96.2-hadoop2 我的目录存放在/usr/hadoop/hb ...

  3. Docker系列之swarm集群搭建

    学习Docker很久了,今天分享一下Docker的swarm集群的搭建过程很简单 首先第一步是 每台机器上面都要安装docker 本人使用的是centos7操作系统,使用3太虚拟机,3太虚拟机必须网络 ...

  4. zookeeper及kafka集群搭建

    zookeeper及kafka集群搭建 1.有关zookeeper的介绍可参考:http://www.cnblogs.com/wuxl360/p/5817471.html 2.zookeeper安装 ...

  5. 【运维技术】Zookeeper单机以及集群搭建教程

    Zookeeper单机以及集群搭建教程 单机搭建 单机安装以及启动 安装zookeeper的前提是必须有java环境 # 选择目录进行下载安装 cd /app # 下载zk,可以去官方网站下载,自己上 ...

  6. 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解

    引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单 ...

  7. zookeeper高可用集群搭建

    前提:已经在master01配置好hadoop:在各个slave节点配置好hadoop和zookeeper: (该文是将zookeeper配置在各slave节点上的,其实也可以配置在各master上, ...

  8. Zookeeper简介与集群搭建

    Zookeeper简介 Zookeeper是一个高效的分布式协调服务,可以提供配置信息管理.命名.分布式同步.集群管理.数据库切换等服务.它不适合用来存储大量信息,可以用来存储一些配置.发布与订阅等少 ...

  9. HADOOP+SPARK+ZOOKEEPER+HBASE+HIVE集群搭建(转)

    原文地址:https://www.cnblogs.com/hanzhi/articles/8794984.html 目录 引言 目录 一环境选择 1集群机器安装图 2配置说明 3下载地址 二集群的相关 ...

随机推荐

  1. 201521123111《Java程序设计》第14周学习总结

    本次作业参考文件 MySql操作视频与数据库相关jar文件请参考QQ群文件. 1. 本周学习总结 1.1 以你喜欢的方式(思维导图.Onenote或其他)归纳总结多数据库相关内容. 连接数据库前,应先 ...

  2. 201521123069 《Java程序设计》 第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 Q1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jm ...

  3. SVN不出现绿色对勾的情况

    就目前而言,我出现了两种情况. Num1:电脑云盘可能不兼容,导致无法出现svn提示小icon:----->删除云盘重新启动. Num2:被设置覆盖.----->鼠标右键-->Tor ...

  4. 《Head First Java》读书笔记(2) - Java面向对象思想

    1.了解继承 对象继承实际上就是一种"is - a"的关系,如上图的"PantherMan is a SuperHero?",是,那么便属于继承的理解. 继承能 ...

  5. Extjs整合CKEditor富文本编辑器插件

    CKEditor插件官方下载地址: http://ckeditor.com/download/releases 我使用的版本是 ExtJS5.1.0  CKEditor4.4.8 参考文章: http ...

  6. Python学习笔记008_类_对象_继承_组合_类相关的BIF

    # 对象 = 属性 + 方法>>> # Python中的类名约定以大写字母开始>>> # tt = Turtle() 这就是创建类实例的方法,其它语言用new ,它 ...

  7. python写的一段分页的代码

    代码: from django.utils.safestring import mark_safe class Paginator(object): def __init__(self,current ...

  8. 绘制QQ圆形图像

    思路:这里用到的是图像求交.现在画布上画上圆形,即所需要的圆形头像,然后设置paint的属性设置为求交集,再将bitmap划到canvas上面就好了. 代码如下: private static Bit ...

  9. grunt学习笔记1 理论知识

    你需要检查js语法错误,然后再去压缩js代码.如果这两步你都去手动操作,会耗费很多成本.Grunt就能让你省去这些手动操作的成本. “—save-dev”的意思是,在当前目录安装grunt的同时,顺便 ...

  10. 用vue开发一个app(2,main.js)

    昨天跟着vue的官网搭建了vue的一个脚手架,我也是第一次用VUE一切都在摸索阶段. 今天试着看下里面脚手架里面有点什么东西 先看看main.js 导入了3个模块 一个vue,一个app,还有rout ...