Linux中Docker Swarm介绍和使用
一、Docker Swarm的介绍
1.1 什么是Docker Swarm
DockerSwarm 是什么?
Docker Swarm 是 Docker 的集群管理工具。
其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源。
Docker Swarm 将一个或多个 Docker 节点组织起来,使得用户能够以集群方式管理它们。
1.2 组成部分
swarm 集群由管理节点
(Manager)和工作节点
(Worker)构成。
管理节点:主要负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作,诸如监控集群状态、分发任务至工作节点等操作。
工作节点:主要负责执行运行服务的任务。
在 Docker Swarm 集群中,节点的角色分为 Manager 和 Worker。
Manager 节点不仅负责管理集群(如调度任务、维护集群状态等),也可以运行服务的任务(即容器)。
默认情况下,当你创建一个服务时,Swarm 会根据其调度策略将服务的任务分配到可用的节点上,包括 Manager 节点
docker swarm
是 Docker 引擎内置的一个功能模块,不需要单独安装,它是随着 Docker Engine 一起发布的。只要 Docker 已经正确安装并运行,就可以使用
docker swarm
命令来初始化和管理 Swarm 集群。
1.3 相关命令说明
命令 | 说明 |
---|---|
docker swarm init | 初始化一个 Swarm 集群,将当前节点设为 Manager 节点。 |
docker swarm join --token <TOKEN> <MANAGER_IP>:2377 | 将当前节点加入到已有的 Swarm 集群中(作为 Worker 或 Manager)。 |
docker swarm ca | 显示或轮换集群的根 CA 证书(用于安全通信)。 |
docker swarm join-token worker | 显示用于添加 Worker 节点的 token 和命令。 |
docker swarm join-token manager | 显示用于添加 Manager 节点的 token 和命令。 |
docker swarm leave | 当前节点离开 Swarm 集群。 |
docker swarm unlock | 如果集群被加密锁定了,使用该命令解锁。 |
docker swarm unlock-key | 查看或删除集群的解锁密钥。 |
docker swarm update [OPTIONS] | 更新 Swarm 集群配置(如调度策略、默认安全设置等)。 |
二、Docker Swarm的使用
2.1 集群节点规划
为了利用 swarm 模式的容错功能,可以根据组织的高可用性要求实现
奇数个节点
。当有多个管理中心时,可以从一个管理中心节点的故障中恢复,而无需停机。
三个管理器群可以容忍最多损失一个管理器。
五个管理器群最多可以同时丢失两个管理器节点。
七个管理器群最多可以同时丢失三个管理器节点。
九个管理器群最多可以同时丢失四个管理器节点。
Docker 建议一个群最多有七个管理器节点。
添加更多管理器并不意味着可伸缩性或性能的提高。一般来说,情况恰恰相反。
主机名 | IP地址 | docker版本号 | 角色 | 备注 |
---|---|---|---|---|
manager01 | 192.168.66.146 | 26.1.4 | 管理节点 | 主管 |
manager02 | 192.168.66.152 | 26.1.4 | 管理节点 | 从管 |
manager03 | 192.168.66.153 | 26.1.4 | 管理节点 | 从管 |
worker01 | 192.168.66.154 | 26.1.4 | 工作节点 | 工作 |
worker02 | 192.168.66.155 | 26.1.4 | 工作节点 | 工作 |
2.2 环境准备
1、准备三台虚拟机(克隆即可)
2、修改主机名
-- 分别在三台虚拟机上执行
hostnamectl set-hostname managerhostnamectl set-hostname work01hostnamectl set-hostname work02
3、配置域名与ip地址(ip地址在克隆的时候就配置好了)
vim /etc/hosts-- 将里面内容清除,放入以下内容,三台机器都要
192.168.107.148 manager
192.168.107.129 work01
192.168.107.130 work02
4、关闭防火墙和SELINUX安全模式(这里要开放端口的自己开)
systemctl stop firewalldsetenforce 0-- 每次防火墙变动都要重启docker
systemctl restart docker
2.3 创建集群
docker swarm init --advertise-addr 192.168.66.146注释:
docker swarm init 初始化集群--advertise-addr 使用当前地址作为集群的入口
运行后:
将集群码复制并粘贴到其他两台虚拟机中运行
知识点:
-- 获取添加管理节点的口令
docker swarm join-token manager-- 获取添加工作节点的口令
docker swarm join-token worker将口令复制到其他虚拟机即可
2.4 检查配置情况
查看集群节点状态信息
-- 这个要到管理虚拟机上执行,工作节点的虚拟机会报错
docker node ls
查看整个Docker系统的信息
docker info
查询集群网络信息 查看到集群中各个节点的IP地址
docker network ls
-- 查看网络详情
docker network inspect ingress
2.5 角色变化
将Manager降级为Worker
# 查看帮助命令
docker node update -h
-- 将当前管理节点改为工作节点
docker node update --role=worker work1
将Worker升级为Manager
docker node update --role=manager work1
2.6 移出节点
工作节点移除
docker swarm leave -f
在某个节点上执行 docker swarm leave -f
时,该节点会退出集群,但这个操作并不会自动从其他节点的节点列表中删除它。
也就是说:
m3 当前节点 已经不再是 Swarm 的一部分。
但它曾经是集群的一部分,Swarm 管理节点(Manager)仍保留它的记录。
所以在
docker node ls
中它依然显示,只是状态变成Down
(表示无法通信或已离开)。
如果确认 m3
永远不会再加入集群,并且你想清理这个节点记录,你需要在 Manager 节点上手动删除它:
docker node rm m3
管理节点移除
Docker Swarm 不允许直接删除处于 Manager
角色的节点
先将该 Manager 节点 降级为 Worker,然后再删除
docker node update --role=worker 主机名docker swarm leave -f
再去管理节点清除信息
docker node rm 主机名
三、部署NGINX应用测试
3.1 service命令
Service(服务) 是一个抽象概念,表示你希望运行的应用(比如 Nginx、Redis 等),以及它的期望状态(如副本数、网络、端口等)。
Task(任务) 是服务在某个节点上的实际运行实例。每个 Task 对应一个容器(Container)。
只有 Manager 节点才能管理服务(执行这些命令)。
服务是 Swarm 模式下的核心资源之一,适合用于部署高可用、可扩展的分布式应用
查看service 帮助命令
docker service
命令 | 作用描述 | 常用用途/示例 |
---|---|---|
create | 创建一个新的服务(Service),由 Swarm 管理调度 | 启动一个 Nginx 服务并指定副本数:docker service create --replicas 3 -p 80:80 nginx |
inspect | 查看一个或多个服务的详细信息 | 查看服务配置和状态:docker service inspect my_service |
logs | 获取某个服务或任务的日志 | 查看服务日志:docker service logs my_service 查看具体任务日志:docker service logs <task_id> |
ls | 列出当前 Swarm 集群中的所有服务 | 查看所有运行的服务:docker service ls |
ps | 显示一个或多个服务的任务(Task)状态 | 查看服务下所有容器的状态:docker service ps my_service |
rm | 删除一个或多个服务 | 删除服务:docker service rm my_service |
rollback | 回滚服务到上一次配置(例如更新失败后恢复) | 回滚服务更新:docker service rollback my_service |
scale | 调整一个或多个服务的副本数量(Replicas) | 扩容服务:docker service scale my_service=5 |
update | 更新服务的配置(如镜像、环境变量、端口等),支持滚动更新 | 更新服务镜像并设置更新策略:docker service update --image nginx:1.21 --update-parallelism 2 my_service |
3.2 创建NGINX服务
docker service 服务启动,具有扩缩,滚动更新。
docker service create -p 8888:80 --name my-nginx nginx
Docker 会在集群中启动一个名为
my-nginx
的服务。该服务默认以 副本模式(Replicated) 运行一个任务(Task),也就是一个
nginx
容器。所有连接到 Swarm 节点(任意节点)的
8888
端口的请求都会被路由到运行着nginx
的容器中。如果你有多个节点,Swarm 可以根据策略自动调度任务到不同节点上运行。
3.3 查看NGINX服务
docker service ls
该命令用于列出当前 Docker Swarm 集群中所有的服务(Services)。
字段 | 含义 |
---|---|
ID | 服务的唯一标识符(内部使用,通常不需要手动处理) |
NAME | 服务的名称(比如你用 --name my-nginx 指定的) |
MODE | 服务的调度模式: - replicated :副本模式(指定数量的副本) - global :全局模式(每个节点运行一个任务) |
REPLICAS | 实际运行 / 期望的副本数(例如 3/3 表示所有副本都在正常运行) |
IMAGE | 使用的镜像名称和标签(如 nginx:latest ) |
PORTS | 端口映射信息(比如 *:8888->80/tcp 表示宿主机的 8888 端口映射到容器的 80 端口) |
必须在 Manager 节点 上执行此命令。
docker service ps my-nginx
这个命令用于查看指定服务(Service)的所有任务(Tasks)的运行状态。
它会输出该服务的完整配置信息(比如使用的镜像、副本数、环境变量、端口映射、调度约束等)以及当前的服务状态、任务状态等,是排查问题、了解服务详情的重要工具。
部分 | 内容说明 |
---|---|
ID | 服务的唯一 ID |
Spec | 服务的配置规范(最重要的部分) - 包括镜像、副本数、端口、更新策略、重启策略等 |
Endpoint | 服务暴露的网络信息 - 比如 VIP(虚拟 IP)、端口映射等 |
UpdateStatus | 最近一次服务更新的状态(是否成功) |
CreatedAt / UpdatedAt | 服务创建时间和最近更新时间 |
3.4 动态扩容
动态扩容,缓解主机被访问的压力。
docker service update
docker service update
的作用是:
在不中断服务的前提下,动态更新 Swarm 服务的配置(如镜像、副本数、端口、资源限制等),支持滚动更新和回滚功能,非常适合用于生产环境中的服务维护与升级。
是实现 滚动更新(rolling update) 的核心命令,适用于持续集成/持续部署(CI/CD)流程中非常有用。
选项 | 说明 | 示例 |
---|---|---|
--image | 更新服务使用的镜像 | --image nginx:1.21 |
--env-add , --env-rm | 添加或删除环境变量 | --env-add "ENV1=value1" |
--replicas | 设置新的副本数 | --replicas 5 |
--update-parallelism | 每次同时更新的任务数 | --update-parallelism 2 |
--update-delay | 设置两次更新之间的延迟时间 | --update-delay 10s |
--limit-cpu , --limit-memory | 设置资源限制 | --limit-cpu 2 --limit-memory 512M |
--restart-condition | 设置任务重启条件 | --restart-condition on-failure |
--network-add , --network-rm | 添加或移除网络 | --network-add my_network |
--publish-add , --publish-rm | 添加或移除端口映射 | --publish-add 8080:80 |
--rollback | 回滚到上一次配置 | --rollback |
-- 查询帮助命令
docker service update --help
docker service update \--image nginx:1.21 \--update-parallelism 2 \--update-delay 10s \my-nginx将 my-nginx 服务的容器镜像更新为 nginx:1.21
每次更新 2 个任务
每次更新之间间隔 10 秒(确保系统稳定)
测试访问NGINX服务
docker service ps my-mginx-- 去两个机器上测试访问
curl ip:8888
删除对应的服务
-- 只能在管理机器上使用
docker service rm my-nginx
3.5 模拟故障情况
当docker-m1管理主机发生宕机时,查看NGINX服务是否能够正常运行访问。
# 关闭docker-m1节点
[root@docker-m1 ~]# shutdown -h now
Connection to 192.168.66.146 closed by remote host.
Connection to 192.168.66.146 closed.
查看节点状态
[root@docker-m2 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
75dxq2qmzr2bv4tkg20gh0syr docker-m1 Down Active Unreachable 26.1.4
l2is4spmgd4b5xmmxwo3jvuf4 * docker-m2 Ready Active Reachable 26.1.4
u89a2ie2buxuc5bsew4a2wrpo docker-m3 Ready Active Leader 26.1.4
aon2nakgk87rds5pque74itw4 docker-n1 Ready Active 26.1.4
ljdb9d3xkzjruuxsxrpmuei7s docker-n2 Ready Active 26.1.4
[root@docker-m2 ~]#
查看服务状态
[root@docker-m2 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ngoi21hcjan5 my-nginx replicated 3/2 nginx:latest *:8888->80/tcp[root@docker-m2 ~]# docker service ps my-nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
w5azhbc3xrta my-nginx.1 nginx:latest docker-n2 Running Running 2 minutes ago
tteb16dnir6u my-nginx.2 nginx:latest docker-n1 Running Running 2 minutes ago
rgtjq163z9ch \_ my-nginx.2 nginx:latest docker-m1 Shutdown Running 17 minutes ago
四、调度模式
在 Docker Swarm 中,服务的调度模式(--mode
)确实分为两种:
replicated
:副本模式
定义:你指定一个期望的副本数量(如 3 个任务),Swarm 负责在集群中选择合适的节点来运行这些副本。
用途:适用于大多数场景,比如 Web 服务、数据库连接池等,你希望控制服务的整体规模而不必每个节点都跑一个。
docker service create \--name my-web \--replicas 3 \nginx
这会在集群中启动 3 个 Nginx 容器,具体分布在哪些节点上由 Swarm 自动决定。
global
:全局模式
定义:每个节点上运行一个任务(容器),不需要指定副本数。
用途:适合需要在每个节点上都部署的服务,例如日志收集器、监控代理、网络插件等。
docker service create \--name node-exporter \--mode global \prom/node-exporter
这会在集群中的每一个节点(Manager 和 Worker)上都启动一个 node-exporter
容器。
模式 | 含义 | 是否需要指定副本数 | 每个节点最多运行几个任务 | 典型使用场景 |
---|---|---|---|---|
replicated | 指定总副本数,Swarm 分配部署 | 是 | 0 或 1 | Web 服务、API 服务、数据库代理等 |
global | 每个节点自动运行一个任务 | 否 | 1 | 监控代理、日志采集、节点级守护进程 |
是否可以运行超过当前机器数量的容器?
当你创建一个服务时,Swarm 会在集群中的节点上为该服务创建多个任务(容器实例),每个任务都有一个全局唯一的任务ID和一个基于服务名称的任务名称格式如 <service-name>.<replica-number>
。
Swarm 节点 ≠ 任务上限
每台机器(节点)可以运行多个服务任务(容器),只要资源(CPU、内存等)允许。
Docker Swarm 默认会在所有可用节点中智能分配任务,包括重复地在同一个节点上部署多个任务。
全局模式 (
global
) 下:每个节点只运行一个任务副本模式 (
replicated
) 下的任务数量不受限于节点数