简介
Swarm是使用 SwarmKit 构建的 Docker 引擎内置(原生)的集群管理和编排工具。Swarm mode 内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得 Docker 原生的Swarm集群具备与 Mesos、Kubernetes 竞争的实力。
swarm是一个集群概念,所以就必须会有管理节点和工作节点的概念,这是一个集群所必须有的东西。
- 管理节点用于
Swarm集群的管理,docker swarm命令基本只能在管理节点执行(节点退出集群命令docker swarm leave可以在工作节点执行)。一个Swarm集群可以有多个管理节点,但只有一个管理节点可以成为leader,leader通过raft协议实现。 - 工作节点是任务执行节点,管理节点将服务 (
service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。

同时还有2个概念需要理解,服务和任务:
- 任务 (
Task)是Swarm中的最小的调度单位,目前来说就是一个单一的容器。 - 服务 (
Services) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式,两种模式通过docker service create的--mode参数指定。replicated services按照一定规则在各个工作节点上运行指定个数的任务。global services每个工作节点上运行一个任务

集群搭建及使用
需要准备2台机器,一台是manager节点,IP是192.168.137.66,另一台是work节点,IP是192.168.137.55。
初始化
首先进行初始化集群操作:
在manager上面操作:
1 | [root@localhost ~]# docker swarm init --advertise-addr 192.168.137.66 |
运行 docker swarm init --advertise-addr之后,会就提示如果有work节点需要加入到这个集群里面的话,就可以复制以下的这一行命令,主要是—token。
在work节点操作:
1 | [root@localhost ~]# docker swarm join --token SWMTKN-1-1faujb51zu8p1b7uw8whplp97hnf6rehjgx536koqkjyixodg9-9yjq4lgtxpyu9hrknqbejg62h 192.168.137.66:2377 |
很简单,复制命令执行一下就可以了。
在切回到manager上,使用 docker node ls 查看节点的情况,该命令只能在管理节点运行。
1 | [root@localhost ~]# docker node ls |
部署服务
我们使用 docker service 命令来管理 Swarm 集群中的服务,该命令只能在管理节点运行。如下:
1 | [root@localhost ~]# docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine |
按上面的规划,只有一个worker节点,但实际上,manager节点也是可以部署任务和服务的,所以也算是一个worker节点,自行就加入了。使用curl工具来访问,证明服务部署地没有异常。
查看运行情况
使用 docker service ls 查看当前集群运行的服务,使用 docker service ps 来查看某个服务的详情。 从 docker service ps nginx 中可以看到,运行了3个副本,在remote 这个worker节点上面运行了2个nginx的任务。
1 | [root@localhost ~]# docker service ls |
服务伸缩
我们可以使用 docker service scale 对一个服务运行的容器数量进行伸缩。
1 | [root@localhost ~]# docker service scale nginx=2 |
更新版本
由于我们之使用的nginx是1.13版本,很老了,需要升级下。使用 --image 选项进行服务镜像的更新:
1 | [root@localhost ~]# docker exec -it nginx.2.dqr6ytgmo6uvsr3b5mu8i2jlk nginx -v |
回退版本
有更新就有回退,使用 docker service rollback :
1 | [root@localhost ~]# docker service ps nginx |
从升级以及回退中可以看到,docker server都是类似git,会保留历史版本。
删除服务
使用 docker service rm 来从 Swarm 集群移除某个服务。
1 | [root@localhost ~]# docker service rm nginx |
docker service 还有另外2个功能,一是密钥功能,二是管理配置文件功能,有兴趣的同学请查看https://yeasy.gitbooks.io/docker_practice/content/swarm_mode/config.html ,自行练习。这几个概念跟K8S很接近,要深刻理解 之。
使用compose文件
正如之前使用 docker-compose.yml 来一次配置、启动多个容器,在 Swarm 集群中也可以使用 compose 文件 (docker-compose.yml) 来配置、启动多个服务,docker使用docker stack命令来运行compose文件。
准备如下yaml文件,运行2个wordpress服务,一个db服务,一个visualizer服务,后2台服务都指定了运行在magager节点上:
1 | [root@localhost wordpress]# cat docker-compose.yml |
部署和查看:
1 | [root@localhost wordpress]# docker stack deploy -c docker-compose.yml wp |
上面有部署了一个visualizer服务,这是查看集群状态,在浏览器上面访问任意一个节点 ip + 8080就可以看到了。

要移除服务,使用 docker stack down
1 | [root@localhost wordpress]# docker stack down wp |
跟docker-compose类似,该命令不会移除服务所使用的数据卷,如果你想移除数据卷请使用 docker volume rm。