前言:

  前一篇《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学习记录: Shipyard+Swarm+Consul+Service Discover 搭建教程

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

  4. Docker学习总结

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

  5. 【Docker】 Swarm简单介绍

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

  6. Docker之Swarm

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

  7. Docker - 使用 swarm 部署 services

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

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

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

  9. DOCKER 学习笔记9 Kubernetes (K8s) 弹性伸缩容器 下

    前言 从上一篇看来,我们已经对于Kubernetes ,通过minikube 建立集群,而后使用kubectl 进行交互,对Deployment 部署以及服务的暴露等.这节,将学习弹性的将服务部署到多 ...

  10. Docker学习笔记 — 配置国内免费registry mirror

    Docker学习笔记 — 配置国内免费registry mirror Docker学习笔记 — 配置国内免费registry mirror

随机推荐

  1. Linux CentOS 配置JDK环境

    一.下载JDK 下载JDK的方式有两种: 1.Linux中使用wget下载 1.使用命令安装wget yum install wget 2.下载 wget 'http://download.oracl ...

  2. centos6.5 redmine 安装

    安装成功redmine信息 Redmine 2.6.0.stable   Environment:   Redmine version                2.6.0.stable   Ru ...

  3. String inputStream file转化

    String --> InputStreamByteArrayInputStream stream = new ByteArrayInputStream(str.getBytes()); Inp ...

  4. 2018-2019-1-20165221&amp;20165225 《信息安全系统设计》实验五:通讯协议设计

    2018-2019-1-20165221&20165225 <信息安全系统设计>-实验五:通讯协议设计 OpenSSL学习: 简介: OpenSSL是为网络通信提供安全及数据完整性 ...

  5. URL跳转与webview安全浅谈

    URL跳转与webview安全浅谈 我博客的两篇文章拼接在一起所以可能看起来有些乱 起因 在一次测试中我用burpsuite搜索了关键词url找到了某处url我测试了一下发现waf拦截了指向外域的请求 ...

  6. 白话TCP为什么需要进行三次握手

    阅读本文大概需要 2.3 分钟. 作者:雨林 https://www.cnblogs.com/yuilin 首先简单介绍一下TCP三次握手 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次 ...

  7. SD寄售-寄售补充

    SD寄售-寄售补充 概述: 寄售就是企业将货物寄放在客户处,或者在自己的仓库为客户保留库存,货物所有权归公司,当客户将库存消耗掉,才算公司的销售.公司才开票给客户. SAP SD寄售涉及4个业务过程, ...

  8. ASP.NET MVC5入门2之Ajax实现数据查询

    开发环境:VS2013 数据库:SQL Server2008R2 架构:ASP.NET MVC5 开发语言:C# 代码下载链接:http://download.csdn.net/detail/u010 ...

  9. 2018-2019-2 网络对抗技术 20165301 Exp2 后门原理与实践

    2018-2019-2 网络对抗技术 20165301 Exp2 后门原理与实践 实验内容 (1)使用netcat获取主机操作Shell,cron启动 (2)使用socat获取主机操作Shell, 任 ...

  10. 【python】解决No module named _sqlite3的问题

    环境版本说明: centos 7 python3.6.4 django 2.0 在创建django项目时候.报错以下信息 详细错误信息如下: 原因: 未安装sqlite 模块 解决: 1 安装 sql ...