DOCKER SWARM

DOCKER SWARM

前言

实践中会发现,生产环境中使用单个 Docker 节点是远远不够的,搭建 Docker 集群势在必行。然而,面对 Kubernetes, Mesos 以及 Swarm 等众多容器集群系统,我们该如何选择呢?它们之中,Swarm 是 Docker 原生的,同时也是最简单,最易学,最节省资源的,比较适合中小型公司使用。

一、Docker Swarm介绍

Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令。目前,Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具。它可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。

Docker Swarm 是一个为 IT 运维团队提供集群和调度能力的编排工具。用户可以把集群中所有 Docker Engine 整合进一个「虚拟 Engine」的资源池,通过执行命令与单一的主 Swarm 进行沟通,而不必分别和每个 Docker Engine 沟通。在灵活的调度策略下,IT 团队可以更好地管理可用的主机资源,保证应用容器的高效运行。

swarmcluster.png

二、相关概念

1、节点

运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) 。节点分为管理 (manager) 节点和工作 (worker) 节点。

管理节点用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。

工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。下图展示了集群中管理节点与工作节点的关系。

swarm_manager_worker.png

2、服务和任务

任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。
服务 (Services) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式:

  • replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
  • global services 每个工作节点上运行一个任务

两种模式通过 docker service create 的 --mode 参数指定。下图展示了容器、任务、服务的关系。

swarm_services.png

三、创建Swarm集群

首先我们需要准备至少两台主机,这里我准备了三台,一台manager节点,两台worker节点。

1、初始化节点(1个manager、两个worker)

docker swarm init --advertise-addr 192.168.99.100

后面的ip为本机地址。运行后会得到如下结果:

Swarm initialized: current node (j0o7sykkvi86xpc00w71ew5b6) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-47z6jld2o465z30dl7pie2kqe4oyug4fxdtbgkfjqgybsy4esl-8r55lxhxs7ozfil45gedd5b8a 192.168.99.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

可以看到上面的提示,意思是本机已经初始化为manager节点,可以在其他两台需要加入到这个manager节点的主机上运行以下命令变为worker节点。

docker swarm join --token SWMTKN-1-47z6jld2o465z30dl7pie2kqe4oyug4fxdtbgkfjqgybsy4esl-8r55lxhxs7ozfil45gedd5b8a 192.168.99.100:2377

2、查看节点信息

在主节点上运行以下命令即可查看swarm管理的节点:

docker node ls

可以得到如下结果:

swarmnode.jpg

四、部署服务集群

我们使用 docker service 命令来管理 Swarm 集群中的服务,该命令只能在管理节点运行。还可以使用compose.yml文件与docker stack命令结合的方式部署。

下面以redis为例,我们首先在2台机子上部署,然后进行扩容到3台。

1、部署2台机子

docker service create --replicas=2 --name=redis redis

可以看到如下结果,两个任务正在进行当中:

servicecreate.jpg

查看创建的服务:

docker service ls

servicels.jpg

可以看到replicas的数值为2/2,说明两台机子部署成功,我们如果想要查看部署的情况,可以使用:

docker service ps redis

serviceps.jpg

可以看到分别部署的节点名称,节点名称为宿主机的hostname。

2、进行扩容,部署3台机子

docker service update redis --replicas=3

serviceupdate.jpg

再次查看详情可以看到如下结果:

serviceupdatels.jpg

可以看到扩容只需一个命令即可。

3、删除集群服务

docker service rm redis

五、退出集群

在worker节点执行:

docker swarm leave

如果是manager节点则需要加上--force

docker swarm leave --force

六、总结

通过对 Swarm 的学习,强烈感觉到自动化水平扩展的魅力,这样在公司流量爆发的时候,只需要执行一个命令就可以完成实例上线。如果再根据公司的业务流量做自动化控制,那就真正实现了完全自动的动态伸缩。当然如果配合其他工具例如jenkins、git等可以实现一键智能集群部署。