docker swarm
一、环境准备
1.准备好四台服务器
docker1(192.168.0.10)、docker2(192.168.0.11)、docker3(192.168.0.13)、docker4(192.168.0.14)
2.安装docker
#参考文档:官网
注由于4台机器都要安装我们需要用到xshell的小技巧如下:
点击发送到所有会话。

工作模式

注:操作都在manager
搭建集群:



地址:公网 内网
[root@docker1 ~]# docker swarm init --advertise-addr 192.168.0.10

初始化节点: docker swarm init
加入一个节点:docker swarm join
#获取令牌
docker swarm join-token manager
docker swarm join-token worker
吧docker2加入docker1
[root@docker2 ~]# docker swarm join --token SWMTKN-1-3u6cnjv3o8ntnxylrc5tntrm8bvtko5jzg8g3umbddtjxczflc-4xvt57zk562y77omphdm6fq4f 192.168.0.10:2377

查看列出群组中的节点
[root@docker1 ~]# docker node ls

把docker3加入节点
[root@docker3 ~]# docker swarm join --token SWMTKN-1-3u6cnjv3o8ntnxylrc5tntrm8bvtko5jzg8g3umbddtjxczflc-4xvt57zk562y77omphdm6fq4f 192.168.0.10:2377
This node joined a swarm as a worker.

把docker4加入主节点
1.创建主节点令牌
[root@docker1 ~]# docker swarm join-token manager

2.把docker4加入主节点
[root@docker4 ~]# docker swarm join --token SWMTKN-1-3u6cnjv3o8ntnxylrc5tntrm8bvtko5jzg8g3umbddtjxczflc-dfj1fe83a5uwnjhpb0etanwh9 192.168.0.10:2377
This node joined a swarm as a manager.
3.查看
[root@docker1 ~]# docker node ls

raft协议
双重双主:假设一个节点挂了,其它节点是否可用
raft协议:保证大多数节点存活才可以用。只要>1,集群至少大于三台
实验:
将ocker1机器停止,宕机,由于我们现在是双主结构,另外一个节点也不能使用了!
[root@docker1 ~]# systemctl stop docker.service
[root@docker4 ~]# docker node ls
Error response from daemon: rpc error: code = 2 desc = raft: no elected cluster leader
启动docker1后正常
[root@docker1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
01a0568r7nja4roc6n4x0i1ji docker3 Ready Active
4xzwtgsmkpgu9yjv7x7xpt54k docker4 Unknown Active Leader
abd2mw7cn4c0lq5bxgrlhs4tx docker2 Unknown Active
ez0d73ul2uf6c18m4fnausdin * docker1 Ready Active Reachable
将docker3移除节点
[root@docker3 ~]# docker swarm leave
Node left the swarm.

主要保证集群可用至少要保证三个主节点,>1太管理节点存活
删除节点前,需先停该节点的docker服务
docker node rm [hostname]
体会
弹性、扩缩容、集群
以后告别docker run!
docker-compose up! 启动一个项目单机
集群 swarm docker service
容器=》服务=》副本
体验:创建服务、动态扩展服务、动态更新服务

灰度发布:金丝雀发布!
[root@docker1 ~]# docker service create -p 8888:80 --name my-nginx nginx
3jscijnxvaihuc1zm138tde0v
docker run 容器启动!不具有扩缩容功能
docker service 服务! 具有扩缩容、滚动更新
[root@docker1 ~]# docker service ps my-nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
a73nmtzy9w0xvpzjlu7aj36me my-nginx.1 nginx docker2 Running Running 2 minutes ago
查看服务

动态扩缩容
[root@docker1 ~]# docker service update --replicas 3 my-nginx
查看结果
[root@docker2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
503b07b909b8 nginx:latest "/docker-entrypoint.s" 11 minutes ago Up 11 minutes 80/tcp my-nginx.1.a73nmtzy9w0xvpzjlu7aj36me
[root@docker3 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6631aff5eb4d nginx:latest "/docker-entrypoint.s" 3 minutes ago Up 3 minutes 80/tcp my-nginx.3.2s58g5mtl6oig7gcs4kq6hdvb
[root@docker3 ~]#
[root@docker4 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
44b2a002cf6e nginx:latest "/docker-entrypoint.s" 5 seconds ago Up 4 seconds 80/tcp my-nginx.2.brddytptvq2tpq0thag1rmz8v
服务,集群中任意的节点都可以访问,服务可以有多个副本
[root@docker1 ~]# docker service update --replicas 50 my-nginx 可以加很多个(随机分配)
[root@docker1 ~]# docker service update --replicas 1 my-nginx 也可以瞬间把很多个副本缩小为一个
弹性、扩缩容,实现服务高可用,任何服务、云
[root@docker1 ~]# docker service scale my-nginx=5 扩容5份跟上面命令一样
[root@docker1 ~]# docker node rm docker 移除服务
docker swarm 其实并不难,只要会搭建集群,动态管理容器就可以了
概念总结
swarm
集群的管理和标号。docker可以初始化一个swarm集群,其他节点可以加入(管理、工作)
service
任务,可以在管理节点或者工作节点来运行,核心,用户访问

逻辑是不变的:命令->管理->api->调度->工作节点(创建Task容器维护创建)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)