[Docker]十.Docker Swarm讲解
一.Dokcer Swarm集群介绍
1.Dokcer Swarm 简介
Docker Swarm 是 Docker 公司推出的用来管理 docker 集群的工具, 使用 Docker Swarm 可以快速方便的实现 高可用集群 ,Docker Compose 只能编排单节点上的容器, Docker Swarm 可以让我们在单一主机上操作来完成对 整个容器集群 的管理工作,使用Docker Swarm 可以 让单一主机上的容器快速部署到10个、20个或者200个主机上面,实现高可用集群. 从 Docker 1.12.0 版本开始, Docker Swarm 已经包含在 Docker 引擎中( docker swarm ),并且已经内置了服务发现工具,就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了.Dokcer Swarm是 Docker 官方的提供的集群部署管理工具,基于原生 Docker ,相比 K8s 要 更简单 、 更容易上手, 如果您的节点(物理机)在1000 台以内,完全可以使用 Docker Swarm 实现部署,学会Docker Swarm,学 K8s 会更简单一些, Swarm 和 Kubernetes 比较类似,但是更加轻,具有的功能也较kubernetes更少一些
- 是docker host集群管理工具
- docker官方提供的
- docker 1.12版本以后
- 用来统一集群管理的,把整个集群资源做统一调度
- 比kubernetes要轻量化
- 实现scaling 规模扩大或缩小
- 实现rolling update 滚动更新或版本回退
- 实现service discovery 服务发现
- 实现load balance 负载均衡
- 实现route mesh 路由网格,服务治理
官网地址: https://docs.docker.com/engine/reference/commandline/swarm/
2.Dokcer Swarm节点
Docker swarm 中有 节点 的概念, 一个节点就可以通俗的理解为一个机器 ( 可以是物理服务器也可以是虚拟机、云等等)
节点分为: 管理 (manager) 节点和工作 (worker) 节点
管理节点(Manager):管理节点用于 Swarm 集群的管理 , 负责集群控制,能过监控集群状态、分发任务到工作节点 , docker swarm 命令基本只能在管理节点执行 (节点退出集群命令 docker swarm leave 可以在工作节点执行), 一个 Swarm 集群可以有多个管理节点 , 但 只有一个管理节点可以成为 leader , leader 通过 raft 协议实现工作节点(Worker):是任务执行节点,管理节点将服务 (service) 下发至工作节点执行, 管理节点默 认也作为工作节点
节点的有效性有三种:
- Active 调度程序可以分配任务给节点
- Pause 调度程序不分配新任务给节点,但现有任务继续运行
- Drain 调度程序不分配新任务给节点,调度程序关闭任何现有任务并将它们调度到可用节点上
3.Dokcer Swarm节点数量
(1).管理节
一个三管理器群最多可以容忍一名管理器的损失一个五管理器群最多可以同时丢失两个管理器节点一个 N 管理器集群最多可以容忍丢失 (N-1)/2 管理器Docker 建议 一个 swarm 最多使用 7个管理器 节点
(2).工作节点
管理节点也可以是工作节点,工作节点的数量没有限制,经过测试,Swarm 可拓展性的极限是在 1000个节点(主机)上运行 50000 个部署容器
4.服务和任务
任务 ( Task )是 Swarm 中的最小的调度单位,目前来说就是 一个单一的容器服务 ( Services ) 是指一组任务的集合( 多个容器的集群 ),服务定义了任务的属性
二.docker swarm集群搭建
1.docker swarm集群准备工作
关闭seLinux、关闭防火墙、配置主机hostname
关闭SELinux
通过getenforce命令查看SELiunx
[root@MiWiFi-R3L-srv ~]# getenforce
Disabled
修改/etc/selinux/config 文件
将SELINUX=enforcing改为SELINUX=disabled
关闭防火墙
#停止防火墙
systemctl stop firewalld#永久关闭防火墙
#systemctl disable firewalld#开启防火墙
systemctl start firewalld#查看防火墙状态
systemctl status firewalld
配置主机hostname
如果只是修改hostname可以通过如下命令
hostname newHostname
注意:这种修改方式只有当前有效,等服务器重启后hostname 就会失效,回到原来的 hostname
永久修改,重启后生效
vi /etc/hostname
2.创建docker swarm集群
这里用四台虚拟机来操作:
manager 节点 manager_81 192.168.31.81
worker 节点 worker_117 192.168.31.117
worker 节点 worker_140 192.168.31.140
worker 节点 worker_241 192.168.31.241
关闭他们的SELinux,关闭防火墙,以及设置其hostname
首先就在 manager 这个节点上执行如下操作,表示要将它设置为 manager ,并且设置自己的通讯IP为192.168.31.81,相关命令语法如下:
#docker swarm init 快速初始化一个集群
docker swarm init --advertise-addr 192.168.31.81
[root@manager_81 ~]# docker swarm init --advertise-addr 192.168.31.81
Swarm initialized: current node (qu1ydd2t6occ8fo76rvaksidd) is now a manager.To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-6afkz1ub7m8q37cehxmjiirs6a0r25qt1hzf0no1c0xcny55qc-d3gtv0qcsuhivozbomp4d73ha 192.168.31.81:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.[root@manager_81 ~]
上述的docker swarm join 为加入集群的命令
docker swarm join --token SWMTKN-1-6afkz1ub7m8q37cehxmjiirs6a0r25qt1hzf0no1c0xcny55qc-d3gtv0qcsuhivozbomp4d73ha 192.168.31.81:2377
把上面命令依次在工作节点worker_117,worker_140,worker_241上运行,这样这几个工作节点就加入了集群了
3.查看集群节点
在manager_81管理节点上运行命令 docker node ls 查看所有集群节点注意:该命令只能在manager节点上运行

也可以通过命令 docker node inspect 节点ID 查看节点详情
#查看manager节点信息
[root@manager_81 ~]# docker node inspect qu1ydd2t6occ8fo76rvaksidd
[{"ID": "qu1ydd2t6occ8fo76rvaksidd","Version": {"Index": 9},"CreatedAt": "2023-11-23T08:52:01.533912216Z","UpdatedAt": "2023-11-23T08:52:04.095241126Z","Spec": {"Labels": {},"Role": "manager","Availability": "active"},"Description": {"Hostname": "manager_81","Platform": {"Architecture": "x86_64","OS": "linux"},"Resources": {"NanoCPUs": 1000000000,"MemoryBytes": 819965952},"Engine": {"EngineVersion": "24.0.7","Plugins": [{"Type": "Log","Name": "awslogs"},{"Type": "Log","Name": "fluentd"},{"Type": "Log","Name": "gcplogs"},{"Type": "Log","Name": "gelf"},{"Type": "Log","Name": "journald"},{"Type": "Log","Name": "json-file"},{"Type": "Log","Name": "local"},{"Type": "Log","Name": "logentries"},{"Type": "Log","Name": "splunk"},{"Type": "Log","Name": "syslog"},{"Type": "Network","Name": "bridge"},{"Type": "Network","Name": "host"},{"Type": "Network","Name": "ipvlan"},{"Type": "Network","Name": "macvlan"},{"Type": "Network","Name": "null"},{"Type": "Network","Name": "overlay"},{"Type": "Volume","Name": "local"}]},"TLSInfo": {"TrustRoot": "-----BEGIN CERTIFICATE-----\nMIIBazCCARCgAwIBAgIUY13k5tC6JLjbjGEPjuXUiJVQ6O0wCgYIKoZIzj0EAwIw\nEzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMjMxMTIzMDg0NzAwWhcNNDMxMTE4MDg0\nNzAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH\nA0IABKXU197cjuB2Yul9m8TSDWJs7DySbr6W07TLCXspF+oklU3heaYgSXas3Y5h\nW5apP18B2cfK0cowIgaSAT0mEbGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB\nAf8EBTADAQH/MB0GA1UdDgQWBBSjxbGtYF8NNoDaZcT98Jazqq3G6DAKBggqhkjO\nPQQDAgNJADBGAiEAmXzeGCNDSmjxdaGwfQD+XM4+sMIpFClxeBRUr+dTmZECIQDE\nZvih28ozoVDfCOexIWc9ggnem/tyTskK2yMvQyB0bg==\n-----END CERTIFICATE-----\n","CertIssuerSubject": "MBMxETAPBgNVBAMTCHN3YXJtLWNh","CertIssuerPublicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEpdTX3tyO4HZi6X2bxNINYmzsPJJuvpbTtMsJeykX6iSVTeF5piBJdqzdjmFblqk/XwHZx8rRyjAiBpIBPSYRsQ=="}},"Status": {"State": "ready","Addr": "192.168.31.81"},"ManagerStatus": {"Leader": true,"Reachability": "reachable","Addr": "192.168.31.81:2377"}}
]
发现,角色是Manager
他是一个Leader
注意:
可以有多个manager节点,但只能有一个是Leader
4.查看工作节点的 token,worker加入集群
当又有一台服务器要加入这个worker集群时,可以通过docker swarm join-token worker来查看加入集群命令
[root@manager_81 ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-6afkz1ub7m8q37cehxmjiirs6a0r25qt1hzf0no1c0xcny55qc-d3gtv0qcsuhivozbomp4d73ha 192.168.31.81:2377[root@manager_81 ~]#
5.查看管理节点的 token , manager加入集群
当又有一台服务器要加入这个manager集群时,可以通过docker swarm join-token manager来查看加入集群命令,这里就不再演示
[root@manager_81 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:docker swarm join --token SWMTKN-1-6afkz1ub7m8q37cehxmjiirs6a0r25qt1hzf0no1c0xcny55qc-2bogd7dp5r5wss6s3k255sq4v 192.168.31.81:2377[root@manager_81 ~]#
6.删除集群节点
当不需要某个工作节点时,可以在其节点上执行命令:docker swarm leave -f, 然后在管理节点上执行命令 docker node rm 节点ID -f 删除节点
#管理节点上执行
docker node rm 9xtzwe9h5w36snbheow3yzsy9 -f#工作节点上执行
docker swarm leave -f
7.节点的降级升级
管理节点可以降级成工作节点,工作节点也可以升级成管理节点
#节点降级,由管理节点降级为工作节点
docker node demote 节点ID
#eg:节点降级
docker node demote rpa61so05v8wcy5y9ohzn9tv1#节点升级,由工作节点升级为管理节点
docker node promote 节点ID
#eg:节点升级
docker node promote rpa61so05v8wcy5y9ohzn9tv1
8.创建部署服务
以前是通过docker run来创建部署容器,但是该命令 docker run 容器启动,不具备扩所容,它只能在当前机器上运行,不能部署到多台服务器上,这时可以通过docker service来部署,因为docker service 服务,具有扩所容,滚动更新、回滚等功能,他会自动地部署到dokcer swarm对应的集群中(部署到多台服务器上),下面举个例子来说明
创建一个nginx镜像服务(需要在mananger上运行):
docker service create --name nginx01 --replicas 2 -p 80:80 nginx
通过上面命令,创建一个服务nginx01,这个服务里面有两个nginx容器,这两个容器会随机部署到上面四个服务器上(通过算法实现)
--name nginx服务名称
--replicas 2 指定容器的副本,这里有2个,它会把nginx容器部署到集群这四台服务器上的随机两台上面,部署好后就可以在这四台服务器上任意一台访问nginx服务了
[root@manager_81 ~]# docker service create --name nginx01 --replicas 2 -p 80:80 nginx
797ddmq429mgst9y2su8ezywt
overall progress: 0 out of 2 tasks
1/2: preparing [=================================> ]
overall progress: 0 out of 2 tasks
1/2: preparing [=================================> ]
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
9.查看所有服务详情
通过docker service ls查看创建的服务
[root@manager_81 ~]#
[root@manager_81 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
797ddmq429mg nginx01 replicated 2/2 nginx:latest *:80->80/tcp
10.查看服务里面运行的容器
通过docker service ps 服务名 查看服务里运行的容器详情
[root@manager_81 ~]# docker service ps nginx01
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
bypoyr3h2b8u nginx01.1 nginx:latest worker_140 Running Running 45 seconds ago
ml9j2f9xx14u nginx01.2 nginx:latest manager_81 Running Running 3 minutes ago
发现nginx01服务里面运行了两个nginx服务,一个在worker_140,一个在manager_81上,可以在这两台机器上通过docker ps查看
虽然nginx只部署到了四台机器上的两台中,但还是可以随机访问这四台机器,因为他们是一个集群,底层有一个负载均衡操作,通过ingress网卡处理:
11.动态扩缩容
docker service update --replicas 10 nginx01#也可以使用
docker service scale nginx01=10#通过这个命令就会把10个nginx容器随机部署到这四台服务器上(通过算法部署)
这里有一个需要注意的地方:
当其中的某个容器挂掉后,swarm会自动地创建一个新的容器并随机分配到机器上(通过算法分析得出哪个机比较空闲,并分配容器),从而保证容器的个数可用,保证了负载均衡操作
12.删除服务
#查看服务
[root@manager_81 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
797ddmq429mg nginx01 replicated 6/6 nginx:latest *:80->80/tcp#删除服务
[root@manager_81 ~]# docker service rm nginx01
nginx01#发现服务已被删除
[root@manager_81 ~]#
[root@manager_81 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
13.负载均衡,随机调度功能
创建一个新的nginx服务,并映射html目录,暴露端口,扩容8个nginx容器,演示一下随机调度(负载均衡)的功能
docker service create --name nginx --replicas 8 -p 80:80 --mount type=bind,src=/root/wwwroot/html,dst=/usr/share/nginx/html nginx
--mount: 相当于以前的-v(映射数据卷)
(1).在各个机器上创建/root/wwwroot/html目录
mkdir -p /root/wwwroot/html
(2).在html下创建index.html,并写入对应的内容
vi index.htmlthis is 192.168.31.xxx web
如下:
(3).启动nginx服务
说明集群没问题,通过上面访问显示,发现: 当访问81这台机器时,没有显示81这个上面的内容,这是因为在访问的时候,swarm通过ingress(特殊的overlay网络,具有负载均衡的功能 )网络算法,计算哪一台机器资源比较充足空闲,然后就指定到哪一台上面去访问,并不是到具体机器上,而是根据其算法计算得来的
三.docker swarm 部署借助docker-compose.yml部署集群
1.准备goweb项目镜像
参考 [Docker]九.Docker compose讲解
(1).配置Dockerfile
在/root/wwwroot/下新建Dockerfile,并写入以下内容
FROM centos:centos7
ADD ginGorm.tar.gz /root
WORKDIR /root
RUN chmod -R 777 ginGorm
WORKDIR /root/ginGorm
EXPOSE 8080
ENTRYPOINT ["./goweb"]
(2).在要部署的服务器上面build一个gowebimg的镜像 创建nginx转发文件
也可以把build好的镜像发布到远程仓库:
docker build -t docker.io/gowebimg:latest .
docker push docker.io/gowebimg:latest
(3).所有主机上面下载镜像
docker pull gowebimg:latest
如果没有发布到docker上,则需把打包(docker save 镜像ID 镜像.tar)好的镜像复制到各个集群机器上,然后解压镜像(docker load -i 镜像包名, docker tag 镜像ID 镜像名:版本),下面展示各个机器上的镜:
2.准备docker-compose.yml文件
这里和[Docker]九.Docker compose讲解类似
#指定docker-compose 版本
version: "3"#services下就是容器的编写
services:#容器,myMysql:#来自哪个镜像image: mysql#容器名,如果不指定,则使用myMysql这个容器默认名称container_name: myMysql#环境变量:配置用户名,密码等environment:MYSQL_ROOT_PASSWORD: 123456#restart: 表示容器挂掉后是否重启, always 一直重启restart: always#映射的端口ports:- 3306:3306#数据卷的挂载volumes:- /root/mysql/conf.d:/etc/mysql/conf.d- /root/mysql/data:/var/lib/mysql#配置goweb01项目容器goweb01:#build编译成镜像,可以使用上面的/root/wwwroot/Dockerfile里面的#build:# context: ./# dockerfile: Dockerfile#当然,也可以使用已经编译号的gowebimg镜像image: gowebimg:v1.0.1#container_name: goweb01restart: always#ports:# - 8080:8080deploy:replicas: 6 #副本数量resources: #资源limits: #配置cpucpus: "0.5" # 设置该容器最多只能使用 50% 的 CPUmemory: 500M # 设置该容器最多只能使用 500M内存restart_policy: #定义容器重启策略, 用于代替 restart 参数condition: on-failure #只有当容器内部应用程序出现问题才会重启#depends_on表示创建好myMysql这个容器后,再来创建goweb01这个容器depends_on:- myMysql#配置nginx容器nginx:image: nginxcontainer_name: nginxrestart: alwaysports:- 80:80depends_on:- goweb01volumes:- /root/nginx/conf.d/:/etc/nginx/conf.ddeploy:replicas: 6 #副本数量resources: #资源limits: #配置cpucpus: "0.5" # 设置该容器最多只能使用 50% 的 CPUmemory: 500M # 设置该容器最多只能使用 500M内存restart_policy: #定义容器重启策略, 用于代替 restart 参数condition: on-failure #只有当容器内部应用程序出现问题才会重启
3.创建一个新的集群
在这之前需要在服务器上运行命令docker swarm leave -f 退出集群
(1).在manager_81上初始化集群
root@manager_81 wwwroot]# docker swarm init --advertise-addr 192.168.31.81
Swarm initialized: current node (7issgqc81r4xrl07y5qxedtpf) is now a manager.To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-1ytez4j3d9iccq7x92kw8dgx9v3q7w68ip24xavz5ec9zsoowc-577xpv4w5o73etzuhcql9bvd9 192.168.31.81:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.[root@manager_81 wwwroot
(2).然后在其他物理机上运行docker swarm join --token 加入集群
docker swarm join --token SWMTKN-1-1ytez4j3d9iccq7x92kw8dgx9v3q7w68ip24xavz5ec9zsoowc-577xpv4w5o73etzuhcql9bvd9 192.168.31.81:2377
4.docker swarm +docker-compose 部署项目
注意:
一般需要把mysql单独拿出来做成mysql集群,因为mysql有一个读写分离的操作,在这里就不处理,后续可以自己弄一下
在使用docker-compose.yml之前,都建议把需要用到的镜像在每台机器上都下载下来,方便使用
下面部署:
#docker stack deploy --compose-file 为固定写法, gowebSwarm 为服务名称,可随意
docker stack deploy --compose-file docker-compose.yml gowebSwarm
#查看nginx服务部署详情
[root@manager_81 wwwroot]# docker service ps gowebSwarm_nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
ggsuom0uhaji gowebSwarm_nginx.1 nginx:latest manager_81 Running Running about a minute ago
uls0crwvl45s gowebSwarm_nginx.4 nginx:latest worker_140 Running Failed 7 minutes ago "task: non-zero exit (1)"
ggsuom0uhaji gowebSwarm_nginx.1 nginx:latest manager_81 Running Running about a minute ago
uls0crwvl45s gowebSwarm_nginx.4 nginx:latest worker_140 Running Failed 7 minutes ago "task: non-zero exit (1)"
发现nginx部署在81和140上,查看
#查看gowebimg部署详情
[root@manager_81 wwwroot]# docker service ps gowebSwarm_goweb01
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
8x0jlmxlai3g gowebSwarm_goweb01.1 gowebimg:v1.0.1 worker_241 Running Running 2 minutes ago
dsndspg6ljae gowebSwarm_goweb01.2 gowebimg:v1.0.1 manager_81 Running Running 4 minutes ago
5fuq5kywo1aq gowebSwarm_goweb01.3 gowebimg:v1.0.1 worker_241 Running Running 2 minutes ago
m6lpunm0lyi4 gowebSwarm_goweb01.4 gowebimg:v1.0.1 worker_140 Running Running 4 minutes ago
发现goweb部署在241.81,140上,其中241上有两个:
在浏览器上访问,发现没问题,这样,一个nginx集群,goweb项目集群就搭建好了
下面还需在外部搭建一个nginx负载均衡的服务器,当外部访问这个nginx时,通过它转发到nginx集群,让集群去处理,这样才算是一个真正的负载均衡操作,达到的效果如下:
当访问www.test.com时,随机访问的服务器为192.168.31.81,192.168.31.114,192.168.31.241,192.168.31.117这几台
5.配nginx负载均衡
(1).swarm 集群中的nginx配置
每台集群机器上的nginx配置文件(/root/nginx/conf.d/)
upstream gowebtest{ip_hash;server goweb01:8080;
}
server {listen 80;server_name docker.test.com;location / {#设置主机头和客户端真实地址,以便服务器获取客户端真实IP#禁用缓存proxy_buffering off;#反向代理的地址proxy_pass http://gowebtest;}#error_page 404 /404.html;# redirect server error pages to the static page /50x.html#error_page 500 502 503 504 /50x.html;location = /50x.html {root html;
}
}
(2).nginx主机服务器的配置
upstream bakeaaa {ip_hash;server 192.168.31.81 weight=1;server 192.168.31.140 weight=1;server 192.168.31.117 weight=1;server 192.168.31.241 weight=1;
}server {listen 80;server_name www.test.com;#charset koi8-r;#access_log /var/log/nginx/host.access.log main;location / {#设置主机头和客户端真实地址,以便服务器获取客户端真实 IPproxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#nginx服务器与被代理服务连接超时时间,代理超时,超时后会请求其他server ipproxy_connect_timeout 1s;#禁用缓存proxy_buffering off;proxy_pass http://bakeaaa;}#error_page 404 /404.html;# redirect server error pages to the static page /50x.html#error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}
}
(3).查看nginx服务器转发的节点
在server{}下添加如下两行配置:
add_header backendCode $upstream_status;
add_header BackendIP "$upstream_addr;" always;
(4).再新启一台服务器,作为nginx主机服务器
然后下载nginx
docker pull nginx
然后配置conf
(5).启动nginx容器
可以通过docker run或者docker service 启动一个nginx服务,这里目前就一台nginx对外暴露,可以用docker run启动
[root@MiWiFi-R3L-srv conf.d]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest a6bd71f48f68 3 days ago 187MB
[root@MiWiFi-R3L-srv conf.d]# docker run -it -d --name nginxweb -p 80:80 -v /root/nginx/conf.d/:/etc/nginx/conf.d nginx
30bbc795b79bc763205e0acfe111352efa96f2b91065a4923070786ccbdec8cd
[root@MiWiFi-R3L-srv conf.d]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
30bbc795b79b nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, :::80->80/tcp nginxweb
[root@MiWiFi-R3L-srv conf.d]#
(6).配置hosts
(7).浏览器访问
这样就完成了一个负载均衡操作,对上面负载均衡的说明:
当外部通过浏览器访问域名时,通过DNS域名转发,访问到了nginx主机(192.168.31.250)这台服务器,nginx服务器通过ip_hash转发给设置的几个server ip 服务器,其中接收到的服务器再通过底层的igress网络,使用算法计算得出哪一台服务器资源比较充足,就访问哪一台服务器
当然,上面的swarm集群目前只有一台manager结点,3台worker结点,一般在正式环境中,manager结点数在3~7台,worker结点也应该更多台,这样才能处理高并发
[上一节][Docker]九.Docker compose讲解
相关文章:

[Docker]十.Docker Swarm讲解
一.Dokcer Swarm集群介绍 1.Dokcer Swarm 简介 Docker Swarm 是 Docker 公司推出的用来管理 docker 集群的工具, 使用 Docker Swarm 可以快速方便的实现 高可用集群 ,Docker Compose 只能编排单节点上的容器, Docker Swarm 可以让我们在单一主机上操作来完成对 整…...
相机机模组需求示例
产品需求名称摄像头采集图片数据补充说明产品需求描述 As:用户 I want to:通过相机模组获取到自定义格式图片数据,要求包括: 1、支持多种场景,如:手持相机拍摄舌苔 2、支持图片分辨率至少达到1920X1080 3、…...
Uniapp 微信登录流程解析
本文将介绍在 Uniapp 应用中实现微信登录的流程,包括准备工作、授权登录、获取用户信息等步骤。 内容大纲: 介绍Uniapp和微信登录: 简要介绍 Uniapp 框架以及微信登录的重要性和流行程度。 准备工作: 注册微信开发者账号创建应用…...
红旗Asianux Server Linux V8 安装万里数据库(GreatSQL)
红旗Asianux Server Linux V8 安装万里数据库(GreatSQL) 红旗Asianux介绍: 红旗Asianux Server Linux 8.0是为云时代重新设计的操作系统,为云时代的到来引入了大量新功能,包括用于配置管理、快速迁移框架、编程语言和…...

一文2000字使用JMeter进行接口测试教程!(建议收藏)
安装 使用JMeter的前提需要安装JDK,需要JDK1.7以上版本目前在用的是JMeter5.2版本,大家可自行下载解压使用 运行 进入解压路径如E: \apache-jmeter-5.2\bin,双击jmeter.bat启动运行 启动后默认为英文版本,可通过Options – Cho…...

Spark---介绍及安装
一、Spark介绍 1、什么是Spark Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行计算框架,Spark拥有Hadoop MapReduce所具有的优点;但…...

uni-app:实现request请求的递归(设置request请求的访问次数),并且调用自定义方法给出返回值
一、效果展示 失败效果 成功效果 二、写入后端请求部分 分析 ①自定义一个模块common.js主要用于封装所有的请求函数 ②核心代码 function requestWithRetry(cmd, username, password, retryCount) {return new Promise((resolve, reject) > {uni.request({url: ip sys…...

数据结构-归并排序+计数排序
1.归并排序 基本思想: 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个…...

Qml使用cpp文件的信号槽
文章目录 一、C文件Demo二、使用步骤1. 初始化C文件和QML文件,并建立信号槽2.在qml中调用 一、C文件Demo Q_INVOKABLE是一个Qt元对象系统中的宏,用于将C函数暴露给QML引擎。具体来说,它使得在QML代码中可以直接调用C类中被标记为Q_INVOKABLE的…...
聚类笔记:HDBSCAN
1 算法介绍 DBSCAN/OPTICS层次聚类主要由以下几步组成 空间变换构建最小生成树构建聚类层次结构(聚类树)压缩聚类树提取簇 2 空间变换 用互达距离来表示两个样本点之间的距离 ——>密集区域的样本距离不受影响——>稀疏区域的样本点与其他样本点的距离被放大——>…...

【Python】批量将PDG合成PDF,以及根据SS号重命名秒传的文件
目录 说明批量zip2pdf批量zip2pdf下载SS号重命名源代码SS号重命名源代码下载附录,水文年鉴 说明 1、zip2pdf是一个开源软件,支持自动化解压压缩包成PDG,PDG合成PDF,笔者在其基础上做了部分修改,支持批量转换。 2、秒…...

2023亚太杯数学建模A题思路 - 采果机器人的图像识别技术
# 1 赛题 问题A 采果机器人的图像识别技术 中国是世界上最大的苹果生产国,年产量约为3500万吨。与此同时,中国也是世 界上最大的苹果出口国,全球每两个苹果中就有一个,全球超过六分之一的苹果出口 自中国。中国提出了一带一路倡议…...
3、LeetCode之无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。转载: C常用语法——unordered_set 题目主要思想ÿ…...
CONDITIONS EVALUATION REPORT-解决方案
在启动SpringBoot项目时,提示一堆的Positive matches、Negative matches(如下代码框),感觉像是报错了样。但用SpringBoot的Test类操作数据库的Insert是成功的。提示这些信息通过网上搜索主要讲配置类被Spring容器加载与被加载的说明。名词解释…...

计算机网络——路由
文章目录 1. 前言:2. 路由基础2.1. 路由的相关概念2.2. 路由的特征2.3. 路由的过程 3 路由协议3.1. 静态路由:3.2. 动态路由:3.2.1. 距离矢量协议3.2.2. OSPF协议:3.2.2.1.OSPF概述OSPF的工作原理路由计算功能特性 3.2.2.2.OSPF报…...

python+requests+pytest+allure自动化框架
1.核心库 requests request请求 openpyxl excel文件操作 loggin 日志 smtplib 发送邮件 configparser unittest.mock mock服务 2.目录结构 base utils testDatas conf testCases testReport logs 其他 2.1base base_path.py 存放绝对路径,dos命令或Jenkins执行…...
css3
基础 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>style</title><!-- link(外部样式)和style(内部样式)优先级相同,重复写会覆盖 --><link re…...

超级应用平台(HAP)起航
各位明道云用户和伙伴, 今天,我们正式发布明道云10.0版本。从这个版本开始,我们将产品名称正式命名为超级应用平台(Hyper Application Platform, 简称HAP)。我们用“超级”二字表达产品在综合能力方面的突破ÿ…...

cocos2dx Animate3D(二)
Twirl 扭曲旋转特效 // 持续时间(时间过后不会回到原来的样子) // 整个屏幕被分成几行几列 // 扭曲中心位置 // 扭曲的数量 // 振幅 static Twirl* create(float duration, const Size& gridSize, const Vec2& position, unsigned int twirls, float amplitude)…...

基于java技术的社区交易二手平台
基于java技术的社区交易二手平台的设计与实现 (一)开发背景 随着因特网的日益普及与发展,更多的人们开始通过因特网来寻求便利。但是,许多人都觉得网上商店里的东西不贵。所以,有些顾客宁愿去那些用二次定价建立起来的…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...