Docker Swarm简介
Docker Swarm集群搭建
Docker Swarm服务
Docker Swarm服务日志
Docker Swarm常用命令
Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源。
Swarm 和 Kubernetes 比较类似,但是更加轻,具有的功能也较 kubernetes 更少一些。
Docker Swarm 包含两方面:一个企业级的 Docker 安全集群,以及一个微服务应用编排引擎。
集群方面,Swarm 将一个或多个 Docker 节点组织起来,使得用户能够以集群方式管理它们。
Swarm 默认内置有加密的分布式集群存储(encrypted distributed cluster store)、加密网络(Encrypted Network)、公用TLS(Mutual TLS)、安全集群接入令牌 Secure Cluster Join Token)以及一套简化数字证书管理的 PKI(Public Key Infrastructure)。我们可以自如地添加或删除节点。
编排方面,Swarm 提供了一套丰富的 API 使得部署和管理复杂的微服务应用变得易如反掌。通过将应用定义在声明式配置文件中,就可以使用原生的 Docker 命令完成部署。
此外,甚至还可以执行滚动升级、回滚以及扩缩容操作,同样基于简单的命令即可完成。
以往,Docker Swarm 是一个基于 Docker 引擎之上的独立产品。自 Docker 1.12 版本之后,它已经完全集成在 Docker 引擎中,执行一条命令即可启用。到 2018 年,除了原生 Swarm 应用,它还可以部署和管理 Kubernetes 应用
从集群角度来说,一个 Swarm 由一个或多个 Docker 节点组成。这些节点可以是物理服务器、虚拟机、树莓派(Raspberry Pi)或云实例。唯一的前提就是要求所有节点通过可靠的网络相连。
节点会被配置为管理节点(Manager)或工作节点(Worker)。管理节点负责集群控制面(Control Plane),进行诸如监控集群状态、分发任务至工作节点等操作。工作节点接收来自管理节点的任务并执行
综上所述,从概括性的视角来看 Swarm,如下图所示
接下来通过实例演示一下如何使用 Swarm 来创建安全的集群。
实例中包含 3 个管理节点和 3 个工作节点,如下图所示,可以根据需要自行调整管理节点和工作节点的数量、名称和 IP。
每个节点都需要安装 Docker,并且能够与 Swarm 的其他节点通信。
如果配置有域名解析就更好了,这样在命令的输出中更容易识别出节点,也更有利于排除故障。
在网络方面,需要在路由器和防火墙中开放如下端口。
如果满足以上前提,就可以着手开始搭建 Swarm 集群了
搭建 Swarm 的过程有时也被称为初始化 Swarm,大体流程包括初始化第一个管理节点 -> 加入额外的管理节点 -> 加入工作节点 -> 完成
不包含在任何 Swarm 中的 Docker 节点,称为运行于单引擎(Single-Engine)模式。一旦被加入 Swarm 集群,则切换为 Swarm 模式,如下图所示
在单引擎模式下的 Docker 主机上运行 docker swarm init 会将其切换到 Swarm 模式,并创建一个新的 Swarm,将自身设置为 Swarm 的第一个管理节点。
以下的步骤会将 mgr1 切换为 Swarm 模式,并初始化一个新的 Swarm。接下来将 wrk1、wrk2 和 wrk3 作为工作节点接入,自动将它们切换为Swarm模式
然后将 mgr2 和 mgr3 作为额外的管理节点接入,并同样切换为 Swarm 模式。最终有 6 个节点切换到 Swarm 模式,并运行于同一个 Swarm 中。
请注意,工作节点和管理节点的接入命令中使用的接入 Token(SWMTKN...)是不同的。因此,一个节点是作为工作节点还是管理节点接入,完全依赖于使用了哪个 Token。接入 Token 应该被妥善保管,因为这是将一个节点加入 Swarm 的唯一所需!
Linux manager1
[ucmed@localhost ~]$ docker swarm init
Swarm initialized: current node (tloryqj3u3r92eioydw9ao1ee) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-57uxw1a0jtyi7rseo1wn9s2ohmzoequd4g09hd7qc0qac1hsij-3yefsyacls7vv0xvmwcw6wx0n 192.168.3.149:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
[ucmed@localhost ~]$
[ucmed@elasticsearch ~]$ docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-098joas9jwdlrxw7pgmjfrudw4hellxy7410z6lktd0zcwja04-796y99it1j27sgef1hcylodl5 192.168.3.148:2377
Linux Node2
[ucmed@localhost ~]$ docker swarm join --token SWMTKN-1-098joas9jwdlrxw7pgmjfrudw4hellxy7410z6lktd0zcwja04-db1pubn86kevhw33ml3ir9k1a 192.168.3.148:2377
This node joined a swarm as a worker.
[ucmed@localhost ~]$
Linux manager2
[ucmed@localhost ~]$ docker swarm join --token SWMTKN-1-098joas9jwdlrxw7pgmjfrudw4hellxy7410z6lktd0zcwja04-796y99it1j27sgef1hcylodl5 192.168.3.148:2377
This node joined a swarm as a manager.
Swarm 的管理节点内置有对 HA 的支持。这意味着,即使一个或多个节点发生故障,剩余管理节点也会继续保证 Swarm 的运转。
这一过程如下图所示。步骤 ① 指命令从一个远程的 Docker 客户端发送给一个管理节点;步骤 ② 指非主节点将命令转发给主节点;步骤 ③ 指主节点对 Swarm 执行命令。
关于 HA,有以下两条最佳实践原则。
尽管内置有如此多的原生安全机制,重启一个旧的管理节点或进行备份恢复仍有可能对集群造成影响。
在某个 Swarm 管理节点上运行如下命令。
$ docker swarm init --autolock
$ docker swarm update --autolock=true
$ service docker restart
可以到其他管理节点执行 docker node ls 命令,会发现重启的管理节点会显示 down 以及 unreachable
$ docker node ls
$ docker swarm unlock
使用 docker service create 命令创建一个新的服务。
$ docker service create --name web-fe \
-p 8080:8080 \
--replicas 5 \
nigelpoulton/pluralsight-docker-ci
假如运行有 web-fe 副本的某个工作节点宕机了,则 web-fe 的实际状态从 5 个副本降为 4 个,从而不能满足期望状态的要求。Docker 变回启动一个新的 web-fe 副本来使实际状态与期望状态保持一致。这一特性功能强大,使得服务在面对节点宕机等问题时具有自愈能力。
1) 查看服务
$ docker service ls
$ docker service inspect --pretty web-fe
2) 副本服务 vs 全局服务
服务的默认复制模式(Replication Mode)是副本模式(replicated)。
这种模式会部署期望数量的服务副本,并尽可能均匀地将各个副本分布在整个集群中。
另一种模式是全局模式(global),在这种模式下,每个节点上仅运行一个副本。
docker service create --mode global 参数来部署一个全局服务
3) 服务的扩缩容
$ docker service scale web-fe=5
$ docker service ls
$ docker service ps web-fe
4) 删除服务
$ docker service rm web-fe
5) 滚动升级
$ docker network create -d overlay uber-net
[ucmed@elasticsearch ~]$ docker network create -d overlay uber-net
22rmeauxy4hbkmf92i4ipfno4
[ucmed@elasticsearch ~]$ docker network ls
NETWORK ID NAME DRIVER SCOPE
89a9d31b4d7b apollo_default bridge local
f2daf3d63d19 host host local
yg0j3h8818ct ingress overlay swarm
70104323d167 none null local
22rmeauxy4hb uber-net overlay swarm
qnwc57bcmljl wordpress_overlay overlay swarm
该命令会创建一个名为 uber-net 的覆盖网络,接下来会将其与要创建的服务结合使用。覆盖网络是一个二层网络,容器可以接入该网络,并且所有接入的容器均可互相通信。
即使这些容器所在的 Docker 主机位于不同的底层网络上,该覆盖网络依然是相通的。本质上说,覆盖网络是创建于底层异构网络之上的一个新的二层容器网络。
如下图所示,两个底层网络通过一个三层交换机连接,而基于这两个网络之上是一个覆盖网络
推荐用法
$ docker service create --name uber-svc \
--network uber-net \
-p 80:80 --replicas 12 \
nigelpoulton/tu-demo:v1
然后,在整个 swarm 中将 80 端口暴露出来,并将其映射到 12 个容器副本的 80 端口。
$docker service create --name uber-svc --network uber-net --publish published=80,target=80,mode=host --replicas 1 nigelpoulton/tu-demo:v1
本次升级任务在将新镜像更新到 Swarm 中时采用一种阶段性的方式,每次更新两个副本,并且中间间隔 20s。
$docker service update \
--image nigelpoulton/tu-demo:v2 \
--update-parallelism 2 \
--update-delay 20s uber-svc
$ docker service inspect --pretty uber-svc
[ucmed@elasticsearch ~]$ docker service logs uber-svc
命令 |
说明 |
docker swarm init |
用于创建一个新的 Swarm。执行该命令的节点会成为第一个管理节点,并且会切换到 Swarm 模式。 |
docker swarm join-token |
用于查询加入管理节点和工作节点到现有 Swarm 时所使用的命令和 Token。 |
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 logs |
用于查看服务的日志。 |
docker service rm |
用于从 Swarm 中删除某服务。该命令会在不做确认的情况下删除服务的所有副本,所以使用时应保持警惕。 |