前言:

  前一篇《Docker学习—Machine》中对Machine 进行了学习,本篇继续学习Swarm,那么Swarm是什么呢,有什么用呢?接下来一步步了解。

一、什么是Docker-Swarm?

 Swarm是使用swarmkit项目构建的嵌入在Docker 引擎中的集群管理和编排功能的工具包,可以直接在docker中使用

 一个集群由多个Docker主机组成,这些Docker主机以集群模式运行,并充当管理器(用于管理成员资格和委派)和工作器(运行 集群服务)。给定的Docker主机可以是管理员,工作人员或同时担任这两个角色。创建服务时,请定义其最佳状态(可用副本数,网络和存储资源,将服务公开给外界的端口等)。Docker致力于维持所需状态。例如,如果工作节点不可用,则Docker会在其他节点上调度该节点的任务。一个任务 是运行的容器是一个群服务的一部分,并通过群经理管理,而不是一个独立的容器。

 与独立容器相比,群集服务的主要优势之一是,您可以修改服务的配置,包括它所连接的网络和卷,而无需手动重新启动服务。Docker将更新配置,使用过期的配置停止服务任务,并创建与所需配置匹配的新任务。

 当Docker以群体模式运行时,您仍然可以在参与群体的任何Docker主机以及群体服务上运行独立容器。独立容器和群集服务之间的主要区别在于,只有群集管理节点可以管理群集,而独立容器可以在任何守护程序上启动。Docker守护程序可以以管理人员,工作人员或两者兼有的形式参与。

 正如您可以使用Docker Compose来定义和运行容器一样,您可以定义和运行Swarm服务堆栈。

 Swarm相关概念:

  • 节点:

 节点是Docker引擎参与swarm的一个实例。也可以将其视为Docker节点。您可以在单个物理计算机或云服务器上运行一个或多个节点,但生产集群部署通常包括分布在多个物理和云计算机上的Docker节点。

 通常分为管理节点和工作节点

 管理节点:要将应用程序部署到swarm,需要向管理节点提交一个服务定义。管理节点将称为任务的工作单元分派给工作节点。执行所需的编排和群集管理功能,以保持群的所需状态。管理节点选择一个领导者来执行编排任务。

 工作节点:接收并执行从管理节点调度的任务。默认情况下,管理节点也将服务作为工作节点运行,但您可以将它们配置为以独占方式运行管理任务并仅作为管理节点。代理在每个工作节点上运行,并报告分配给它的任务。worker节点将其分配任务的当前状态通知给manager节点,以便manager可以保持每个worker的所需状态。

  • 服务和任务

   服务:是要在管理或工作节点上执行的任务的定义。它是swarm系统的中心结构,是用户与swarm交互的主要根源。创建时,指定要在运行的容器中使用的容器映像和要执行的命令;在复制服务模型中,swarm manager根据您在所需状态下设置的规模在节点之间分配特定数量的任务,对于全局服务,swarm在集群中的每个可用节点上为服务运行一个任务。

   任务:是携带一个Docker容器和在容器内运行的命令。它是swarm的原子调度单元。管理节点根据服务规模中设置的副本数将任务分配给工作节点。任务一旦分配给节点,就不能移动到另一个节点。它只能在指定的节点上运行或失败。

  • 负载均衡:

   swarm manager使用入口负载平衡来公开你希望向swarm提供的外部服务。swarm manager可以自动为服务分配发布端口,也可以为服务配置发布端口。您可以指定任何未使用的端口。如果不指定端口,swarm manager会为服务分配30000-32767范围内的端口。

   外部组件(如云负载平衡器)可以访问群集中任何节点的发布端口上的服务,无论该节点当前是否正在运行该服务的任务。swarm路由中的所有节点都进入到正在运行的任务实例的连接。

   Swarm模式有一个内部DNS组件,它自动为Swarm中的每个服务分配一个DNS条目。swarm manager使用内部负载平衡根据服务的DNS名称在群集中的服务之间分配请求。

二、Swarm的功能亮点

Docker Engine集成集群管理:使用Docker Engine CLI创建一个Docker引擎群,您可以在其中部署应用程序服务。你不需要额外的编排软件来创建或管理蜂群。
分散式设计:Docker引擎在运行时处理任何专门化,而不是在部署时处理节点角色之间的差异。您可以使用Docker引擎部署两种类型的节点,管理器和工作者。这意味着您可以从一个磁盘映像构建一个完整的群。
声明性服务模型:Docker引擎使用声明性方法来定义应用程序堆栈中各种服务的所需状态。例如,您可以描述一个由web前端服务、消息队列服务和数据库后端组成的应用程序。
扩容缩放:对于每个服务,您可以声明要运行的任务数。当您放大或缩小时,swarm manager会通过添加或删除任务来自动进行调整,以保持所需的状态。
理想状态协调:swarm manager节点不断监视群集状态,并协调实际状态与所表达的期望状态之间的任何差异。
多主机网络:可以为您的服务指定overlay网络。swarm管理器在初始化或更新应用程序时自动为覆盖网络上的容器分配地址。
服务发现:Swarm管理器节点为群中的每个服务分配一个唯一的DNS名称和运行容器的负载平衡。您可以通过swarm中嵌入的DNS服务器查询swarm中运行的每个容器。
负载平衡:可以将服务的端口公开给外部负载平衡器。在内部,swarm允许您指定如何在节点之间分发服务容器。
默认安全:Swarm中的每个节点都强制TLS相互身份验证和加密,以确保自身和所有其他节点之间的通信安全。您可以选择使用自签名根证书或来自自定义根CA的证书。
滚动更新:升级时,可以逐步更新服务到节点。swarm manager允许您控制服务部署到不同节点集之间的延迟。如果出现任何问题,您可以回滚到该服务的以前版本。

三、Swarm如何工作?

 服务、任务和容器之间关系如下:

  

 下图显示了群集模式如何接受服务创建请求以及如何将任务调度到工作者节点

四、集群示例:

 1、使用Machine创建集群中docker环境,以下环境  

节点角色 名称 IP地址
manager manager 192.168.0.110
worker worker1 192.168.0.107
worker worker2 192.168.0.108

  进入GitBash命令创建:

docker-machine create -d hyperv --hyperv-virtual-switch docker_Virtual_Switch manager
docker-machine create -d hyperv --hyperv-virtual-switch docker_Virtual_Switch worker1
docker-machine create -d hyperv --hyperv-virtual-switch docker_Virtual_Switch worker2

  

 2、开启集群模式

#进入manager节点:
docker-machine ssh manager
#初始化swarm
docker swarm init --advertise-addr 192.168.0.110
#用于添加工作节点命令
docker swarm join --token SWMTKN-1-2ixlcvkjnv4tzh3i8qq14v0bfit7876pr0qputxmeu6w14m0p6-586ta6x7nf0y0ewh513qt8dwu 192.168.0.110:2377 

  

 3、加入工作节点到集群模式

#进入worker1节点:
docker-machine ssh worker1
#工作节点加入集群
docker swarm join --token SWMTKN-1-2ixlcvkjnv4tzh3i8qq14v0bfit7876pr0qputxmeu6w14m0p6-586ta6x7nf0y0ewh513qt8dwu 192.168.0.110:2377

#进入worker2节点:
docker-machine ssh worker2
#工作节点加入集群
docker swarm join --token SWMTKN-1-2ixlcvkjnv4tzh3i8qq14v0bfit7876pr0qputxmeu6w14m0p6-586ta6x7nf0y0ewh513qt8dwu 192.168.0.110:2377

  

 4、部署服务到集群中  

docker service create --replicas 1 --name helloworld alpine ping docker.com
  • docker service create命令创建服务。
  • --name标志为服务命名helloworld
  • --replicas标志指定1个运行实例的所需状态。
  • 参数alpine ping docker.com将服务定义为执行命令的Alpine Linux容器ping docker.com

  

 5、服务管理

#扩展服务语法
docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>
#示例:
docker service scale helloworld=5

#查看服务语法
docker service ps <SERVICE-ID>
#示例
docker service ps helloworld

#删除服务语法、
docker service rm <SERVICE-ID>
#示例
docker service rm helloworld

其他常用命令使用docker service -h 查看

执行结果如下

五、节点操作:

  • 显示节点列表:docker node ls
  • 修改节点:docker node update 参数
  • 退出集群:doker swarm leave
  • 节点升级:docker node promote 节点名
  • 节点降级:docker node demote 节点名

后续:

 通过Swarm基本了解后,接下来使用实际案例部署到swarm验证,加深理解及操作。

参考:

   https://docs.docker.com/engine/swarm/

Docker学习—Swarm的更多相关文章

  1. docker学习------swarm集群虚机异常关机,node状态为down

    1.因昨天虚机异常关闭,导致今天上去查看时,node节点状态显示为down 2.查了些相关资料,找到处理办法(因我的节点没有任何数据,所以直接对其进行清除) docker swarm leave -- ...

  2. DOCKER 学习笔记8 Docker Swarm 集群搭建

    前言 在前面的文章中,已经介绍如何在本地通过Docker Machine 创建虚拟Docker 主机,以及也可以在本地Windows 创建虚拟主机,也是可以使用的.这一节,我们将继续学习 Docker ...

  3. docker学习之使用 DockerFile 构建镜像并搭建 swarm+compose 集群

    题目要求 (1)将springboot应用程序打成jar包:Hot.jar (2)利用dockerfile将Hot.jar构建成镜像 (3)构建 Swarm 集群 (4)在 Swarm 集群中使用 c ...

  4. [原创]Docker学习记录: Shipyard+Swarm+Consul+Service Discover 搭建教程

    网上乱七八糟的资料实在是太多了, 乱, 特别乱, 而看书呢, 我读了2本书, 一本叫做<>, 另一本叫做<< Docker进阶与实战>> 在 服务发现这块讲的又不清 ...

  5. Docker学习总结

    本文作为总结性文章,不会详细讲解Docker.但会把已学习的.了解的内容按照由易到难的顺序串起来,更多的是帮助Docker新手快速的了解Docker,知道目前处在哪个阶段,接下来该学些什么,避免碰太多 ...

  6. 【Docker】 Swarm简单介绍

    [Swarm] Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源.Swarm ...

  7. Docker之Swarm

    Docker学习笔记 — Swarm搭建Docker集群 Swarm在schedule节点运行容器的时候,会根据指定的策略来计算最适合运行容器的节点,目前支持的策略有:spread, binpack, ...

  8. Docker - 使用 swarm 部署 services

    前言 经过之前一段时间学习与思考,我们已经大概明确了一些感念: Docker image/container,  service and node 简单来说,swarm允许我们以节点(node)的方式 ...

  9. Docker学习(十一)Docker系列结束-新的开始K8S

    Docker学习(十一)Docker系列结束-新的开始K8S 标签(空格分隔): docke k8s Docker系列结束 上一篇讲到使用docker官方提供的容器编排工具docker-compose ...

随机推荐

  1. allure测试报告

    首先如果你没有安装 pytest 库的话,先使用 pip 安装一下: pip install pytest 另外还需要安装 pytest 支持 allure 报告的插件库: pip install a ...

  2. <bdi> 标签

    bdi 指的是 bidi 隔离. <bdi> 标签允许您设置一段文本,使其脱离其父元素的文本方向设置. 在发布用户评论或其他您无法完全控制的内容时,该标签很有用. 实例 把用户名从周围的文 ...

  3. C# 判断当前目录是否存在不存在则创建

    /// <summary> /// 判断目录是否存在不存在则创建 /// </summary> /// <param name="Path">& ...

  4. non-local denoising methods

    NL-Means算法 在噪声先验为高斯噪声的基础上, 进行non-local的平均,在2005年由Baudes提出,该算法使用自然图像中普遍存在的冗余信息来去噪声.与常用的双线性滤波.中值滤波等利用图 ...

  5. java实现单链表、栈、队列三种数据结构

    一.单链表 1.在我们数据结构中,单链表非常重要.它里面的数据元素是以结点为单位,每个结点是由数据元素的数据和下一个结点的地址组成,在java集合框架里面 LinkedList.HashMap(数组加 ...

  6. Redis学习笔记(九)——集群

     一.概述 Redis Cluster与Redis3.0.0同时发布,以此结束了Redis无官方集群方案的时代. Redis Cluster是去中心化,去中间件,也就是说,集群中的每个节点都是平等的关 ...

  7. git 移除远程仓库关联

    1 git remote rm origin // 移除本地关联 2 git remote add origin git@github.com/example.git // 添加线上仓库 3 git ...

  8. Spark性能调优的方法

    原则一:避免创建重复的RDD 通常来说,我们在开发一个Spark作业时,首先是基于某个数据源(比如Hive表或HDFS文件)创建一个初始的RDD:接着对这个RDD执行某个算子操作,然后得到下一个RDD ...

  9. 初识ABP vNext(12):模块的独立运行与托管

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 模块运行 动态 C# API 客户端 最后 前言 很久没更新这个系列...之前的章节中讲到ABP的模块是可以独立运行的 ...

  10. Mybatis入门 Mybatis存在的意义 解决的问题 基本操作

    Mybatis入门 Mybatis的作用 解决的问题 基本操作 为什么要学MyBatis 我们链接操作数据库需要做的步骤 package Test; import java.sql.*; public ...