Docker Swarm 集群弹性、动态扩缩容
一、创建一个服务
1. 查看创建服务命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [root@localhost ~]# docker service --help Usage: docker service COMMAND Manage services Commands: create Create a new service # 创建新服务 inspect Display detailed information on one or more services # 检查显示一个或多个服务的详细信息 logs Fetch the logs of a service or task # 日志获取服务或任务的日志 ls List services # ls列表服务 ps List the tasks of one or more services # ps列出一个或多个服务的任务 rm Remove one or more services # rm删除一个或多个服务 rollback Revert changes to a service's configuration # 回滚还原对服务配置的更改 scale Scale one or multiple replicated services # 扩展一个或多个复制服务 update Update a service # 更新服务 Run 'docker service COMMAND --help' for more information on a command. |
1 2 3 4 5 6 7 | [root@localhost ~]# docker service create --help Usage: docker service create [OPTIONS] IMAGE [COMMAND] [ARG...] # 用法:docker 服务 创建[选项]图像[命令][参数…] Create a new service Options:<br><br>-p, --publish port Publish a port as a node port # 将端口发布为节点端口<br>-u, --user string Username or UID (format: <name|uid>[:< group |gid>]) # 指定用户名<br> --with-registry-auth Send registry authentication details to swarm agents<br>-w, --workdir string Working directory inside the container #指定容器内工作目录 |
2. 创建一个服务
创建的swarm服务启动命令和docker run 差不多
1 2 3 4 5 | [root@localhost ~]# docker service create -p 8081:80 --name my-nginx nginx ubq32058ujwjrvlp8n7uqk22f overall progress: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service converged |
3. 查看启动的docker服务及列表
1 2 3 | [root@localhost ~]# docker service ps my-nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS fbtc2jpqfm0g my-nginx.1 nginx:latest localhost.localdomain Running Running 6 minutes ago |
1 2 3 | [root@localhost ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS ubq32058ujwj my-nginx replicated 1/1 nginx:latest *:8081->80/tcp |
4. 查看启动服务的详细信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | [root@localhost ~]# docker service inspect my-nginx [ { "ID" : "ubq32058ujwjrvlp8n7uqk22f" , "Version" : { "Index" : 54 }, "CreatedAt" : "2021-03-04T02:17:57.18776573Z" , "UpdatedAt" : "2021-03-04T02:17:57.196303716Z" , "Spec" : { "Name" : "my-nginx" , "Labels" : {}, "TaskTemplate" : { "ContainerSpec" : { "Image" : "nginx:latest@sha256:f3693fe50d5b1df1ecd315d54813a77afd56b0245a404055a946574deb6b34fc" , "Init" : false , "StopGracePeriod" : 10000000000, "DNSConfig" : {}, "Isolation" : "default" }, "Resources" : { "Limits" : {}, "Reservations" : {} }, "RestartPolicy" : { "Condition" : "any" , "Delay" : 5000000000, "MaxAttempts" : 0 }, "Placement" : { "Platforms" : [ { "Architecture" : "amd64" , "OS" : "linux" }, { "OS" : "linux" }, { "OS" : "linux" }, { "Architecture" : "arm64" , "OS" : "linux" }, { "Architecture" : "386" , "OS" : "linux" }, { "Architecture" : "mips64le" , "OS" : "linux" }, { "Architecture" : "ppc64le" , "OS" : "linux" }, { "Architecture" : "s390x" , "OS" : "linux" } ] }, "ForceUpdate" : 0, "Runtime" : "container" }, "Mode" : { "Replicated" : { "Replicas" : 1 # 副本数量 } }, "UpdateConfig" : { "Parallelism" : 1, "FailureAction" : "pause" , "Monitor" : 5000000000, "MaxFailureRatio" : 0, "Order" : "stop-first" }, "RollbackConfig" : { "Parallelism" : 1, "FailureAction" : "pause" , "Monitor" : 5000000000, "MaxFailureRatio" : 0, "Order" : "stop-first" }, "EndpointSpec" : { "Mode" : "vip" , "Ports" : [ { "Protocol" : "tcp" , "TargetPort" : 80, "PublishedPort" : 8081, "PublishMode" : "ingress" } ] } }, "Endpoint" : { "Spec" : { "Mode" : "vip" , "Ports" : [ { "Protocol" : "tcp" , "TargetPort" : 80, "PublishedPort" : 8081, "PublishMode" : "ingress" } ] }, "Ports" : [ { "Protocol" : "tcp" , "TargetPort" : 80, "PublishedPort" : 8081, "PublishMode" : "ingress" } ], "VirtualIPs" : [ { "NetworkID" : "q24fl2e3wkw7zhdbu2a3trzpz" , "Addr" : "10.0.0.8/24" } ] } } ] |
以上【Mode块】显示,我们的副本数现在只有一个,因为现在就启动了一个服务
5. 查看服务在Swarm集群中哪台服务器上
Manager集群节点状态查看:
1 2 3 4 5 6 7 | [root@localhost ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 2giiey95hal5fv2rgfmx3souu localhost.localdomain Down Active 20.10.5 65ohc7a6u28qlanpb2tygpd8k localhost.localdomain Ready Active 20.10.5 bbksnbwq0aq96ap3z6s1znk09 * localhost.localdomain Ready Active Reachable 20.10.5 ww14ifp4ki9gyw1gdhvzgbzff localhost.localdomain Ready Active Leader 20.10.5 xttcuf3iu5cvirxwwiydi3808 localhost.localdomain Ready Active Reachable 20.10.5 |
现在docker-1、docker-3、docker-4 为Manager主节点,docker-2 为worker从节点
docker-1 查看:
1 2 | [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
docker-2 查看:
1 2 3 | [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fcdfee3f3953 nginx:latest "/docker-entrypoint.…" 29 minutes ago Up 29 minutes 80/tcp my-nginx.1.fbtc2jpqfm0gld0g7itavm0r1 |
docker-3 查看:
1 2 | [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
docker-4 查看:
1 2 | [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
以上显示,服务已经被分配到了docker-2 worker从节点运行
二、弹性,动态扩缩容
方法一:
1. 集群服务扩缩容
1 2 3 4 5 6 7 | [root@localhost ~]# docker service update --help Usage: docker service update [OPTIONS] SERVICE Update a service Options:<br><br>-q, --quiet Suppress progress output<br> --replicas uint Number of tasks # 副本的任务数量<br> --replicas-max-per-node uint Maximum number of tasks per node ( default 0 = unlimited) |
1 | [root@localhost ~]# docker service update --replicas 5 my-nginx |
可以根据环境需求,进行动态扩缩服务数量,比如:10,50,100,.......... 等
1 2 3 | [root@localhost ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS ubq32058ujwj my-nginx replicated 5/5 nginx:latest *:8081->80/tcp |
2. 再次查看my-nginx服务详细信息
1 2 3 4 5 6 7 8 9 10 11 12 | [root@localhost ~]# docker service inspect my-nginx { "ID" : "ubq32058ujwjrvlp8n7uqk22f" , "Version" : { "Index" : 61 }, # 此处副本数已经改成5 "Mode" : { "Replicated" : { "Replicas" : 5 } }, |
3. 4台服务器上服务分布
docker-1
docker-2
docker-3
docker-4
方法二:
1. 查看命令使用方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [root@localhost ~]# docker service --help Usage: docker service COMMAND Manage services Commands: create Create a new service # 创建新服务 inspect Display detailed information on one or more services # 检查显示一个或多个服务的详细信息 logs Fetch the logs of a service or task # 日志获取服务或任务的日志 ls List services # ls列表服务 ps List the tasks of one or more services # ps列出一个或多个服务的任务 rm Remove one or more services # rm删除一个或多个服务 rollback Revert changes to a service's configuration # 回滚还原对服务配置的更改 scale Scale one or multiple replicated services # 扩展一个或多个复制服务 update Update a service # 更新服务 Run 'docker service COMMAND --help' for more information on a command. |
1 2 3 | [root@localhost ~]# docker service scale --help Usage: docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS...] |
2. 动态扩缩容服务
将服务副本数量扩容到10个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [root@localhost ~]# docker service scale my-nginx=10 my-nginx scaled to 10 overall progress: 10 out of 10 tasks 1/10: running 2/10: running 3/10: running 4/10: running 5/10: running 6/10: running 7/10: running 8/10: running 9/10: running 10/10: running verify: Service converged |
3. 查看副本数量
1 2 3 | [root@localhost ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS ubq32058ujwj my-nginx replicated 10/10 nginx:latest *:8081->80/tcp |
4. 服务器上的副本分布
docker-1
docker-2
docker-3
docker-4
5. 如果想要减少副本数量,执行:
1 2 3 4 5 6 7 8 9 10 11 12 | [root@localhost ~]# docker service scale my-nginx=5 my-nginx scaled to 5 overall progress: 5 out of 5 tasks 1/5: running 2/5: running 3/5: running 4/5: running 5/5: running verify: Service converged [root@localhost ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS ubq32058ujwj my-nginx replicated 5/5 nginx:latest *:8081->80/tcp |
结论:
以上两种方式均可实现动态扩缩容,方法二更简单一些!
三、 访问测试
以上得知,服务,在集群任意节点中都可以访问!服务可以有多个副本动态扩缩容实现高可用!
在客户端看来,Swarm集群就是一个整体!
概念:
1 2 3 | 1. docker run 容器启动!不具有扩缩容功能! 2. docker service 服务!具有扩缩容功能,滚动更新! |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统