前言:

  前一篇《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. rabbitmq与erlang版本

    来源自https://www.rabbitmq.com/which-erlang.html erlang安装包下载地址 https://packages.erlang-solutions.com/er ...

  2. selenium 浏览器最大化

    from time import sleep from selenium import webdriver from selenium.webdriver.chrome.options import ...

  3. Windows快捷键与Dos命令学习

    部分Windows常用快捷键 复制:Ctrl + C 粘贴:Ctrl + V 全选:Ctrl + A 剪切:Ctrl + X 撤销:Ctrl + Z 保存:Ctrl + S 关闭窗口:Alt + F4 ...

  4. Codeforces Educational Round 92 赛后解题报告(A-G)

    Codeforces Educational Round 92 赛后解题报告 惨 huayucaiji 惨 A. LCM Problem 赛前:A题嘛,总归简单的咯 赛后:A题这种**题居然想了20m ...

  5. postgresql使用规范解读

    表设计规范1.建议能使用小字节数类型,就不要用大字节数类型2.建议能用varchar(N).text就不用char(N):3.建议使用default NULL,而不用default '':4.建议使用 ...

  6. 有关hashMap跟hashTable的区别

    HashMap和Hashtable都实现了Map接口 HashMap是非synchronized,而Hashtable是synchronized HashTable使用Enumeration,Hash ...

  7. java 第二课 标识符

    Java 标识符为字母.数字.下划线.dollar符 变量不能以数字开头 包名小写 类.接口首字母大写 方法首字母小写 全局变量首字母小写 局部变量首字母大写 常量大写,单词间用下划线隔开 Java中 ...

  8. E. Copying Data 解析(線段樹)

    Codeforce 292 E. Copying Data 解析(線段樹) 今天我們來看看CF292E 題目連結 題目 給你兩個陣列\(a,b\),有兩種操作:把\(a\)的一段複製到\(b\),或者 ...

  9. Linux 网络编程的5种IO模型:多路复用(select/poll/epoll)

    Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了 ...

  10. FloodFill算法详解及应用

    啥是 FloodFill 算法呢,最直接的一个应用就是「颜色填充」,就是 Windows 绘画本中那个小油漆桶的标志,可以把一块被圈起来的区域全部染色. 这种算法思想还在许多其他地方有应用.比如说扫雷 ...