当前位置: 首页 > news >正文

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版本号角色备注
manager01192.168.66.14626.1.4管理节点主管
manager02192.168.66.15226.1.4管理节点从管
manager03192.168.66.15326.1.4管理节点从管
worker01192.168.66.15426.1.4工作节点工作
worker02192.168.66.15526.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
  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 或 1Web 服务、API 服务、数据库代理等
global每个节点自动运行一个任务1监控代理、日志采集、节点级守护进程

是否可以运行超过当前机器数量的容器?

当你创建一个服务时,Swarm 会在集群中的节点上为该服务创建多个任务(容器实例),每个任务都有一个全局唯一的任务ID和一个基于服务名称的任务名称格式如 <service-name>.<replica-number>

Swarm 节点 ≠ 任务上限

每台机器(节点)可以运行多个服务任务(容器),只要资源(CPU、内存等)允许。

Docker Swarm 默认会在所有可用节点中智能分配任务,包括重复地在同一个节点上部署多个任务。

全局模式 (global) 下:每个节点只运行一个任务

副本模式 (replicated) 下的任务数量不受限于节点数

http://www.lryc.cn/news/606869.html

相关文章:

  • 深度学习-梯度爆炸与梯度消失
  • 宝塔服务器挂载数据盘
  • Hive SQL (HQL) 编辑指南
  • Jupyter Notebook 使用指南
  • 深度解析:Nginx的卓越性能
  • Java 24 新特性解析与代码示例
  • 理想I8对撞乘龙卡车,AI基于数学和物理的角度如何看?
  • macOS卸载.net core 8.0
  • 基于OpenCV的cv2.solvePnP方法实现头部姿态估计
  • STM32-ESP8266Wi-Fi模块使用USART实现通信/创建AP和STA模式配置教程(寄存器版)
  • 预测性维护之温振传感器选型与应用秘籍
  • ubuntu22.04系统入门 linux入门(二) 简单命令 多实践以及相关文件管理命令
  • Node.js的用途和安装方法
  • CS231n2017-Lecture9经典CNN架构笔记
  • 关于继承的一些知识(C++)
  • visual studio 2015 编写C++ 静态库和动态库、调用静态库和动态库
  • C++--多态
  • 20257月29日-8月2日训练日志
  • 软件测试测评公司关于HTTP安全头配置与测试?
  • 用 Ubuntu 22.04 (Jammy) 的 MongoDB 源
  • Java 学习笔记:常用类、String 与日期时间处理
  • 新手小白做一个简单的微服务
  • oracle的安全加密有哪些?
  • Linux基础 -- 内核快速向用户态共享内核变量方案之ctl_table
  • 编程与数学 03-002 计算机网络 17_云计算与网络
  • 无人设备遥控器之多设备协同技术篇
  • Java,八股,cv,算法——双非研0四修之路day22
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘altair’问题
  • 【Leetcode hot 100】1.两数之和
  • 切比雪夫不等式