本文所有服务均采用 docker 容器化方式部署
简单来讲,Docker 集群的实现是通过 Docker Machine 在多主机或虚拟机上创建多个 Docker Engine,在利用 Docker Swarm 以某个 Engine 作为集群的初始管理节点,其他 Engine 以管理或工作节点的方式加入,形成完成的集群环境。
使用 docker-machine 命令创建 docker 工作引擎。
参数说明:
-d:设置 Docker Engine 驱动(Mac 下默认是 virtualbox)
--virtualbox-boot2docker-url:设置驱动地址( 如果默认驱动下载很慢,可以更改国内的下载路径 )
下面创建 4 个引擎,1 个集群管理者和 3 个工作者:
- docker-machine create -d virtualbox manager1
- docker-machine create -d virtualbox worker1
- docker-machine create -d virtualbox worker2
- docker-machine create -d virtualbox worker3
查看运行结果(docker-machine ls):
- eval $(docker-machine env manager1)
查看运行结果:
- docker swarm init --advertise-addr 192.168.99.100
参数说明:
--advertise-addr:设置管理节点的对外 IP,供集群中的其他节点访问;
命令说明:
该命令会创建一个新的 swarm,以当前节点作为 swarm 的管理节点。同时生成 2 个 token (manager/worker)供其他节点加入使用( 查询 token 命令 docker swarm join-token )。
查看集群节点状况(docker node ls):
- # 连接 worker1
- eval $(docker-machine env worker1)
- # 加入 swarm
- docker swarm join \
- --token WORKER_TOKEN \
- 192.168.99.100:2377
同上,将其余两个以 worker 身份加入
查看集群节点状况( 仅可在管理节点下查看 ):
如果想要移除集群下的某个节点,可在该节点环境下,执行该命令:
- $ eval $(docker-machine env worker3)
- # 当前环境在 worker3 上
- docker swarm leave
查看集群节点状况
- # 加入 swarm
- docker swarm join \
- --token WORKER_TOKEN \
- 192.168.99.100:2377
查看集群节点状况
- docker node rm INVALID_ID
查看集群节点状况
关于 swarm 集群的搭建已经完成了,接下来就是启动服务。启动服务的模式分为:replicated 和 global。
replicated(默认方式):先在一个 node 节点上创建一个服务,通过复制的方式进行扩展,这中间涉及扩展的策略。
global:在每个 node 节点上都会创建一个服务,像 Registrator(自动注册服务) 就很适合用这种方式执行。
- docker service create --mode=global --name=web nginx
查看服务启动情况(每个节点都起了一个 web 服务):
- docker service create --name=web nginx
查看服务启动情况:
- docker service scale nginx=2
查看服务启动情况
- docker service scale nginx=3
查看服务启动情况
- docker service scale nginx=4
查看服务启动情况
- docker service scale nginx=5
查看服务启动情况
从服务的扩展可以看出,其中存在了一定的分配策略。这里采用的是默认的 Spread 策略。下面简单描述下最常用的 2 种 Spread 与 BinPack。 详细的介绍还请查看官方文档(如 filters、affinity 的使用) 。
真实场景还是得依据具体的业务来合理使用分配策略。特殊情况,还需要搭配使用 filters、affinity 来具体选择节点。 详细的介绍还请查看官方文档 。
服务的启动都是通过 manager 节点将启动服务分发给 worker 节点,而且服务的管理也是由 manager 节点来控制的。
本文主要讲述了如何使用 Docker Swarm 来做 docker 的集群管理。其中包括了集群部署、服务的启动、扩展,以及常用的分配策略。
swarm 在 docker 1.12 开始被集成进了 docker 中。相比之前版本,以 docker run swarm create 启动的方式,现节点与节点之间是通过内置的 DNS 发现机制进行通信,使用更为便捷。
最后也提一下,使用 k8s 做容器集群管理的也在多数。这里不讨论两者的好坏,如果还没用 k8s 的可以考虑使用 swarm,毕竟目前是 docker 内置的服务。
来源: http://www.tuicool.com/articles/6vAVn2y