文章目录
准备工作
- 购买准备4台服务器(需要在同一内网)。(为了避免忘记释放服务器,可以设置几个小时自动释放,也可以选择手动释放)
- 为所有主机安装Docker
技巧:xshell可以右键发送命令到所有的会话,这样多个主机就可以同时安装了。
工作模式
docker swarm 地址:https://docs.docker.com/engine/swarm/
docker集群分为工作节点和管理节点
管理节点:负责管理工作节点,也提供服务。
工作节点:提供服务。
搭建集群
查看docker swarm的帮助命令
init 初始化一个集群 --advertise-addr:公布address 。
- 创建集群
我这里的ip是172.26.131.206,(请使用内网ip,ECS内网通信不产生流量费)
docker swarm init --advertise-addr 172.26.131.206 #创建集群,当前主机会自动变成manager节点
2. 添加一个worker节点(在第二台主机上执行命令)(如果此步报错,请确保节点之间能互相ping通,且安全组是否设置ip白名单)
docker swarm join --token SWMTKN-xxx 172.26.131.206:2377 #这个在创建集群时,会输出到控制台
3. 将另外两台节点添加进去
#生成manager节点的令牌(在manager节点执行)
docker swarm join-token manger
#生成worker节点的令牌(在manager节点执行)
docker swarm join-token worker
#查看节点命令(在manager节点执行)
docker node ls
按照这个方式,构建出双主双从。
manager status 为Leader表示领导节点,Reachable表示可达,也是主节点,其它无标注的表示work节点。
Raft协议
双主双从:假设一个节点挂掉,其他节点是否可用?
Raft协议:保证大多数节点存活才可以,必须大于1,集群至少3台。
实验:
环境备注:1和3为manager,2和4为worker
1.将docker1停止,双主,另外一台节点也不能使用了。
(停掉(systemctl stop docker)了第一台ecs(manager节点)上的docker,在第三台ecs执行docker node ls提示服务不可用。
- 将1启动(systemctl start docker)。继续测试,停掉一台worker节点。
- 在节点1启动后,我们会发现Leader发生了变化。(这表示节点3变成了Leader)
- 此时我们将节点2停掉
#两条指令执行其一均可
systemctl stop docker #停掉docker(在节点2执行)
docker swarm leave #离开集群(在节点2执行,将该节点离开集群)
docker swarm leave --force #强制离开集群(如果集群无法连通的话,可能导致无法离开集群,此时使用强制离开)
这里执行了离开集群,再次查看节点,发现节点2的状态变成了Down
3. 在主节点生成manager令牌(见前面如何生成令牌),将节点2 变成manager节点后,发现现在是一台Leader,两台Reachable。
- work是用来工作的,管理节点操作,3台主机设置为manager
架构简单,集群可以用。3个主节点,只要大于1台管理节点即可使用。
Raft协议,保证大多数节点活,才可以使用,高可用。
docker service
docker swarm 弹性,扩缩容,汲取!
docker run(单容器部署) > docker compose (多服务单机部署启动) > swarm (集群部署docker service)
容器=> 服务!
容器=> 服务! =>副本
redis服务=>10个副本!
体验:创建服务,动态扩容服务,动态更新服务。
注意:所有的docker service都在manager节点上操作
创建一个服务
docker service create -p 8888:80 --name mynginx nginx
docker run 容器启动! 不具有扩缩容能力
docker service 服务! 具有扩缩容器,滚动更新!
查看服务REPLICAS
#查看服务
docker service ps mynginx
动态扩缩容(replicas 副本)
#扩容副本3台(将会有3个实例)
docker service update --replicas 3 mynginx
注:填写数量是指扩容到的意思,不是增加的意思。比如填写20,那么实际上一共20个mynginx容器,
同样也可以减少。比如之前20个mynginx,现在填写5,那么同样存在5个mynginx容器。
scale扩缩容
与上面replicas副本实际效果一样
同样可以减少,可以增加。
#扩容到6台
docker service scale mynginx=6
常用命令
docker swarm常用命令
Docker swarm init:初始化一个集群
docker swarm join-token manager/worker 生成join令牌
Docker swarm join:加入一个集群
docker swarm leave 离开集群
docker swarm leave --force 强制离开集群
Docker node ls:查看集群的信息
Docker service create:创建一个集群服务
Docker service ls:查看集群的服务
Docker service rm:删除一个集群服务
docker service ps mynginx 查看服务
docker service update --replicas 10 mynginx 扩容副本(增加/减少至10个)
docker service scale mynginx=10 扩缩容(增加/减少至10个)
概念总结
swarm
集群的管理和编号。
docker可以初始化一个swarm集群,其它节点可以加入。(manager,worker)
Node
Node节点,多个节点就组成了一个网络集群。(manager,worker)
Service
任务,可以在管理节点或者工作节点来运行。核心,用户访问1
Task
容器内的命令,细节任务!
逻辑是不变的。
命令->管理->api->调度->工作节点(创建Task容器维护创建!)
服务副本与全局服务
调整service以什么方式运行
--mode string
Service mode (replicated or global) (default "replicated")
docker service create --mode replicated --name mytom tomcat:7 默认的
docker service create --mode global --name haha alpine ping baidu.com
#场景?日志收集
每一个节点有自己的日志收集器,过滤。把所有日志最终再传给日志中心
服务监控,状态性能。
拓展:网络模式: “PublishMode”: “ingress” Swarm:
Overlay:
ingress : 特殊的 Overlay 网络! 负载均衡的功能! IPVS VIP!
虽然docker在4台机器上,实际网络是同一个! ingress 网络 ,是一个特殊的 Overlay 网络
关于安全组
集群需要开放的端口
作用 | 协议 | 端口 |
---|---|---|
集群管理通信 | TCP | 2377 |
节点通信 | TCP&UDP | 7946 |
覆盖型网络 | UDP | 4789 |
或者你可以配置安全组规则,集群服务器使用相同的安全组,把各服务器的内网ip配置到docker swarm安全组,开放所有流量。
EC2示例:
ECS 示例:
遇到的错误
错误1: Error response from daemon: rpc error: code = Unknown desc = The swarm does not have a leader. It’s possible that too few managers are online. Make sure more than half of the managers are online
解决方法:
请注意配置安全组,将docker swarm节点设置为ip白名单。