Swarm是Docker公司推出的用来管理docker集群的平台,使用GO 语言编写的 服务编排和调度工具,代码开源路径:GitHub - docker-archive/classicswarm: Swarm Classic: a container clustering system. Not to be confused with Docker Swarm which is at https://github.com/docker/swarmkit
它是将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker API接口作为其前端的访问入口,访问不同机器上的Docker实例
Swarm内置了对Docker网络插件的支持,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务.
Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,
不需要再配置Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,调度适合的节点来运行容器 Etcd 或者 Consul 来进行服务发现配置了.Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,调度适合的节点来运行容器
即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行之后,他会收集重建集群信息
2:Docker Swarm 基本结构图Docker Client使用Swarm对 集群(Cluster)进行调度,通过发现服务来选举manager。manager是中心管理节点,各个node上运行agent接受manager的统一管理,集群会自动通过Raft协议分布式选举出manager节点,无需额外的发现服务支持,避免了单点的瓶颈问题,同时也内置了DNS的负载均衡和对外部负载均衡机制的集成支持
3:Swarm的几个概念
Swarm : 集群的管理和编排是使用嵌入docker引擎的SwarmKit,可以在docker初始化时启动swarm模式或者加入已存在的swarm
Node : 一个节点是docker引擎集群的一个实例
Service :一个服务是任务的定义,在管理机或工作节点上执行。它是群体系统的中心结构,是用户与群体交互的主体。创建服务需要指定要使用的容器镜像。
Task :任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点
docker swarm:集群管理,子命令有init, join, leave, update ,--help
docker service:服务创建,子命令有create, inspect, update, remove, tasks ,docker service--help
docker node:节点管理,子命令有accept, promote, demote, inspect, update, tasks, ls, rm ,docker node --help
node是加入到swarm集群中的一个docker引擎实体,可以在一台物理机上运行多个node,node分为:
manager(Leader、Reachable)nodes,也就是管理节点
worker nodes,也就是工作节点
manager node管理节点:执行集群的管理功能,维护集群的状态,选举一个leader节点去执行调度任务。
worker node工作节点:接收和执行任务。参与容器集群负载调度,仅用于承载task。
service服务:一个服务是工作节点上执行任务的定义。创建一个服务,指定了容器所使用的镜像和容器运行的命令。
service是运行在worker nodes上的task的描述,service的描述包括使用哪个docker 镜像,以及在使用该镜像的容器中执行什么命令。
task任务:一个任务包含了一个容器及其运行的命令。task是service的执行实体,task启动docker容器并在容器中执行任务
DockerSwarm 架构图
Swarm的调度策略 包含 Random Spread Binpack 三种
Random 随机调度分配资源
Spread 选择资源比较空闲的节点 ,服务分布比较均匀
Binpack 选择紫云比较密集的docker实例 ,减少碎片化 ,但是可能导致某个机器负载过重
4:Dcoker Swarm 集群部署准备6台机器
修改主机名命令
hostnamectl set-hostname centos701 其他机器 也一样 只需修改 后面的名称
在每台机器中 添加 hosts
vim /etc/hosts
192.168.217.129 centos701
192.168.217.130 centos702
192.168.217.131 centos703
192.168.217.132 centos704
192.168.217.133 centos705
192.168.217.134 centos706
关闭机器上的防火墙。如果开启防火墙,则需要在所有节点的防火墙上依次放行2377/tcp(管理端口)、7946/udp(节点间通信端口)、4789/udp(overlay 网络端口)端口
systemctl disable firewalld.service
systemctl stop firewalld.service
然后在每台机器都安装 docker 引擎 和 docker compose
请参考我之前的文章
Docker centos 安装_Java 码农的博客-CSDN博客
Docker Compose 示例_Java 码农的博客-CSDN博客
在 129 这台机器上执行集群初始化命令
docker swarm init --advertise-addr 192.168.217.129
然后 分别 执行
docker swarm join-token manager
docker swarm join-token worker
获取到 添加 manager 和 worker 的命令
生成的manager 命令 拷贝到 基数结尾的 机器上执行
生成的worker命令 拷贝到 偶数结尾的 机器上执行
完成之后 可以在管理节点上执行
docker node ls 查看swarm 中 集群节点的信息
带星号的表示是当前选举出来的 Leader 节点 , Reachable 是 备用的 Leader 节点
docker swarm leave -f f参数强制删除节点
docker info 查看信息
更改节点的availablity状态
swarm集群中node的availability状态可以为 active或者drain,其中:
active状态下,node可以接受来自manager节点的任务分派;
drain状态下,node节点会结束task,且不再接受来自manager节点的任务分派
docker node update --availability drain centos706
重新让节点加入集群 docker node update --availability active centos706
5:在集群中部署服务以添加 nginx 服务为例
创建网络在部署服务
docker network create -d overlay nginx_net
docker network ls
执行添加服务并指定端口和副本数
docker service create --replicas 1 --network nginx_net --name nginx_test -p 88:80 nginx
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
使用 docker service ls 查看正在运行服务的列表
docker service ps nginx_test 查看 服务在哪个节点上启动了
修改 扩展结点数量
docker service scale nginx_test=4
docker service ps nginx_test
模拟宕机 :
systemctl stop docker 在某个 worker
在使用docker node ls 和 docker service ps nginx
查看服务 发现 某个节点上的服务shutDown 并且 节点 状态为down
而之前扩展的服务将会 被转移到其他机器上
除了上面使用scale进行容器的扩容或缩容之外,还可以使用docker service update 命令
docker service update --replicas 1 nginx_test
删除 服务
假设 nginx_test 为 nginx_test 的升级的镜像
可以使用如下命令升级
docker service update --image nginx_test:new nginx_test
6: 在docker swarm 中使用 数据卷docker volume --help
docker volume create --name nginx_volume 创建数据卷
docker volume inspect nginx_volume 查看数据卷
创建新的服务并挂载nginx_volume
docker service create --replicas 3 --mount type=volume,src=nginx_volume,dst=/wl --name t_nginx -p 89:80 nginx
docker service ls
docker service ps t_nginx
docker exec -it d1a4e1ccf9fc /bin/bash 查看是否挂载成功
验证数据挂载
docker volume inspect nginx_volume
cd /var/lib/docker/volumes/nginx_volume/_data 并查看数据圈里的数据
再次执行 docker exec -it d1a4e1ccf9fc /bin/bash 查看是否挂载成功
查看其他 机器数据卷是否挂载成功
7:Swarm集群部署多服务mkdir swarmcompose
cd swarmcompose/
touch docker-compose.yml
vim docker-compose.yml
编写 dockercompose.yml 的时候 一定要注意缩进问题 ,否则在使用docker stack docker stack deploy -c docker-compose.yml + 服务名 会提示 各种属性错误 比如:
replicas Additional property replicas is not allowed
经过网络上查找该类 错误原因 得到一个 回到
大概意思是
缩进在docker-compose.yml中非常重要。按照您设置它的方式,“部署”是一种服务,这不是您想要的。deploy部分旨在指定有关如何部署“web”服务的信息。以下允许docker compose up和docker stack deploy web--compose文件docker-compose.yml为我成功运行:
添加如下内容 代码缩进的样例
此时 运行 服务正常启动
docker stack deploy -c docker-compose.yml deploy_swarm
删除 这个服务 添加多个服务进行编排 ,并指定容器启动在那种类型的节点上
注意 从一个新的services 行开始 每下降一行需要的是新增两个英文的空格键 ,不能是tab,也不能是换行后默认的位置,能写在同一个列同级别的属性与其父级别的空格个数是相同的.
docker stack deploy -c docker-compose.yml multi
version: "3"
services:
nginx:
image: nginx
deploy:
replicas: 5
restart_policy:
condition: on-failure
ports:
- "80:80"
visualizer:
image: dockersamples/visualizer
ports:
- "8800:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints: [node.role == manager]
portainer:
image: portainer/portainer
ports:
- "9000:9000"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints: [node.role == manager]
在 manager 节点上执行
docker stack deploy -c docker-compose.yml multi multi 是服务的前缀 ,生成服务完成后 ,会在服务名前面都加上
分别访问 上面的节点的nginx
docker version | Docker documentation docker 官方命令手册
docker stack 常用命令
docker stack deploy 部署新的堆栈或更新现有堆栈
docker stack ls 列出现有堆栈
docker stack ps 列出堆栈中的任务
docker stack rm 删除一个或多个堆栈
docker stack services 列出堆栈中的服务
8:Docker Swarm 容器网络
在Docker版本1.12之后swarm模式原生支持覆盖网络(overlay networks),可以先创建一个覆盖网络,然后启动容器的时候启用这个覆盖网络
只要是这个覆盖网络内的容器,不管在不在同一个宿主机上都能相互通信,不同覆盖网络内的容器组之间是相互隔离的,相互不能通信
swarm模式的覆盖网络包括以下功能:
1》可以添加多个服务到同一个网络
2》默认情况下service discovery为每个swarm服务分配一个虚拟IP地址(vip)和DNS名称,使得在同一个网络中容器之间可以使用服务名称为互相连接。
3》可以配置使用DNS轮循而不使用VIP
4》为了可以使用swarm的覆盖网络,在启用swarm模式之前你需要在swarm节点之间开放以下端口或者关闭防火墙(关闭防火墙只适用于自己开发测试,生产需要添加防火墙端口规则配置)
TCP/UDP端口7946 – 用于容器网络发现
UDP端口4789 – 用于容器覆盖网络
在Swarm集群中创建overlay网络:
docker network create --driver overlay --opt encrypted --subnet ip/24 nxxx_net (网络名称)
–opt encrypted 默认情况下swarm中的节点通信是加密的。在不同节点的容器之间,可选的–opt encrypted 参数能在它们的vxlan流量启用附加的加密层。
--subnet 命令行参数指定overlay网络使用的子网网段。当不指定一个子网时,swarm管理器自动选择一个子网并分配给网络。
docker network ls
其中"nginx_net"网络是我们在部署容器时所创建的。而"ingress"覆盖网络则为默认提供。
Swarm 管理节点会利用 ingress 负载均衡以将服务公布至集群之外,SCOPE表示将服务部署到Swarm时可以使用此网络
docker service create --replicas 5 --network ngx_net --name my-test -p 80:80 nginx 在指定的网络上创建5个副本的nginx
docker network inspect ngx_net 查看网络信息、加入同一个网络 ,如ngx_net网络的容器彼此之间可以通过IP地址通信,也可以通过名称通信



