Docker Swarm 是 Docker 官方项目之一,提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案。它是Docker公司推出的官方容器集群平台,基于Go语言实现,代码在https://github.com/docker/swarm,使用它,用户可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。
Docker Swarm是原生支持Docker集群管理的工具。它可以把多个Docker主机组成的系统转换为单一的虚拟Docker主机,使得容器可以组成跨主机的子网网络。 在很多台机器上部署Docker,组成一个Docker集群,并把整个集群的资源抽象成资源池,使用者部署Docker应用的时候,只需要将应用交给Swarm,Swarm会根据整个集群资源的使用情况来分配资源给部署的Docker应用,可以将这个集群的资源利用率达到最大。
Swarm主从架构
Swarm集群通过Raft协议在多个管理节点中实现共识,工作节点上运行agent接受管理节点的统一管理和任务分配。
基本概念
1、Swarm集群
Swarm集群为一组被统一管理起来的Docker主机。集群是Swarm所管理的对象,这些主机通过Docker引擎的Swarm模式相互沟通,其中部分主机可能作为管理节点响应外部的管理请求,其他主机作为工作节点来实际运行Docker容器。
当用户使用Swarm集群时,首先定义一个服务(指定状态,复制个数,网络,存储,端口等)然后通过管理节点发出启动服务的指令,管理节点随后会按照指定的服务规则进行调度,在集群中启动起来整个服务,并确保它正常运行。
2、节点
节点(Node)是Swarm集群中最小的资源单位,每个节点实际上都是一台Docker主机。
Swarm集群中节点分为两种:
- 管理节点(Manager):负责响应外部对集群的操作请求,并维持集群中资源,分发任务给工作节点。同时,多个管理节点之间通过Raft协议构成共识。一般推荐每个集群设置5-7个管理节点。
- 工作节点(Worker):负责执行管理节点安排的具体任务。默认情况下,管理节点自身也同时是工作节点。用户可以通过docker node promote 命令来提升一个工作节点为管理节点;或者通过docker node demote命令来将一个管理节点降级为工作节点。
3、服务和任务
任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。
服务 (Services) 是指一组任务的集合,服务定义了任务的属性。
服务有两种模式:
- replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
- global services 每个工作节点上运行一个任务
两种模式通过 docker service create 的 –mode 参数指定。
5、服务的外部访问
Swarm集群中的服务要被集群外部访问,必须要能允许任务的响应端口映射出来。Swarm中支持入口负载均衡(ingress load balancing)的映射模式,该模式下,每个服务都会被分配一个公开端口,该端口在集群中任意节点上都可以访问到,并被保留给改服务。当有请求发送到任意节点的公开端口时,该节点若并没有实际执行服务相关的容器,则会通过路由机制将请求转发给实际执行了服务容器的工作节点。
创建Swarm集群
1、使用swarm
docker 1.12+ 的版本自带Swarm模式的相关功能,使用 234 、230主机作为管理节点(同时也具备工作节点功能)。
Swarm集群主要操作命令:
- swarm init: 在管理节点上创建一个集群
- node list:列出集群中的节点信息
- swarm join:加入一个新的节点到已有集群中
- swarm update:更新一个swarm集群
- swarm leave: 离开一个集群
- docker service 命令等
2、创建集群
#初始化集群,会自动把当前节点设置为管理节点 [[email protected] ~]# docker swarm init --advertise-addr 192.168.1.234 Swarm initialized: current node (dn76b8r2c01iqikn3lseeerpz) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-3wmqfhzq4u4gvizdbx7yriwz4vt1otppph3fsudlmczmzydpsv-efn4v6v2jiu80p5ejmee v0qpb 192.168.1.234:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. #查看swarm worker的连接令牌 docker swarm join-token worker #查看swarm manager的连接令牌 docker swarm join-token manager
注意提示返回的token就是节点加入集群需要的信息。这里是两个管理节点 按照提示执行’docker swarm join-token manager’ 查看返回的token,在Host2中执行加入集群。
3、加入集群并成为管理节点
#查看管理节点的token [[email protected] ~]# docker swarm join-token manager To add a manager to this swarm, run the following command: docker swarm join --token SWMTKN-1-3wmqfhzq4u4gvizdbx7yriwz4vt1otppph3fsudlmczmzydpsv-11xvmfwn8sbchpohn 66bdyxch 192.168.1.234:2377 #在Host2中加入集群 [[email protected] ~]# docker swarm join --token SWMTKN-1-3wmqfhzq4u4gvizdbx7yriwz4vt1otppph3fsudlmczmzydpsv -11xvmfwn8sbchpohn66bdyxch 192.168.1.34:2377 This node joined a swarm as a manager.
4、查看集群节点信息
[[email protected] ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION dn76b8r2c01iqikn3lseeerpz host1 Ready Active Leader 18.09.0 1a8u2l2hvze8m53vbsrjknco8 * host2 Ready Active Reachable 18.09.0
5、升降级节点
#将节点升级为manager docker node promote host2 #将节点降级为worker docker node demote host2
部署集群服务
1、在集群中创建一个nginx服务,副本数为2,映射端口8086>80,镜像为nginx:1.14.2-alpine
docker service create --replicas 2 --name nginx -p 8086:80 nginx:1.14.2-alpine overall progress: 2 out of 2 tasks 1/2: running [==================================================>] 2/2: running [==================================================>] verify: Service converged #查看服务信息 [[email protected] ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS ni3oqz5un7oe nginx replicated 2/2 nginx:1.14.2-alpine *:8086->80/tcp
2、列出服务的任务信息
[[email protected] ~]# docker service ps nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS uit9jtrt6jno nginx.1 nginx:1.14.2-alpine host1 Running Running 37 seconds ago mpsqts6y60s3 nginx.2 nginx:1.14.2-alpine host2 Running Running 15 seconds ago
3、使用scale命令参数弹性伸缩服务个数。
#设置nginx服务个数为4个 [[email protected] ~]# docker service scale nginx=4 nginx scaled to 4 overall progress: 4 out of 4 tasks 1/4: running 2/4: running 3/4: running 4/4: running verify: Service converged #查看服务信息 [[email protected] ~]# docker service ps nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE uit9jtrt6jno nginx.1 nginx:1.14.2-alpine host1 Running Running 9 hours ag f4u4gbsepd6b nginx.2 nginx:1.14.2-alpine host2 Running Running 7 hours ago mpsqts6y60s3 \_ nginx.2 nginx:1.14.2-alpine host2 Shutdown Complete 7 hours ago lv6vkwnvzv63 nginx.3 nginx:1.14.2-alpine host1 Running Running 13 seconds ago ad635fz3d4fp nginx.4 nginx:1.14.2-alpine host2 Running Running 13 seconds ago
4、测试访问http://192.168.1.234:8086 或者http://192.168.1.230:8086查看服务是否正常
[[email protected] ~]# curl http://192.168.1.230:8086 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> .......................................
5、服务镜像升级与回滚
#将nginx服务升级到nginx:1.15.8-alpine版本 [[email protected] ~]# docker service update --image nginx:1.15.8-alpine --update-parallelism 2 --update-delay 10s nginx #回滚 [[email protected] ~]# docker service update --rollback nginx
–update-parallelism: 同时更新的最大任务数量
–update-delay:更新服务的时间间隔
Docker service 命令列表
命令 | 描述 |
docker service create | 创建一个新服务 |
docker service inspect | 显示一个或多个服务的详细信息 |
docker service logs | 获取服务或任务的日志 |
docker service ls | 列出服务列表 |
docker service ps | 列出一个或多个服务的任务 |
docker service rm | 删除一个或多个服务 |
docker service rollback | 还原对服务的更改 |
docker service scale | 伸缩服务的数量 |
docker service update | 更新服务 |
Docker官方参考文档:docker swarm