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 manager

hostnamectl set-hostname work01

hostnamectl 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 firewalld

setenforce 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
  1. Docker 会在集群中启动一个名为 my-nginx 的服务。

  2. 该服务默认以 副本模式(Replicated) 运行一个任务(Task),也就是一个 nginx 容器。

  3. 所有连接到 Swarm 节点(任意节点)的 8888 端口的请求都会被路由到运行着 nginx 的容器中。

  4. 如果你有多个节点,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) 下的任务数量不受限于节点数

相关推荐
AI视觉网奇9 分钟前
whisper tokenizer
linux·运维·服务器
NotStrandedYet1 小时前
信创国产Linux操作系统汇总:从桌面到服务器,百花齐放
linux·信创·国产化
特种加菲猫1 小时前
从文件到文件描述符:理解程序与文件的交互本质
linux·笔记
懋学的前端攻城狮2 小时前
深入浅出Linux-01:系统化掌握基础操作
linux·后端
计算机小手2 小时前
提升文档管理:推荐一键Docker部署的全文索引搜索引擎工具
经验分享·搜索引擎·docker·全文检索·开源软件
孙克旭_2 小时前
day064-kodbox接入对象存储与配置负载均衡
linux·运维·阿里云·负载均衡
东风微鸣2 小时前
职场生存指南:如何优雅应对"双面人"同事
docker·云原生·kubernetes·可观察性
Java侠3 小时前
graylog6.3 docker-compose部署全流程
运维·docker·容器·graylog·docker compose
大锦终3 小时前
【Linux】环境变量
linux·运维·服务器
萑澈3 小时前
我在 Arch Linux Plasma 6 Wayland 下驯服 Chromium 输入法的完整记录
linux·运维·服务器