一、Swarm集群的主要功能作用
Docker Swarm是Docker官方提供的容器编排和集群管理工具,用于创建和管理多个Docker容器的分布式集群。它提供了简单易用的方式来管理容器的部署、伸缩、容错和服务发现。
下面是Docker Swarm集群的一些主要作用和功能:
- 容器编排:Docker Swarm允许你定义和管理容器的部署方式,通过定义服务、任务和副本等概念来组织和编排容器
- 伸缩性:通过Swarm集群,你可以轻松地扩展容器的数量,以应对应用程序的负载变化。Swarm会自动处理容器的分布和负载均衡
- 容错和高可用性:Swarm集群提供容错机制,确保即使有节点故障,集群中的服务仍然可用。它能够自动重新启动失败的容器,保持应用程序的高可用性
- 服务发现:Swarm集群提供内置的服务发现,使你能够轻松地找到和连接到正在运行的容器。通过服务名称,你可以访问容器,而无需关注底层节点的细节
- 安全性:Swarm集群提供安全的通信机制,使用TLS加密在节点之间进行通信,确保集群中的容器和数据的安全性
- 跨主机网络:Swarm集群提供跨主机的网络连接,允许容器在不同的主机上进行通信。你可以创建多主机网络来定义容器之间的通信规则
- 负载均衡:Swarm集群具有内置的负载均衡功能,可以平衡集群中容器的请求流量,确保高效的资源利用和应用程序的可扩展性
二、Swarm集群的类型
在Docker Swarm中,有两种类型的节点:管理节点(Manager node)和工作节点(Worker node)。
- 管理节点(Manager node)
(1)管理节点是Swarm集群的核心,负责整个集群的管理和协调
(2)管理节点维护集群状态、调度任务、处理故障恢复、作为服务发现的终端等
(3)管理节点可以有多个,通常建议使用奇数个管理节点以实现高可用性
- 工作节点(Worker node)
(1)工作节点是集群中的计算资源提供者,负责运行实际的容器实例
(2)工作节点执行管理节点分配的任务,并为服务提供容器化应用程序的运行环境
(3)工作节点可以根据需要进行扩展,以满足应用程序的负载要求
Swarm集群的组成是由这些不同类型的节点组成的,管理节点用于管理集群和协调容器,而工作节点用于托管和运行容器实例.
集群中的管理节点和工作节点共同协作,通过Swarm模式的内建功能实现容器的编排、伸缩、容错和服务发现等。这使得应用程序的管理变得更加简单可靠,并方便地将容器化应用程序部署到分布式环境中
三、Swarm集群的组建方式
在构建Docker Swarm集群时,可以根据不同的需求,选择不同的方式:
1、单机构建方式
使用一台机器搭建Swarm集群,该机器同时兼具管理节点和工作节点的功能
这种方式适用于测试、开发或小规模部署的场景
自定义方式A
①单机构建只需要通过以下命令初始化swarm集群即可
管理节点也是工作节点
docker swarm init
②创建覆盖网络
docker network create --driver overlay --attachable=true test
③创建服务时指定网络test
*注:单机部署最简单的方式是将需要互通的容器都指定加入一个相同的主机网络或者通过一个YML文件启动通过服务名互通即可
2、集群构建方式
使用多台机器搭建Swarm集群,每台机器可以分配为管理节点或工作节点
使用多机构建可以提供高可用性和负载均衡的能力
默认开放端口 | 作用 | 应用场景 |
2377 | 集群管理通信的端口 | |
2376 | Docker的HTTP API端口,用于与 Docker 守护程序进行通信 | 加密api接口,但需要配置TLS加密 |
2375 | 也是 Docker 的HTTP API端口 | 非加密api接口,不建议在生产环境使用 |
7946 | Docker Swarm的节点通信端口,用于集群中的节点之间的交流 | |
4789 | Docker Overlay网络的默认VXLAN隧道端口,用于多主机的Docker网络通信 |
自定义方式A
(1)首先,选择一台机器作为管理节点,运行docker swarm init 命令,生成一个令牌
docker swarm init --advertise-addr <主节点IP地址>
执行结果
[root@minio-1 ~]# docker swarm init --advertise-addr 127.0.0.1
Swarm initialized: current node (mqf0g0ne27qnuh3ksyatt22gs) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1vw20w6bamyeplrxte7qikeesdzpi7jp12n6aqlzchuiinwjza-5385jxez42mifkp2queeild2f 127.0.0.1:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
(2)然后,将生成的令牌复制到其他机器上,并在每台机器上运行docker swarm join 命令,将它们加入Swarm集群作为工作节点
docker swarm join --token SWMTKN-1-1vw20w6bamyeplrxte7qikeesdzpi7jp12n6aqlzchuiinwjza-5385jxez42mifkp2queeild2f 127.0.0.1:2377
执行结果
[root@localhost data]# docker swarm join --token SWMTKN-1-1vw20w6bamyeplrxte7qikeesdzpi7jp12n6aqlzchuiinwjza-5385jxez42mifkp2queeild2f 127.0.0.1:2377
This node joined a swarm as a worker.
(3)通过管理节点查看swarm集群已加入的节点信息
docker node ls
执行结果
[root@minio-1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
u3jf69yexezg7vhbrqqyaf7v8 localhost.localdomain Ready Active 19.03.12
mqf0g0ne27qnuh3ksyatt22gs * minio-1 Ready Active Leader 20.10.3
(4)通过swarm集群的覆盖网络实现跨主机容器互通
#在管理节点上创建覆盖网络test
docker network create --driver overlay --attachable=true test
--driver overlay 参数指定网络驱动程序以及其他选项来配置网络
--attachable=true 选项将该网络设置为可附加模式,代表其他主机可以加入这个网络
执行结果
[root@minio-1 web]# docker network create --driver overlay --attachable=true test
or4bay2vmyrd9gy8qrr19jnch
(5)创建容器时使用覆盖网络模型
#在每个节点上创建容器时,使用 '–network ' 参数指定网络名称test
docker run --network=test <其他参数> <镜像名称>
3、示例
在管理节点和工作节点上分别部署一个容器并通过服务名测试连接
①在管理节点通过docker-compose.yml文件创建一个test-manager容器
version: '2.0'
services:
web: #入口程序
network_mode: test
build: ./test/web
container_name: test-manager
ports:
- "8705:8705"
volumes:
- ./test/web/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./test/web/test_webroot/:/code/swtool/dsmp_webroot/
- ./test/web/default.conf:/etc/nginx/conf.d/default.conf
ulimits:
core: 0
②在工作节点同样通过docker-compose.yml文件创建一个test-work容器
version: '2.0'
services:
web: #入口程序
network_mode: test
build: ./test/web
container_name: test-work
ports:
- "8705:8705"
volumes:
- ./test/web/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./test/web/test_webroot/:/code/swtool/dsmp_webroot/
- ./test/web/default.conf:/etc/nginx/conf.d/default.conf
ulimits:
core: 0
③进入管理节点的test-manager容器,通过工作节点test-work的容器名测试连接
[root@37dda3769b4c localhoost]# ping test-work
PING test-work (10.0.2.34) 56(84) bytes of data.
64 bytes from test-work.test (10.0.2.34): icmp_seq=1 ttl=64 time=1.13 ms
64 bytes from test-work.test (10.0.2.34): icmp_seq=2 ttl=64 time=0.538 ms
64 bytes from test-work.test (10.0.2.34): icmp_seq=3 ttl=64 time=0.656 ms
64 bytes from test-work.test (10.0.2.34): icmp_seq=4 ttl=64 time=0.553 ms
64 bytes from test-work.test (10.0.2.34): icmp_seq=5 ttl=64 time=0.852 ms
四、swarm集群的一些常用命令和配置
常用命令
docker swarm init ---- 初始化swarm集群
docker swarm join --token <TOKEN> <MANAGER_IP>:<MANAGER_PORT> ----- 加入指定集群
docker node ls ---- 查看集群中节点列表
docker service ls ---- 查看集群中服务列表
docker service inspect <service_name> ---- 查看特定服务的详情信息
docker node rm <node_id> ---- 移除一个节点
docker network ls ---- 查看集群中网络列表
docker network rm <network_name> ---- 移除一个网络
docker-compose down --remove-orphans ----停止并移除与配置文件关联的容器、网络和卷,并清理掉被称为“孤立容器”的未与服务配置关联的容器
docker-compose --compatibility <options> ----以兼容方式运行yml文件,自动适配不同版本的配置
docker stack deploy -c <compose_file> <stack_name> ----指定yml文件创建一个名为xxx的服务堆载
docker stack rm <stack_name> ----删除名为xxx的服务堆载