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

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




本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
本文记录在3台物理机上搭建Hadoop 2.6.0的详细步骤及碰到的问题解决。默认使用root账号操作,实际中建议使用专用的hadoop用户账号。 1. 环境 机器: 物理机3台,ip分别为192.168.1.130、192.168.1.132、192.168.1.134 操作系统: CentOS 6.6 Java: 1.7 Hadoop: 2.6.0 请确保JDK已安装,使用 java -version 确认。 hosts配置 配置主机hosts文件: vim /etc/hosts 192.168.1.

Docker的安装配置及使用详解 - 2016-07-14 14:07:12

基本概念 Docker 包括三个基本概念 镜像(Image) 容器(Container) 仓库(Repository) 先理解了这三个概念,就理解了 Docker 的整个生命周期。 1、docker安装与启动 yum install -y epel-releaseyum install docker-io # 安装docker # 配置文件 /etc/sysconfig/docker chkconfig docker on # 加入开机启动 service docker start # 启动docker服
mahout之推荐系统源码笔记(4) —总结与优化 花了几天的时间阅读分析了mahout推荐系统中基于java单机和基于hadoop的分布式mapreduce源码。根据其推荐系统hadoop程序的job划分写了笔记1、2、3。在这里,基于笔记1,2,3做一个总结。 我们先从相似度开始。 什么是相似度,就是我们在构建推荐系统时,基于user或者基于item都需要计算出相应的候选item或者是user。那么在mahout的hadoop程序中,他运用的是基于item的推荐系统,同样的,也需要计算相似度。 计算相
分享主要分为以下五个部分: HAWQ基本介绍; HAWQ架构以及各重要组件的基本原理; HAWQ的中短期规划; 如何贡献到HAWQ和成为Apache Committer; Q A。 一、HAWQ基本介绍 HAWQ是一个Hadoop原生大规模并行SQL分析引擎,针对的是分析性应用。和其他关系型数据库类似,接受SQL,返回结果集。但它具有大规模并行处理很多传统数据库以及其他数据库没有的特性及功能。主要如下: 对标准的完善支持:ANSI SQL标准,OLAP扩展,标准JDBC/ODBC支持,比其他Hadoop
Hadoop 的 HDFS 集群在使用一段时间后,各个 DataNode 节点的磁盘使用率肯定会出现不平衡的情况,也就是数据量层面的数据倾斜,如图: 引起这种情况的方式很多: 1.        添加新的 Datanode 节点 2.        人为干预将数据的副本数降低或者增加   我们都知道当 HDFS 出现数据不平衡的时候,就会造成 MapReduce 或 Spark 等应用程序无法很好的利用本地计算的优势,而且 Datanode 节点之间也没有更好的网络带宽利用率,某些 Datanode 节点
线性判别分析(Linear Discriminant Analysis) 标签(空格分隔): 监督学习 @author : duanxxnj@163.com @time : 2016-07-11 线性判别分析Linear Discriminant Analysis 线性分类器 判别式函数discriminant functions 从判别式或后验概率到决策面 线性判别分析Linear Discriminant Analysis 二次判别分析QDA Fisher判别式 类间距离 类内距离 Fisher线性判

Jenkins 2.0新时代:从CI到CD - 2016-07-12 14:07:50

2.0 破茧重生 自从去年9月底Jenkins的创始人Kohsuke Kawaguchi提出Jenkins 2.0(后称2.0)的愿景和草案之后,整个Jenkins社区为之欢欣鼓舞,不管是官方博客还是Google论坛,大家都在热烈讨论和期盼2.0的到来。4月20日,历经Alpha(2/29),Beta(3/24),RC(4/7)3个版本的迭代,2.0终于正式发布。这也是Jenkins面世11年以来(算上前身Hudson)的首次大版本升级。那么,这次升级具体包含了哪些内容呢? 外部 从外部来看,2.0最大的
基本流程图如下: 命令如下: 将用sqoop导入Oracle数据到HDFS./sqoop import --connect jdbc:oracle:thin:@192.168.146.128:1521:orcal -- username scoot --passwd tiger --table emp --columns 'empno, ename, job, sal, deptno' -m 1 --target -dir '/sqoop/emp'使用sqoop导入oracle数据到hive中,./sqo

HIVE和HBASE区别 - 2016-07-11 17:07:52

1. 两者分别是什么?    Apache Hive是一个构建在Hadoop基础设施之上的数据仓库。通过Hive可以使用HQL语言查询存放在HDFS上的数据。HQL是一种类SQL语言,这种语言最终被转化为Map/Reduce. 虽然Hive提供了SQL查询功能,但是Hive不能够进行交互查询--因为它只能够在Haoop上批量的执行Hadoop。     Apache HBase是一种Key/Value系统,它运行在HDFS之上。和Hive不一样,Hbase的能够在它的数据库上实时运行,而不是运行MapRe
内容翻译:@穆文(微信公众号 数据挖掘机养成记) 寒小阳 校正调整: 寒小阳 龙心尘 时间:2016年7月 出处: http://blog.csdn.net/han_xiaoyang/article/details/51871068 http://blog.csdn.net/longxinchen_ml/article/details/51823339 说明:本文为斯坦福大学CS224d课程的中文版内容笔记整理,已得到斯坦福大学课程@Richard Socher教授的授权翻译 0.前言 之前的课程里介绍了