DockerSwarm

Docker Swarm简介

Docker Swarm的功能

​ Docker Swarm包含两个方面:docker安全集群,以及一个微服务应用引擎

​ 集群方面,swarm将一个或多个docker节点组织起来,是的用户能以集群方式管理它,swarm默认内置有加密的分布式集群存储、加密网络、公有TLS、安全集群接入令牌以及一个简化数字证书管理的PKI。用户可以自如的添加或删除节点

​ 编排方面,Swarm提供了一套丰富的API使得部署和管理复杂的微服务应用变得易如反掌,通过将应用定义在声明式配置文件中,就可以使用原生docker命令完成部署。甚至可以滚动升级、回滚、扩缩容。

​ Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。dockerswarm是docker为了方便集群管理、容器编排产生的技术。

Docker Swarm 模式介绍

docker-compose up 启动一个项目开启一系列服务 单机模式

docker swarm 集群模式 多个机器

​ dockerswarm中有节点的概念,一个节点就可以通俗的理解为一个机器(可以是物理服务器也可以是虚拟机、云等等)。dockerswarm由多个节点组成,节点又分为管理节点(Manager)与工作节点(Worker),管理节点负责集群控制,能过监控集群状态、分发任务到工作节点;工作节点是接收来自管理节点的任务并执行。

​ Swarm的配置和状态信息保存在一套位于所有管理节点上的分布式etcd数据库中。该服务器运行在内存中(速度快),并且作为Swarm的一部分被安装,无需管理

​ Swarm集群使用了TLS自动秘钥轮换 所以安全性不需要考虑

应用编排,Swarm最小的调度单元称为服务,拿redis举例 在一个集群中开启了一个redis服务 然后需要下发到各个节点上生成容器去运行redis ,运行的这个容器就叫任务(副本),一个服务中封装了多个任务。(多加练习)

十台机器以下docker swarm即可 ,机器数量多的时候要用k8s。

[]: https://docs.docker.com/engine/swarm/ "dockerswarm官方文档"

初始化集群

搭建集群是每个节点都需要安装docker!!并且在防火墙开放2377、7946、4789这三个端口

  • 2377/tcp:用于客户端与Swarm进行安全通信
  • 7946/tcp&&udp:用于控制面板gossip分发
  • 4789/udp:用于基于VXLAN的覆盖网络

搭建集群大体流程:初始化第一个管理节点>加入额外的管理节点>加入工作节点>完成

不包含在任何 Swarm 中的 Docker 节点,称为运行于单引擎(Single-Engine)模式。一旦被加入 Swarm 集群,则切换为 Swarm 模式,如下图所示。

在单引擎模式下的 Docker 主机上运行 docker swarm init会将其切换到 Swarm 模式,并创建一个新的 Swarm,将自身设置为 Swarm 的第一个管理节点。

更多的节点可以作为管理节点或工作节点加入进来。这一操作也会将新加入的节点切换为 Swarm 模式

查看docker swarm帮助命令

beginner@beginner-virtual-machine:~$ docker swarm --help
==============================================================
Usage: docker swarm COMMAND Manage Swarm Commands:
ca Display and rotate the root CA
init Initialize a swarm
join Join a swarm as a node and/or manager
join-token Manage join tokens
leave Leave the swarm
unlock Unlock swarm
unlock-key Manage the unlock key
update Update the swarm Run 'docker swarm COMMAND --help' for more information on a command.
==============================================================

初始化集群(这里选择在本地局域网内搭建)

beginner@beginner-virtual-machine:~$ docker swarm init --advertise-addr 192.168.0.106
==============================================================
Swarm initialized: current node (nb4wuodurb7hq0i6yd9r0tzan) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-3l3qurw9tqjlx9uzhgj9fqdpss7hi0ig3yb86iu45u2q1zfxlv-4kw80d9b3ptt22wjfoikb5fej 192.168.0.106:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
============================================================== # 上面给出了工作节点的加入口令,同时也给出了管理节点的加入方式 在管理节点上运行docker swarm join-token manager 就可以获得加入口令
beginner@beginner-virtual-machine:~$ docker swarm join-token manager
==============================================================
To add a manager to this swarm, run the following command: docker swarm join --token SWMTKN-1-3l3qurw9tqjlx9uzhgj9fqdpss7hi0ig3yb86iu45u2q1zfxlv-1vwu2sxcqhdr621gn0sv2vdqk 192.168.0.106:2377
==============================================================
  • 以工作节点的身份加入集群
  beginner2@beginner2-virtual-machine2:~/Desktop$ docker swarm join --token SWMTKN-1-3l3qurw9tqjlx9uzhgj9fqdpss7hi0ig3yb86iu45u2q1zfxlv-4kw80d9b3ptt22wjfoikb5fej 192.168.0.106:2377
This node joined a swarm as a worker.
  • 以管理节点的身份加入集群
docker swarm join --token SWMTKN-1-3l3qurw9tqjlx9uzhgj9fqdpss7hi0ig3yb86iu45u2q1zfxlv-1vwu2sxcqhdr621gn0sv2vdqk 192.168.0.106:2377
  • 查看节点情况 正常的集群不应该是这样 !!!我偷懒只启动了两个只为了说明效果 注意虽然两个HOSTNAME一样但并不是同一台机器(因为在之前其中的一台虚拟机是复制的另一台虚拟机,现在就顺手拿用)
docker node ls  #注意必须是管理节点的身份才可以查看
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
92itu9f5253l4d9syx690cgb2 beginner-virtual-machine Ready Active 20.10.7
nb4wuodurb7hq0i6yd9r0tzan * beginner-virtual-machine Ready Active Leader 20.10.7

Swarm 管理器高可用性(HA)

Raft协议:保证大多数管理节点存活 集群才可以用,集群中管理节点至少大于三台,

假设当前集群中有三个管理节点,当挂了一个管理节点后 还有两个存活(大多数都存活) 所以集群仍可用

Swarm使用了Raft来实现了支持管理节点的HA,即使一个或多个节点发生故障,剩余管理节点也会继续保证 Swarm 的运转。

从技术上来说,Swarm 实现了一种主从方式的多管理节点的 HA。这意味着,即使你可能有多个管理节点,也总是仅有一个节点处于活动状态。

通常处于活动状态的管理节点被称为“主节点”(leader),而主节点也是唯一一个会对 Swarm 发送控制命令的节点。也就是说,只有主节点才会变更配置,或发送任务到工作节点。如果一个备用(非活动)管理节点接收到了 Swarm 命令,则它会将其转发给主节点。

这一过程如下图所示。步骤 ① 指命令从一个远程的 Docker 客户端发送给一个管理节点;步骤 ② 指非主节点将命令转发给主节点;步骤 ③ 指主节点对 Swarm 执行命令。

关于 HA,有以下两条最佳实践原则。

  • 部署奇数个管理节点。
  • 不要部署太多管理节点(建议 3 个或 5 个)。

部署奇数个管理节点有利于减少脑裂(Split-Brain)情况的出现机会。假如有 4 个管理节点,当网络发生分区时,可能会在每个分区有两个管理节点。这种情况被称为脑裂。

每个分区都知道曾经有 4 个节点,但是当前网络中仅有两个节点,糟糕的是,每个分区都无法知道其余两个节点是否运行,也无从得知本分区是否掌握大多数(Quorum)。

虽然在脑裂情况下集群依然在运行,但是已经无法变更配置,或增加和管理应用负载了。不过,如果部署有 3 个或 5 个管理节点,并且也发生了网络分区,就不会出现每个分区拥有同样数量的管理节点的情况。

这意味着掌握多数管理节点的分区能够继续对集群进行管理。下图中右侧的例子,阐释了这种情况,左侧的分区知道自己掌握了多数的管理节点。

对于所有的共识算法来说,更多的参与节点就意味着需要花费更多的时间来达成共识。这就像决定去哪吃饭,只有3个人的时候总是比有33个人的时候能更快确定。

考虑到这一点,最佳的实践原则是部署 3 个或 5 个节点用于 HA。7 个节点可以工作,但是通常认为 3 个或 5 个是更优的选择。当然绝对不要多于 7 个,因为需要花费更长的时间来达成共识。

关于管理节点的 HA 再补充一点。显然将管理节点分布到不同的可用域(Availability Zone)中是一种不错的实践方式,但是一定要确保它们之间的网络连接是可靠的,否则由于底层网络分区导致的问题将是令人痛苦的。

锁定 Swarm

​ 尽管内置有如此多的原生安全机制,重启一个旧的管理节点或进行备份恢复仍有可能对集群造成影响。一个旧的管理节点重新接入 Swarm 会自动解密并获得 Raft 数据库中长时间序列的访问权,这会带来安全隐患。进行备份恢复可能会抹掉最新的 Swarm 配置。

​ 为了规避以上问题,Docker 提供了自动锁机制来锁定 Swarm,这会强制要求重启的管理节点在提供一个集群解锁码之后才有权从新接入集群。

通过在执行 docker swarm init 命令来创建一个新的 Swarm 集群时传入 --autolock 参数可以直接启用锁。然而,前面已经搭建了一个 Swarm 集群,这时也可以使用 docker swarm update 命令来启用锁。

在某个 Swarm 管理节点上运行如下命令。

$ docker swarm update --autolock=true
Swarm updated.
To unlock a swarm manager after it restarts, run the
`docker swarm unlock`command and provide the following key: SWMKEY-1-5+ICW2kRxPxZrVyBDWzBkzZdSd0Yc7Cl2o4Uuf9NPU4 Please remember to store this key in a password manager, since without
it you will not be able to restart the manager.

请确保将解锁码妥善保管在安全的地方!重启某一个管理节点,以便观察其是否能够自动重新接入集群。

$ service docker restart

尝试列出Swarm中的节点。

$ docker node ls
Error response from daemon: Swarm is encrypted and needs to be unlocked before it can be used.

​ 尽管 Docker 服务已经重启,该管理节点仍然未被允许重新接入集群。

为了进一步验证,可以到其他管理节点执行 docker node ls 命令,会发现重启的管理节点会显示 down 以及 unreachable。

​ 执行 docker swarm unlock 命令来为重启的管理节点解锁 Swarm。该命令需要在重启的节点上执行,同时需要提供解锁码。

$ docker swarm unlock
Please enter unlock key: <enter your key>

​ 该节点将被允许重新接入 Swarm,并且再次执行 docker node ls 命令会显示 ready 和 reachable。

Swarm集群创建服务

可以动态扩缩容 屏蔽底层差异

集群服务的相关命令docker service

beginner@beginner-virtual-machine:~$ docker service 

Usage:  docker service COMMAND

Manage services

Commands:
create Create a new service
inspect Display detailed information on one or more services
logs Fetch the logs of a service or task
ls List services
ps List the tasks of one or more services
rm Remove one or more services
rollback Revert changes to a service's configuration
scale Scale one or multiple replicated services
update Update a service

启动一个示例

docker service create -p 8888:80 --name my-nginx nginx:latest

--mode global所有节点都可以创建任务副本运行
--mode replicas 只有工作节点才能运行

查看服务

docker service ls

动态扩缩容实现高可用

docker service update --relipcas 10 my-nginx  #现在让整个项目整体产生10个服务

docker service update --relipcas 2 my-nginx  # 将集群缩减为两个服务

docker service scale my-nginx=10
docker service scale my-nginx=2
与上面两个一模一样

滚动更新

docker service update \
--image nginx:2.0 \
--update-parallelism 2 \
--update-delay 20s my-nginx # 将镜像更新为2.0 每次更新两个副本 每20s更新一次

移除服务

docker service rm my-nginx

命令总结

  • docker swarm init 用于创建一个新的 Swarm。执行该命令的节点会成为第一个管理节点,并且会切换到 Swarm 模式。
  • docker swarm join-token 用于查询加入管理节点和工作节点到现有 Swarm 时所使用的命令和 Token。 要获取新增管理节点的命令,请执行 docker swarm join-token manager 命令; 要获取新增工作节点的命令,请执行 docker swarm join-token worker 命令。
  • docker node ls 用于列出 Swarm 中的所有节点及相关信息,包括哪些是管理节点、哪个是主管理节点。
  • docker service create 用于创建一个新服务
  • docker service ls 用于列出 Swarm 中运行的服务,以及诸如服务状态、服务副本等基本信息
  • docker service ps 该命令会给出更多关于某个服务副本的信息
  • docker service inspect 用于获取关于服务的详尽信息。附加 --pretty 参数可限制仅显示重要信息。
  • docker service scale 用于对服务副本个数进行增减。
  • docker service update 用于对运行中的服务的属性进行变更。
  • docker service rm 用于从 Swarm 中删除某服务。该命令会在不做确认的情况下删除服务的所有副本,所以使用时应保持警惕

docker进阶_dockerswarm的更多相关文章

  1. 【云计算】Docker云平台—Docker进阶

    Docker云平台系列共三讲,此为第二讲:Docker进阶 参考资料: 五个Docker监控工具的对比:http://www.open-open.com/lib/view/open1433897177 ...

  2. Docker进阶

    Docker进阶 Docker容器命名与重命名 命名 docker run -it -p 80:80 --name containerName img:tag /bin/bash 重命名 docker ...

  3. Docker:四、Docker进阶 Windows Docker IIS 部署

    前面的三篇docker 文档大家看的肯定不过瘾,自己可能也已经上手一试了...不知道有没有发现问题... 哈哈... 我来说说我遇到的问题哦 一.windows docker 镜像越来越大 默认的do ...

  4. Ubuntu Server下docker实战 02: docker进阶配置

    在上一篇文章里<Ubuntu Server下docker实战 01: 安装docker>,我们已经把docker安装起来了,并运行了一个hello-world 这一篇,我们继续讲进阶配置. ...

  5. docker进阶之路-基础篇 | 一:环境搭建

    转载请注明作者及出处: 作者:银河架构师 原文链接:https://www.cnblogs.com/luas/p/12061747.html 一.准备工作 查看内核 Docker 要求 CentOS ...

  6. docker进阶之路-基础篇 | 二:portainer安装与基本使用

    转载请注明作者及出处: 作者:银河架构师 原文链接:https://www.cnblogs.com/luas/p/12061755.html ​简介 Portainer 是轻量级,跨平台,开源的管理D ...

  7. 斌哥的 Docker 进阶指南—监控方案的实现

    过去的一年中,关于 Docker 的话题从未断过,而如今,从尝试 Docker 到最终决定使用 Docker 的转化率依然在逐步升高,关于 Docker 的讨论更是有增无减.另一方面,大家的注意力也渐 ...

  8. 斌哥的 Docker 进阶指南

    过去的一年中,关于 Docker 的话题从未断过,而如今,从尝试 Docker 到最终决定使用 Docker 的转化率依然在逐步升高,关于 Docker 的讨论更是有增无减.另一方面,大家的注意力也渐 ...

  9. Docker进阶使用1

    容器间共享文件 Docker 的容器和外部环境是相对隔离的,并且容器是一次性的,运行结束后并不会有任何的持久化的文件或者数据.所以当我们需要做应用数据的持久化,或者保留应用的日志文件时,我们需要用到 ...

随机推荐

  1. SVPWM实现概述

    SVPWM是FOC的基础,其实现流程大致如下所示: 1. 判断合成矢量所在扇区 2. 计算相邻矢量作用时间 3. 计算各桥臂导通时间 4. 得到各相PWM占空比 5. 更新相应寄存器值  SVPWM目 ...

  2. CF932G Palindrome Partition(回文自动机)

    CF932G Palindrome Partition(回文自动机) Luogu 题解时间 首先将字符串 $ s[1...n] $ 变成 $ s[1]s[n]s[2]s[n-1]... $ 就变成了求 ...

  3. Github使用指南(学习中随时更新)

    注册好一个账号后先创建一个仓库 点击"Create repository"创建一个版本库 填好带*号的必填项,选择是要公开仓库还是私人使用,勾选自动添加README选项 READM ...

  4. 解释Spring支持的几种bean的作用域?

    Spring框架支持以下五种bean的作用域: singleton :bean在每个Spring ioc 容器中只有一个实例. prototype:一个bean的定义可以有多个实例. request: ...

  5. Ribbon负载均衡能干什么?

    (1)将用户的请求平摊的分配到多个服务上 (2)集中式LB即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至 ...

  6. JavaScript使用原型链实现继承

    JavaScript实现继承的思想: 一句话总结,让子类的原型等于父类的实例. 详细来说,其实利用了原型的性质即在JavaScript中所有被实例化对象具有相同的原型属性和方法,每一个被实例化对象的原 ...

  7. IDEA 常用快捷键操作

    自定义设置及查询: 操作路径:file-setting-Keymap-Editor actions 右击需要修改的action操作,或者右击Editor actions,选择添加Add Keyboar ...

  8. Mybaits 的优点?

    1.基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任 何影响,SQL 写在 XML 里,解除 sql 与程序代码的耦合,便于统一管理:提供 XML 标签,支持编写动态 SQL ...

  9. park和unpark

    1 介绍 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport提供的两个主要方法就是park和unpark. park译为&quo ...

  10. 【Python自动化Excel】Python与pandas字符串操作

    Python之所以能够成为流行的数据分析语言,有一部分原因在于其简洁易用的字符串处理能力. Python的字符串对象封装了很多开箱即用的内置方法,处理单个字符串时十分方便:对于Excel.csv等表格 ...