Docker Swarm是Docker官方的三剑客项目之一,提供Docker容器集群服务,是Docker官方对容器云生态进行支持的核心方案
使用它,用户可以将多个Docker主机封装为单个大型的虚拟Docker主机,快速打造一套容器云平台。

Docker Swarm是Docker公司推出的官方容器集群平台,基于Go语言实现。
目前,包括Rackspace在内的许多平台都采用了Swarm,用户很容易在AWS等公有云平台使用Swarm。

Swarm的前身是Beam项目和libswarm项目,首个正式版本(Swarm V1)在2014年12初发布。
为了提高可扩展性,2016年2月对架构进行重新设计,推出V2版本,支持超过1000个节点。
最新的Docker Engine已经集成了Swarm Kit,加强了对Swarm的协调支持。

作为容器集群管理器,Swarm最大的优势就是100%支持标准的Docker API
各种基于标准API工具,如Compose、docker.py,各种管理软件,甚至Docker本身都可以很容易地与Swarm集成。
这大大方便了用户将原先基于单节点地系统移植到Swarm上。
同时Swarm内置了对Docker网络插件地支持,用户可以很容易地部署跨主机地容器集群服务。

Swarm是典型地master-slave结构,通过发现服务来选举manager。manager是中心管理节点,各个node上运行agent接受manager地统一管理。

在v2中,集群会自动通过Raft协议分布式选举manager节点,无需额外地发现服务地支持,避免了单节点瓶颈。
同时v2内置了基于DNS地负载均衡和外部负载均衡机制地集群支持。

一、构建集群

对于Docker1.12已经更新的版本,swarm相关命令已经原生嵌入到了Docker Engine中,因此我们可以直接使用。
首先查看docker swarm的帮助信息:

[root@centos003 ~]# docker swarm --help

Usage:    docker swarm COMMAND

Manage Swarm

Commands:
ca Display and rotate the root CA
init 初始化一个集群
join 将swarm作为节点或者管理器加入集群
join-token 管理连接令牌
leave 退出集群
unlock 解锁集群
unlock-key 管理解锁密钥
update 更新集群 使用'docker swarm COMMAND --help' 来查看每个命令的详细信息

在构建集群之前首先应该保证的是每台机器(不论是虚拟机还是物理机)上面都已经安装Docker Engine并且已经启动,当然你可以使用docker machine来快速构建。

1.初始化集群

为了更加清晰的使用docker swarm init进行初始化,我们首先依旧是查看帮助信息。

[root@centos003 ~]# docker swarm init --help

Usage:    docker swarm init [OPTIONS]

Initialize a swarm

Options:
--advertise-addr string 广播地址 (format: <ip|interface>[:port])
--autolock 启用管理器自动锁定(需要解锁密钥才能启动已停止的管理器)
--availability string 节点的可用性(“active”|“pause”|“drain”)(默认为“active”)
--cert-expiry duration 节点证书的有效期(ns | us | ms | s | m | h)(默认为2160h0m0s)
--data-path-addr string 用于数据路径流量的地址或接口(格式:<ip | interface>)
--default-addr-pool ipNetSlice CIDR格式的默认地址池(默认为[])
--default-addr-pool-mask-length uint32 uint32默认地址池子网掩码长度(默认为24)
--dispatcher-heartbeat duration Dispatcher心跳周期(ns | us | ms | s | m | h)(默认为5s)
--external-ca external-ca 一个或多个证书签名端点的规范
--force-new-cluster 从当前状态创建新集群
--listen-addr node-addr 监听地址(格式:<ip | interface> [:port])(默认为0.0.0.:)
--max-snapshots uint uint要保留的其他Raft快照数
--snapshot-interval uint uint Raft快照之间的日志条目数(默认10000)
--task-history-limit int int任务历史记录保留限制(默认值为5)

需要说明的是节点可用性的三种状态:
  • Active:集群中该Node可以被指派TASK;
  • Pause:集群中该Node不可以被指派新的Task,但是其它已经存在的TASK保持运行;
  • Drain:集群中该Node不可以被指派新的Task,Swarm Scheduler停掉已经存在的Task;

下面具体代码:

[root@centos003 ~]# docker swarm init --advertise-addr 129.204.16.68
Swarm initialized: current node (vsxiq5bqs1htj12wv7jdths7m) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN--0pnmvu8zc31j1fnl3qtb3xsakgdnraiuxvzw7zax4kiaw8mefy-dbk5n56wwa03gov4dwgsrqskp 129.204.16.68: To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

上面–advertise-addr选项指定Manager Node会publish它的地址为192.168.1.107,后续Worker Node加入到该Swarm集群,必须要能够访问到Manager的该IP地址。
该结果中给出了后续操作引导信息,告诉我们如何将Worker Node加入Swarm集群中.

2.加入节点

查看帮助信息:

[root@centos003 ~]# docker swarm join --help

Usage:    docker swarm join [OPTIONS] HOST:PORT

Join a swarm as a node and/or manager

Options:
--advertise-addr string 广播地址(格式:<ip | interface> [:port])
--availability string 节点的可用性(“active”|“pause”|“drain”)(默认为“active”)
--data-path-addr string 用于数据路径流量的地址或接口(格式:<ip | interface>)
--listen-addr node-addr 监听地址(格式:<ip | interface> [:port])(默认为0.0.0.:)
--token string 用于进入群体的令牌

加入test节点:

[root@test ~]# docker swarm join --token SWMTKN--0pnmvu8zc31j1fnl3qtb3xsakgdnraiuxvzw7zax4kiaw8mefydbk5n56wwa03gov4dwgsrqskp 129.204.16.68:
This node joined a swarm as a worker.

加入test2节点:

[root@test2 ~]# docker swarm join --token SWMTKN--0pnmvu8zc31j1fnl3qtb3xsakgdnraiuxvzw7zax4kiaw8mefydbk5n56wwa03gov4dwgsrqskp 129.204.16.68:
This node joined a swarm as a worker.

对于token后面的一长串字符是集群初始化的时候生成的令牌,每个想要加入这个集群的机器都需要拿着这个令牌才能加入到该集群.

可以通过docker node查看当前集群的所有节点:

[root@centos003 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
vsxiq5bqs1htj12wv7jdths7m * centos003 Ready Active Leader 18.09.
yjaslsxqfnvpq8zjvjpdabi7x test Ready Active 18.09.
poyqgaqkc1byucsa5q2rppck2 test2 Ready Active 18.09.

名词解释:
  • ID:swarm会为集群中的每台机器分配一个唯一ID;
  • HOSTNAME:主机名
  • STATUS:当前状态
  • AVAILABILITY:节点的可用性
  • MANAGER STATUS:是否是管理节点
  • ENGINE:Docker的版本

二、节点管理

通过查看帮助信息可以知道节点的相关操作:

[root@centos003 ~]# docker node --help

Usage:    docker node COMMAND

Manage Swarm nodes

Commands:
demote 将一个或多个管理节点降级
inspect 显示一个或多个节点的详细信息
ls 列出Swarm集群中的所有节点
promote 将Swarm中的一个或多个节点升级为管理节点
ps 列出一个或多个节点上运行的任务,默认为当前节点
rm 从集群中删除一个或多个节点
update 更新节点 运行 'docker node COMMAND --help' 命令可以查看更多节点的相关信息

Swarm支持设置一组Manager Node,通过支持多Manager Node实现HA。
那么这些Manager Node之间的状态的一致性就非常重要了,多Manager Node的Warm集群架构,如下图所示(出自Docker官网):

通过上图可以看出,Swarm使用了Raft协议来保证多个Manager之间状态的一致性.
基于Faft协议,Mananger Node具有一定的容错功能,假设Swarm集群中有N个Manager Node,那么整个集群可以容忍最多(N-1)/2个节点失效,如果是一个三个Manager Node的Swarm集群,最多只能容忍一个Manager Node挂掉.

下面是对一些常规操作的解释:

1.节点更新

查看帮助信息:

[root@centos003 ~]# docker node update --help

Usage:    docker node update [OPTIONS] NODE

Update a node

Options:
--availability string 节点的可用性(“active”|“pause”|“drain”)
--label-add list 添加或更新节点标签(key = value)
--label-rm list 删除节点标签(如果存在)
--role string 节点的角色(“worker”|“manager”)

(1)修改节点的可用性

[root@centos003 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
vsxiq5bqs1htj12wv7jdths7m * centos003 Ready Active Leader 18.09.
yjaslsxqfnvpq8zjvjpdabi7x test Ready Active 18.09.
poyqgaqkc1byucsa5q2rppck2 test2 Ready Active 18.09.

将test可用性修改为pasue,返回主机名:

[root@centos003 ~]# docker node update --availability "pause" test
test

再次查看状态信息:

[root@centos003 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
vsxiq5bqs1htj12wv7jdths7m * centos003 Ready Active Leader 18.09.
yjaslsxqfnvpq8zjvjpdabi7x test Ready Pause 18.09.
poyqgaqkc1byucsa5q2rppck2 test2 Ready Active 18.09.

常见的变更操作:
  • 设置Manager Node只具有管理功能
  • 对服务进行停机维护,可以修改AVAILABILITY为Drain状态
  • 暂停一个Node,然后该Node就不再接收新的Task
  • 回复一个不可用或暂停的Node

(2)标签操作

每个Node的主机配置情况可能不同,比如有的适合运行CPU密集型应用,有的适合运行IO密集型应用,
Swarm支持给每个Node添加标签元数据,这样可以根据Node的标签,来选择性地调度某个服务部署到期望的一组Node上。

添加或者更新标签:

[root@centos003 ~]# docker node update --label-add author=kebi test
test

可以通过docker node inspect 命令来查看标签信息

删除节点标签:

[root@centos003 ~]# docker node update --label-rm author test
test

(3)角色操作

[root@centos003 ~]# docker node update --role "manager" test
test
[root@centos003 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
vsxiq5bqs1htj12wv7jdths7m * centos003 Ready Active Leader 18.09.0
yjaslsxqfnvpq8zjvjpdabi7x test Ready Pause Reachable 18.09.0
poyqgaqkc1byucsa5q2rppck2 test2 Ready Active 18.09.0

  

2.提权/降权

Usage: docker node demote/promote NODE [NODE...]
目前集群的状态信息:

[root@centos003 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
vsxiq5bqs1htj12wv7jdths7m * centos003 Ready Active Leader 18.09.
yjaslsxqfnvpq8zjvjpdabi7x test Ready Active 18.09.
poyqgaqkc1byucsa5q2rppck2 test2 Ready Active 18.09.

将test升级为manager节点:

3.查看节点任务

查看帮助信息:

查看帮助信息:
[root@centos003 ~]# docker node ps --help Usage: docker node ps [OPTIONS] [NODE...] List tasks running on one or more nodes, defaults to current node Options:
-f, --filter filter 过滤输出
--format string 使用Go模板打印任务
--no-resolve 不将ID映射到名称
--no-trunc 不截断输出
-q, --quiet 仅显示任务ID

示例:

[root@centos003 ~]# docker node ps test
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
e78xw9zleb9n myredis. redis:latest test Running Running minutes ago

4.查看节点信息

查看帮助信息:

[root@centos003 ~]# docker node ls --help

Usage:    docker node ls [OPTIONS]

List nodes in the swarm

Aliases:
ls, list Options:
-f, --filter filter 过滤输出
--format string 使用Go模板打印任务
-q, --quiet 仅显示任务ID

三、服务管理

在Swarm集群上部署服务,必须在Manager Node上进行操作。
先说明一下Service、Task、Container(容器)这个三个概念的关系,如下图(出自Docker官网)非常清晰地描述了这个三个概念的含义:

在Swarm mode下使用Docker,可以实现部署运行服务、服务扩容缩容、删除服务、滚动升级等功能。
Docker服务的功能比较丰富,通过查看帮助信息可以很清楚的到它有那些操作。

[root@centos003 ~]# docker service --help

Usage:    docker service COMMAND

Manage services

Commands:
create 创建一个新的服务
inspect 显示一个或多个服务的详细信息
logs 获取服务或任务的日志
ls 列出服务
ps 列出一个或多个服务的任务
rm 删除一项或多项服务
rollback 还原对服务配置的更改
scale 缩放一个或多个复制的服务
update 更新服务 Run 'docker service COMMAND --help' for more information on a command.

下面是部分命令的讲解:

1.创建服务

[root@centos003 ~]# docker service create --replicas  --name myredis redis
y36sco45lvt28zotx6m7owzh4
overall progress: out of tasks
/: running [==================================================>]
/: running [==================================================>]
verify: Service converged

可以通过docker service ls来查看已经创建的服务。

[root@centos003 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
y36sco45lvt2 myredis replicated / redis:latest

2.扩容服务

Docker Swarm支持服务的扩容缩容,Swarm通过 --mode
选项设置服务类型,提供了两种模式:
  一种是replicated,我们可以指定服务Task的个数(也就是需要创建几个冗余副本),这也是Swarm默认使用的服务类型;
  另一种是global,这样会在Swarm集群的每个Node上都创建一个服务。

格式:
  docker service scale 服务ID=服务Task总数

[root@centos003 ~]# docker service scale myredis=
myredis scaled to
overall progress: out of tasks
/: running [==================================================>]
/: running [==================================================>]
/: running [==================================================>]
verify: Service converged

通过docker service ps可以查看各个副本的状况。

ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS
wxufrk2enzjo myredis. redis:latest test2 Running Running minutes ago
suhfn7azj6da myredis. redis:latest centos003 Running Running minutes ago
e78xw9zleb9n myredis. redis:latest test Running Running about a minute ago

docker——三剑客之Docker swarm的更多相关文章

  1. Docker 三剑客之 Docker Swarm

    上一篇:Docker 三剑客之 Docker Compose 阅读目录: Docker Machine 创建 Docker 主机 Docker Swarm 配置集群节点 Docker Service ...

  2. Docker 三剑客之 Docker Swarm(基于 overlay 组网通信)

    相关文章:Docker 三剑客之 Docker Swarm 这一篇主要是对 Docker Swarm 的完善,增加基于 overlay 组网通信,以便 Docker 容器可以跨主机访问. 不同主机间的 ...

  3. Docker(五):Docker 三剑客之 Docker Machine

    上篇文章Docker(四):Docker 三剑客之 Docker Compose介绍了 Docker Compose,这篇文章我们来了解 Docker Machine . Docker Machine ...

  4. Docker三剑客之Docker Swarm

    一.什么是Docker Swarm Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/docker/s ...

  5. Docker(六):Docker 三剑客之 Docker Swarm

    实践中会发现,生产环境中使用单个 Docker 节点是远远不够的,搭建 Docker 集群势在必行.然而,面对 Kubernetes, Mesos 以及 Swarm 等众多容器集群系统,我们该如何选择 ...

  6. docker——三剑客之Docker Machine

    Docker Machine是Docker官方三剑客项目之一,负责使用Docker的第一步,在多种平台上快速安装Docker环境.它支持多种平台,让用户在很短时间内搭建一套Docker主机集群. Ma ...

  7. Docker三剑客之Docker Compose

    一.什么是Docker Compose Compose 项目是Docker官方的开源项目,负责实现Docker容器集群的快速编排,开源代码在https://github.com/docker/comp ...

  8. Docker三剑客之Docker Machine

    一.什么是Docker Machine Docker Machine 是Docker官方编排项目之一,使用go语言编写的,使用不同引擎在多种平台上快速的安装Docker环境,开源地址:https:// ...

  9. Docker(四):Docker 三剑客之 Docker Compose

    前两篇文章我们介绍了 Dockerfile 的使用Docker(二):Dockerfile 使用介绍,我们知道使用一个 Dockerfile 模板文件可以定义一个单独的应用容器,如果需要定义多个容器就 ...

随机推荐

  1. 《R语言入门》语言及环境简单介绍

    简单介绍 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/diss ...

  2. shell基础篇(十)shell脚本的包含

    前记 写到这里:shell中基础差不多已经讲完了.希望你已经对shell有了一个基本了解.你可能跃跃欲试,要写一些程序练习一下.这会对你很有好处.建议大家去chinaunix去学习:我是li0924. ...

  3. Zookeeper(一)-- 简介以及单机部署和集群部署

    一.分布式系统 由多个计算机组成解决同一个问题的系统,提高业务的并发,解决高并发问题. 二.分布式环境下常见问题 1.节点失效 2.配置信息的创建及更新 3.分布式锁 三.Zookeeper 1.定义 ...

  4. easyui 时间定格为 时分

    $.fn.datetimebox.defaults.formatter = function (date) { console.log('dt formatting ' + date); if (!( ...

  5. 多线程的学习与GDI的学习

    今天又是一周的周五,感觉过的好快,我感觉不是期盼周末的到来,而是感觉现在已经习惯啦每天坐在这里敲代码,其实我是一个性格非常开朗的女生,现在不知道为什么感觉默默地坐在自己位置上面敲代码成为了我习以为常的 ...

  6. openstack将本地实例迁移至ceph存储中

    需求: 最近在openstack上线了ceph存储,创建虚拟机和云硬盘都基于ceph卷进行存储和创建,但是之前openstack用的是本地存储,创建的所有实例都在本地文件中,当实例重启之后,opens ...

  7. php array key 的存储规则

    刚刚写程序遇到php数组取值的问题,发现字符串和数字取出来的是一样的. key 可以是 integer 或者string.value 可以是任意类型. 此外 key 会有如下的强制转换: 包含有合法整 ...

  8. Linux 2.6.16 TCP连接速度异常的问题分析

    版权声明:本文由余子军原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/104 来源:腾云阁 https://www.qclo ...

  9. [算法] N 皇后

    N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行.同一列.同一斜线上的皇后都会自动攻击). 一. 求解N皇后问题是算法中回溯法应用的一个经典案例 回溯算 ...

  10. EDT改成CST

    功能说明:显示文字.语 法:echo [-ne][字符串]或 echo [--help][--version]补充说明:echo会将输入的字符串送往标准输出.输出的字符串间以空白字符隔开, 并在最后加 ...