对于有多台服务器来讲,如果每一台都去手动操控,那将会是一件非常浪费时间的事情,毕竟时间这东西,于我们而言,十分宝贵,或许在开始搭建环境的时候耗费点时间,感觉是正常的,我也如此,花费大堆时间在采坑和填坑的路上,但是当你踩完后,还通过手动管理的方式去维护,那便是折磨,因此对于多台服务器下的容器编排管理,借助工具将会节省着大把时间,现如今有名的容器编排工具,K8s、Docker Swarm,甚至功能更强大的Rancher,本次我将使用且是我唯一使用过的Docker Swarm工具搭建Docker集群并部署服务。

  Docker Swarm官方文档地址:https://docs.docker.com/engine/swarm/

一、搭建前期工作

  在之前的文章中,对于一台新的服务器加入到服务器集群中,通过Docker Machine去管理,配置好Docker Enginee环境,简单也方便,同时在配置时,将本地的私钥发送给了新的服务器,也就配置好了关联关系,如有需要可以查看该文章:https://www.cnblogs.com/CKExp/p/9552272.html

  

  加入进来后对于整个服务器集群来讲,可预见的Swarm方式是这样的,也是最为简便的方式管理,Manager作为容器集群发起者,也是管理者,一般来讲,我会尽可能少的在上面部署服务,通过一些方式过滤掉服务在上面的部署,毕竟它的职责更多的侧重于管理整个容器集群,但是对于一些开支小的且比较稳定的服务,也是可以i直接部署在Manager节点中的,这是一种建议。

  这是我当前的服务器下的容器集群,存在一个Leader也就是Manager,也可以设置多个,但是现有场景下,完全满足我的需求了。

  

  我们利用Docker Swarm中的Docker CLI去创建集群、管理集群、动态扩容服务。而对于Swarm的版本,建议是Docker版本要高于1.13,在1.13之上,将Swarm功能集成到了Docker中,而对于1.13之下,需要单独设置Swarm模式,在此建议,使用1.13之上的版本。

  

  在Swarm中有几个名字概念:

  Node:节点,分为Manager Node和Worker Node,在上图中有一个Manager节点和三个Worker节点,这个概念很好理解。

  Service:服务,对于Swarm而言,部署服务是它对外的职责,对于整个集群来讲,都是通过部署服务的形式,并且通过扩容、缩放来动态的决定服务数量。

  Task:服务的具体承载,在于Manager节点将服务分发到具体的Worker节点上,属于下达具体任务概念。相较于Service属于微观概念。

   对于Swarm模式下,需要开启几个相关的端口,而在系统中,这几个端口是默认打开的:

  TCP Port 2377:用于集群间通信,

  TCP 和UDP Port 7946:用于节点间通信,

  UDP Port 4789:用于Overlay网络方式下通信,这个是在集群模式下的网络通信方式,单机下采用的是Bridge方式。

二、开始搭建Swarm

   在需要设置为Manager的节点上输入如下命令,开始容器集群搭建,IP地址写现在服务对外IP。

$ docker swarm init --advertise-addr <MANAGER-IP>

  可以获得如下信息,集群创建完毕,复制该命令,在其他子节点上执行完毕,子节点便是加入了该容器集群(可通过docker-machine ssh xxx的方式快速进入到目的节点中执行)。

  

  对所有节点加入完毕,通过docker node ls命令查看节点信息,加入的节点和本身节点将会显示出来。

如果有新的服务器加入了,并且已经安装好了docker  enginee需要加入到节点中且忘记了这一条token的值,可以通过在manager上执行该命令再次获得这个值

docker swarm join-token worker

  

  至此,整个容器集群就搭建完毕,Manager节点和Worker节点都接入进来了。

三、部署服务到集群

  进入到Manager节点,开始部署一个服务到容器集群中,通过如下命令创建一个服务:

$ docker service create --replicas 1 --name helloworld alpine ping docker.com

  命令解读:

  1、docker service create:用于创建服务;

  2、--replicas 用于确定需要多少个节点容器去运行服务;

  3、对于参数alpine ping docker.com 则是指定alpine镜像,并在容器启动后执行ping docker.com操作;

  通过docker service ls查看当前创建的所有服务,可以通过docker service remove 服务名或ID的形式移除服务,这类操作和Docker的操作是差不多的。

  

  通过docker service inspect --pretty 服务名或ID方式查看服务的详细信息,

  

  在不带--pretty参数下,可以查看到Json格式的详细信息,

  

  通过命令docker service ps 服务名或ID查看服务运行状态,

  

四、对承载服务的批量容器相关操作

  1、扩容/伸缩现有服务承载容器数量  

  通过scale命令执行,并再次查看服务运行信息:

docker service scale 服务名或ID=实例数量

  

   2、滚动更新使用服务使用镜像版本,本次重新搭建一个redis服务,用四个实例承载服务,并通过滚动升级redis版本。

  

  对于--update-delay 为更新前后切换时间,对于后面跟随的时间类型可以有时分秒如10h10m10s,

  通过--update -parallelism参数可以指定最大的实例更新数量,如本次中有四个实例,指定为2后将最大允许两个实例更新到新版本中,

  更新实例版本规则,当一个实例更新完毕并返回running才继续更新下一个实例,如果有一个实例更新失败,整个更新队列将会中止,可以通过--update-failure-action参数指定更新失败后的解决方式,如docker swarm create或是update服务。

  服务创建后实例运行结果结果

  

    现在开始更新版本:

docker service update --image redis:3.0.7 redis

  

  指定新版本镜像及现有服务名称,开始更新,查看当前服务运行情况,四个redis均完成更新。

  

  接下来,通过控制worker节点的状态来控制是否承载某一个服务,通过如下命令,将现有节点下的host1不再承载redis服务,命令如下

docker node update --availability drain host1

   通过参数--availability指定为drain(置空)来设置host1节点不参与服务承载,如下可以看到原有服务已经移交到manager节点下了。

  

  然后启用该host1节点恢复为活跃模式,但是该节点不会再去承载redis服务,因为服务现在并不需要它去承载。

docker node update --availability active host1

  

  至此,对于容器集群的搭建就此完成了。

  对于容器集群的其他高级用法可以参见官方文档:https://docs.docker.com/engine/swarm/services/#roll-back-to-the-previous-version-of-a-service

  

  本文地址:https://www.cnblogs.com/CKExp/p/9651244.html

  欢迎关注微信订阅号,有新的文章将同步到订阅号中

  

2018-10-27,望技术有成后能回来看见自己的脚步

Docker Swarm搭建多服务器下Docker集群的更多相关文章

  1. docker swarm英文文档学习-7-在集群中管理节点

    Manage nodes in a swarm在集群中管理节点 List nodes列举节点 为了查看集群中的节点列表,可以在管理节点中运行docker node ls: $ docker node ...

  2. docker swarm英文文档学习-8-在集群中部署服务

    Deploy services to a swarm在集群中部署服务 集群服务使用声明式模型,这意味着你需要定义服务的所需状态,并依赖Docker来维护该状态.该状态包括以下信息(但不限于): 应该运 ...

  3. 部署AlwaysOn第一步:搭建Windows服务器故障转移集群

    在Windows Server 2012 R2 DataCenter 环境中搭建集群之前,首先要对Windows服务器故障转移集群(Windows Server Failover Cluster,简称 ...

  4. docker swarm英文文档学习-12-在集群模式中的Raft共识

    Raft consensus in swarm mode 在集群模式中的Raft共识 当Docker引擎在集群模式下运行时,manager节点实现Raft 共识算法来管理全局集群状态.Docker s ...

  5. 【实验级】Docker-Compose搭建单服务器ELK伪集群

    本文说明 由于最近在搭ELK的日志系统,为了演示方案搭了个单台服务器的日志系统,就是前一篇文章中所记,其实这些笔记已经整理好久了,一直在解决各种问题就没有发出来.在演示过程中我提到了两个方案,其中之一 ...

  6. 使用Docker Swarm搭建分布式爬虫集群

    https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653195618&idx=2&sn=b7e992da6bd1b2 ...

  7. Docker跨服务器通信Overlay解决方案(下) Consul集群

    承接上文 本文基于上篇文章,详细的场景说明与分析在前篇随笔中业已记录,有兴趣可以移步 Docker跨服务器通信Overlay解决方案(上) Consul单实例 本文主旨 本文为Docker使用Cons ...

  8. docker swarm 搭建与服务更新

    一,docker swarm 是什么 Docker Swarm.Docker Machine与Docker Compose号称Docker三剑客Docker Swarm 和 Docker Compos ...

  9. docker swarm 搭建及跨主机网络互连案例分析

    准备工作 安装docker,不建议直接使用Docker官方的yum install docker wget http://yum.dockerproject.org/repo/main/centos/ ...

随机推荐

  1. Python 员工信息管理系统

    学Python将近一个月了,第一次写了两百多行代码,一个很简单的脚本. 员工信息管理系统: 需求: 1.管理员账户能够增加,删除,修改,查询员工信息,并且设置管理员账户. 2.普通账户可以查看所有员工 ...

  2. java.lang.IllegalArgumentException异常 数据库别名问题

    java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expect ...

  3. Docker 容器

    1.  容器 在过去,如果要开始编写Python应用程序,首先要做的就是在机器上安装Python运行时环境.但是,这就造成了这样一种情况:你的机器上的环境需要完美,以便你的应用程序能够按预期运行,而且 ...

  4. 腾讯云centos服务器不能登录的解决过程

    在腾讯云上申请了一个centos服务器,最基础的配置,1 核 1 GB 1 Mbps,50G硬盘,主要用来测试程序,练手用.在上面配置了一个mysql数据库,一直使用都没什么问题. 1 问题描述 过了 ...

  5. TensorFlow从1到2(二)续讲从锅炉工到AI专家

    图片样本可视化 原文第四篇中,我们介绍了官方的入门案例MNIST,功能是识别手写的数字0-9.这是一个非常基础的TensorFlow应用,地位相当于通常语言学习的"Hello World!& ...

  6. String求求你别秀了

    小鲁班今年计算机专业大四了,在学校可学了不少软件开发的东西,也自学了一些JAVA的后台框架,踌躇满志,一心想着找个好单位实习.当投递了无数份简历后,终于收到了一个公司发来的面试通知,小鲁班欣喜若狂. ...

  7. [译] PEP 255--简单的生成器

    我正打算写写 Python 的生成器,然而查资料时发现,引入生成器的 PEP 没人翻译过,因此就花了点时间翻译出来.如果在阅读时,你有读不懂的地方,不用怀疑,极有可能是我译得不到位.若出现这种情况,我 ...

  8. WebGL three.js学习笔记 法向量网格材质MeshNormalMaterial的介绍和创建360度全景天空盒的方法

    WebGL学习----Three.js学习笔记(5) 点击查看demo演示 Demo地址:https://nsytsqdtn.github.io/demo/360/360 简单网格材质 MeshNor ...

  9. 实用抓包工具:whistle

    无论是前端开发还是客户端,实际开发过程中,抓包都经常被用到.工欲善其事必先利其器,一款好用的抓包工具也是必须的. 说到抓包,Windows系统上不少人都用过Fiddler,Mac或Linux上用Cha ...

  10. 在MySQL中实现Rank高级排名函数【转】

    MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名 ...