Docker Swarm 是 Docker 官方提供的容器编排和集群管理工具,用于在多个 Docker 主机上创建和管理容器集群。它允许将一组 Docker 主机(节点)组织成一个单一的虚拟主机,以便在集群中部署和管理容器应用程序。
Docker Swarm 的一些关键概念和特点:
-
节点(Nodes):Docker Swarm 集群中的每个 Docker 主机被称为一个节点。节点可以是 Swarm 集群的管理节点(manager)或工作节点(worker)。
-
服务(Services):服务是在 Swarm 集群中运行的容器应用程序。它可以包含一个或多个可扩展的容器副本,并且可以定义服务的规模、网络配置、挂载卷等。
-
任务(Tasks):任务是服务的基本单位,代表着在集群中运行的容器实例。Swarm 调度器将任务分配给可用的节点,并确保任务的副本数和健康状态。
-
栈(Stacks):栈是一组关联的服务的集合,用于组织和管理应用程序的多个组件。它使用 Docker Compose 文件定义服务和网络配置。
-
调度器(Scheduler):Docker Swarm 的调度器负责将任务分配给可用的节点,并根据服务的规模、资源需求和健康状态进行自动调整和重新调度。
-
负载均衡(Load Balancing):Swarm 集群通过内置的负载均衡功能将流量分发给服务的多个容器副本,以实现高可用性和水平扩展。
通过 Docker Swarm,可以轻松创建和管理容器集群,实现容器的高可用性、负载均衡和水平扩展。
应用场景
-
容器化应用程序的部署和管理:Docker Swarm 提供了一种简化和统一的方式来部署和管理容器化应用程序。企业可以使用 Swarm 构建和管理容器集群,将应用程序的不同组件以容器的形式进行打包,并通过定义服务和栈来组织和管理这些容器。这样可以提高应用程序的可移植性、可扩展性和可靠性。
-
高可用性和容错能力:企业通常需要确保其应用程序在面对节点故障或容器故障时能够保持高可用性。Docker Swarm 提供了故障转移和自动重新调度的功能。当某个节点或容器发生故障时,Swarm 可以自动将任务分配到其他可用的节点上,确保应用程序的持续可用性。
-
水平扩展和负载均衡:企业面对不断增长的用户和负载时,需要能够快速扩展应用程序的容量。Docker Swarm 允许根据负载需求自动扩展容器副本的数量,并利用内置的负载均衡功能将流量均匀分发到这些容器副本之间。这样可以提高应用程序的性能和可伸缩性。
-
多环境部署:企业通常需要在不同的环境中部署和管理应用程序,例如开发、测试和生产环境。Docker Swarm 提供了一种统一的部署和管理方式,使得在不同环境中进行容器化应用程序的部署更加简单和一致。通过使用不同的 Swarm 集群或堆栈,企业可以轻松管理不同环境中的应用程序。
-
简化持续集成和持续部署(CI/CD):Docker Swarm 可以与持续集成和持续部署工具集成,例如 Jenkins、GitLab CI 等。这样可以实现自动化的构建、测试和部署流程,并将容器化的应用程序部署到 Swarm 集群中。这种集成可以大大简化企业的 CI/CD 流程,并提高部署的可靠性和一致性。
部署准备
Docker Swarm官方文档
Swarm Mode View
Raft Consensus Group:
它由管理节点(Manager Nodes)组成的一组节点,用于实现分布式共识算法 Raft。Raft 是一种一致性算法,用于管理节点之间的选举、日志复制和状态同步,以确保集群的一致性和可靠性。
在 Docker Swarm 中,Raft Consensus Group 用于管理节点之间的通信和协调,以进行集群管理任务和决策。它负责选举主要管理节点(Leader Manager),处理集群配置更改、服务调度、容器分配等操作,并确保数据的一致性。
-
Leader Manager(主要管理节点):
Raft Consensus Group 中的一个管理节点会被选举为 Leader Manager,它负责处理集群管理任务和决策。Leader Manager 接收来自其他节点的请求,并根据共识算法 Raft 的规则来执行它们。 -
Follower Managers(辅助管理节点):
Raft Consensus Group 中的其他管理节点充当辅助管理节点,它们接收来自 Leader Manager 的指令,并协调执行任务。辅助管理节点也参与选举过程,以便在 Leader Manager 发生故障时能够接管控制权。 -
日志复制和状态同步:
Raft Consensus Group 使用日志复制机制来确保集群中管理节点的日志和状态保持一致。Leader Manager 接收来自客户端的操作请求,并将操作记录到日志中。然后,Leader Manager 将日志复制到其他节点,以便它们在自己的日志中复制和执行相同的操作。这样可以确保集群中的所有节点在状态上保持一致。 -
选举与容错性:
Raft Consensus Group 使用选举机制来选择 Leader Manager,并确保在 Leader Manager 发生故障时能够选出新的 Leader Manager。当 Leader Manager 失效时,辅助管理节点会发起新一轮的选举,以选择新的 Leader Manager。这样可以提高集群的容错性和可用性。
通过使用 Raft Consensus Group,Docker Swarm 实现了管理节点之间的共识和协调,以确保集群的稳定性和可靠性。它使得管理节点能够合作运行,并就集群操作达成一致的决策。
Manager Nodes(管理节点):
管理节点是 Docker Swarm 集群的控制中心,负责集群的管理和调度。通常会有多个管理节点以提供高可用性,其中一个节点被选为主要管理节点(Leader Manager),其他节点充当辅助管理节点(Follower Managers)。
主要管理节点(Leader Manager)负责进行集群管理任务,如服务调度、容器分配、节点健康监测等。而辅助管理节点(Follower Managers)则提供冗余和高可用性支持,以便在主要管理节点发生故障时能够接管控制权。
管理节点可以执行以下任务:
- 创建、更新和删除服务(Services)
- 管理集群状态和配置
- 定义网络(Networks)和存储卷(Volumes)
- 监控和日志收集等管理操作
管理节点的特点:
- 高可用性:为了确保集群的高可用性,建议至少有3个管理节点,其中一个是主要管理节点(Leader Manager),其他两个是辅助管理节点(Follower Managers)。这样,即使其中一个管理节点发生故障,集群仍然能够正常运行。
- 规模和复杂性:随着集群规模和复杂性的增加,可能需要更多的管理节点来处理管理任务和负载。根据集群的规模和负载需求,可以选择增加管理节点的数量。
Works Nodes(工作节点):
工作节点是 Docker Swarm 集群中的计算资源提供者,用于运行容器化的应用程序。它们是真正执行容器任务的节点。
工作节点从管理节点接收任务,并在本地运行容器。它们负责容器的创建、管理和执行,以及向管理节点提供有关节点健康状态的信息。
工作节点可以执行以下任务:
- 运行和管理容器任务(Tasks)
- 向管理节点报告节点健康状态
- 执行容器的创建、启动、停止和销毁等操作
工作节点的特点:
- 计算资源和负载需求:根据应用程序的计算资源需求和负载情况,确定需要多少工作节点。可以根据工作节点的 CPU、内存、存储等资源来估算所需的节点数量。
- 高可用性和负载均衡:为了实现高可用性和负载均衡,建议至少有两个或更多的工作节点。这样,即使一个工作节点发生故障,其他节点仍然可以接管任务并提供服务。
购买服务器
1核2G*10台
注意:阿里云账户里面的金额必须要大于100元,需要充值
安装Docker
搭建Swarm集群
显示当前 Docker 主机上的所有网络:docker network ls
root@iZf8z4is41ifkh545f6sa8Z:~# docker swarm --help
Usage: docker swarm COMMAND
Manage Swarm
Commands:
init Initialize a swarm
join Join a swarm as a node and/or manager
Run 'docker swarm COMMAND --help' for more information on a command.
root@iZf8z4is41ifkh545f6sa8Z:~# docker swarm init --help
Usage: docker swarm init [OPTIONS]
Initialize a swarm
Options:
--advertise-addr string Advertised address (format: "<ip|interface>[:port]")
--autolock Enable manager autolocking (requiring an unlock key to start a stopped manager)
--availability string Availability of the node ("active", "pause", "drain") (default "active")
--cert-expiry duration Validity period for node certificates (ns|us|ms|s|m|h) (default 2160h0m0s)
--data-path-addr string Address or interface to use for data path traffic (format: "<ip|interface>")
--data-path-port uint32 Port number to use for data path traffic (1024 - 49151). If no value is set or is
set to 0, the default port (4789) is used.
--default-addr-pool ipNetSlice default address pool in CIDR format (default [])
--default-addr-pool-mask-length uint32 default address pool subnet mask length (default 24)
--dispatcher-heartbeat duration Dispatcher heartbeat period (ns|us|ms|s|m|h) (default 5s)
--external-ca external-ca Specifications of one or more certificate signing endpoints
--force-new-cluster Force create a new cluster from current state
--listen-addr node-addr Listen address (format: "<ip|interface>[:port]") (default 0.0.0.0:2377)
--max-snapshots uint Number of additional Raft snapshots to retain
--snapshot-interval uint Number of log entries between Raft snapshots (default 10000)
--task-history-limit int Task history retention limit (default 5)
参数说明:
--advertise-addr
是 Docker Swarm 初始化或加入集群时的一个选项,用于指定广播地址(advertised address)。 即告诉“我”在哪里。
取消所有会话,只对docker1进行命令输入,初始化第一个manager节点
因为是租的服务器,流量按量计费,可以走服务器的私网地址(172.x.x.x),不要钱.
查看系统中的网络接口信息:ip addr
让docker4、5,作为worker加入docker1(manager节点-主要管理节点)
1. 生成一个加入令牌,该令牌用于将新的 "manager" 节点加入到 Swarm 集群中
docker swarm join-token manager
2. 生成一个加入令牌,该令牌用于将新的 "worker" 节点加入到 Swarm 集群中
docker swarm join-token manager
也可以直接从docker1中复制上面的命令(docker swarm join --token SWMTKN-1-3pzvyykxrtyqg1yjezrm2cag13ahsv7d8ykh6ldwcwtzu3jabi-4hen7cftyopuf8k95f8mbfl8s 172.24.28.20:2377),在docker4和docker5中分别粘贴。
然后在主节点上运行docker node ls,其中可以看到有一个为leader。
显示当前 Swarm 集群中的所有节点:docker node ls
同样地,可以使用获取令牌的方式,在dokcer1中使用获取管理员令牌的方式(docker swarm join-token worker)生产一个命令,然后在docker5和dokcer8粘贴该命令,加入到docker1(manager节点下)
docker1中:
docker5和docker8中:
在主节点(manager中)查看新加入的worker节点
类似的,可以将docker2和docker3变成主节点
在docker1中使用令牌的方式 (docker swarm join-token manager),然后在docker2和docker3中粘贴
docker1中:
docker2和docker3中:
查看docker1中的节点信息:
按照同样地方法:
将 6 9 加入2;7 10加入3
在docker2中 使用docker swarm join-token worker
然后将令牌复制到6和9中
查看docker2的node信息
按照同样地方法,配置docker3的worker节点
测试
root@iZf8z4is41ifkh545f6sa8Z:~# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
sziktbob4r8zcrlkfko0mhcn7 iZf8z4is41ifkh545f6sa2Z Ready Active 24.0.6
3e3s34i4m6asmq6s5rb6kqxrl iZf8z4is41ifkh545f6sa3Z Ready Active Reachable 24.0.6
4jikeqx9thcy4dku7w9rgbv7f iZf8z4is41ifkh545f6sa4Z Ready Active 24.0.6
vy5tc0lkokulaesl6smn5yv51 * iZf8z4is41ifkh545f6sa8Z Ready Active Leader 24.0.6
vedy0pc5icp9wcgltqv5wqr5d iZf8z4is41ifkh545f6sa9Z Ready Active 24.0.6
630nzlwbr1q4abgz0yw3v2ovx iZf8z4is41ifkh545f6saaZ Ready Active Reachable 24.0.6
root@iZf8z4is41ifkh545f6sa8Z:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
e5693e06c617 bridge bridge local
74763e825040 docker_gwbridge bridge local
a65fa745a94f host host local
vin11nyg5prl ingress overlay swarm
86a1285b234d none null local
root@iZf8z4is41ifkh545f6sa8Z:~# docker service create --name test-service nginx
hrgz3eb733xhplyhmicwml5hd
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
root@iZf8z4is41ifkh545f6sa8Z:~# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
hrgz3eb733xh test-service replicated 1/1 nginx:latest
root@iZf8z4is41ifkh545f6sa8Z:~# docker service ps test-service
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
j98elcx6vjn4 test-service.1 nginx:latest iZf8z4is41ifkh545f6sa5Z Running Running 47 seconds ago
root@iZf8z4is41ifkh545f6sa8Z:~# docker service scale test-service=3
test-service scaled to 3
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
root@iZf8z4is41ifkh545f6sa8Z:~# docker service ps test-service
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
j98elcx6vjn4 test-service.1 nginx:latest iZf8z4is41ifkh545f6sa5Z Running Running about a minute ago
pr89kngb68lz test-service.2 nginx:latest iZf8z4is41ifkh545f6sa2Z Running Running 20 seconds ago
qb5exo28kk40 test-service.3 nginx:latest iZf8z4is41ifkh545f6sa4Z Running Running 19 seconds ago
参数说明:
- docker service create --name test-service nginx:在 Swarm 集群中创建一个服务并命名为 "test-service",服务将使用 nginx 镜像作为其基础映像。一旦服务创建成功,Swarm 集群将尝试在集群中的节点上启动副本(任务)来运行该服务。在创建服务时,Docker Swarm 会自动将服务的副本分散在集群中的不同节点上,以提高高可用性和负载分配。
- docker service ls:显示当前 Swarm 集群中的所有服务。注意:必须在 Swarm 模式下运行 Docker,并且当前节点必须是 Swarm 集群的一部分(无论是管理节点还是工作节点)。
- docker service scale test-service=3:将名为 "test-service" 的服务的副本数扩展为 3,意味着 Swarm 集群将会尝试在集群中的不同节点上启动额外的任务来达到总共 3 个副本数。
- docker service ps test-service:显示名为 "test-service" 的服务的任务列表。每个任务对应于服务在 Swarm 集群中的一个副本
在docker1(mannager)运行以上命令,发现服务被创建在了docker5、docker7、docker8这三台服务器上。但docker1我们在创建的时候,分配的工作节点为docker4、docker5、docker8。其结构图如下所示。
原因分析:
将 "test-service" 服务的副本数扩展到 3 个时。Swarm 管理器将会尽量将服务的容器均匀地分配到可用的工作节点上。
现在让我们来看一下为什么只在 docker5、docker7 和 docker8 节点上看到了 Nginx 服务的容器,而没有在 docker4、docker5 和 docker8 节点上看到。
根据描述,docker4、docker5 和 docker8 是 docker1 节点的工作节点,而 docker7 和 docker10 是 docker3 节点的工作节点。因此,docker4 和 docker6 不是 "test-service" 服务的工作节点。
当在进行扩容操作后,Swarm 管理器会尽量将服务的容器实例均匀地分配到可用的工作节点上。在这种情况下,由于 docker4 和 docker6 不是具体的工作节点,它们不会直接运行服务的容器实例。相反,docker4 和 docker6 节点将作为其父节点 docker1 和 docker2 的一部分来管理工作节点,服务的容器实例将在它们的父节点上运行。
因此,只能在 docker5、docker7 和 docker8 节点上看到 "test-service" 服务的容器,因为它们是具体的工作节点,而不是父节点。
请注意,Swarm 集群的拓扑结构和服务的分发方式还受到其他因素的影响,如节点的资源情况、调度策略等。确保正确设置节点角色和 Swarm 集群的配置,以便服务能够按预期分配和运行。
用完请释放资源