找回密码
 立即注册
首页 业界区 安全 Docker Swarm

Docker Swarm

绂染 2025-6-1 18:18:23
Docker Swarm 集群

本文档介绍了 Docker Swarm 集群的基本概念、工作原理以及相关命令使用示例,包括如何在服务调度中使用自定义标签。本文档适用于需要管理和扩展 Docker 容器化应用程序的生产环境场景。
1. 什么是 Docker Swarm

Docker Swarm 是用于管理 Docker 集群的原生工具,从 Docker 1.12.0 版本开始,Swarm 已经内置于 Docker 引擎中。Swarm 可以将多台 Docker 主机组织成一个统一的虚拟主机,使用户能够轻松部署、管理和扩展容器化应用程序。
官方文档:Docker Swarm Overview
2. 与 Docker Compose 的区别


  • Docker Compose:适用于单节点环境,通过定义 docker-compose.yml 文件快速搭建和调试容器化应用。
  • Docker Swarm:专为生产环境设计,支持多节点集群管理和容器编排,还能实现零宕机滚动更新、弹性伸缩等高级功能。
3. Docker Swarm 的工作原理

3.1 基本概念


  • 节点 (Node)
    集群中的每个 Docker 主机都被称为一个节点。节点分为两种角色:

    • Manager 节点:负责集群的管理与控制,集群中可以有多个 Manager,但只有一个 Manager 被选举为 Leader。
    • Worker 节点:用于运行任务,由 Manager 分配任务后执行相应的容器操作。

  • 多重身份
    一个节点可以同时扮演 Manager 和 Worker 的角色。
  • Raft 协议
    使用 Raft 协议选举 Manager Leader 并同步状态信息,要求至少两个 Manager 参与选举。
3.2 工作流程


  • 集群初始化
    使用 docker swarm init 命令初始化集群,执行节点自动成为 Manager(通常也是 Leader)。
  • 节点加入
    其他 Docker 主机通过 Manager 节点分配的 token 加入集群,并被授予 Manager 或 Worker 角色。
  • 服务定义
    通过定义服务来描述容器应用程序,并由 Manager 将任务分配到合适的节点。任务是 Swarm 中最小的调度单位,而一个服务是多个任务的集合。
  • 调度策略
    Manager 节点按照调度策略(spread、binpack、random)选择合适的节点部署服务实例。
  • 容器编排
    Manager 负责执行创建、启动、停止、重启等操作,保证应用程序持续高可用运行。
4. Swarm 集群管理

4.1 集群节点准备

角色IPHostnameManager1172.16.10.110manager1Manager2172.16.10.111manager2Worker1172.16.10.120worker1Worker2172.16.10.121worker24.2 初始化集群

在 Manager1 上执行以下命令:
  1. docker swarm init --advertise-addr 172.16.10.110
复制代码
执行成功后,输出中会显示用于其他节点加入集群的 token。注意:

  • 参数 --advertise-addr 用于指定通信的 IP 地址(默认端口为 2377),在多网卡环境下建议指定。
查看 token:
  1. docker swarm join-token manager   # 查看管理节点 token
  2. docker swarm join-token worker    # 查看工作节点 token
复制代码
4.3 节点加入


  • 加入 Manager2
    在 Manager2 上执行(请替换  与对应的广播地址):
    1. docker swarm join --advertise-addr <Manager2_IP> --token <manager_token> 172.16.10.110:2377
    复制代码
  • 加入 Worker1 和 Worker2
    分别在 Worker 节点上执行:
    1. docker swarm join --advertise-addr <Manager2_IP> --token <manager_token> 172.16.10.110:2377
    复制代码
在 Manager1 上使用 docker node ls 查看当前集群状态。
4.4 集群解散

要将节点退出并从集群移除:

  • 在目标节点上执行:
    1. docker swarm leave [--force]   # Manager 节点退出需加 --force
    复制代码
  • 在 Manager 节点上删除该节点:
    1. docker node rm <节点名称>
    复制代码
5. 节点管理

以下命令需在 Manager 节点上执行(Worker 节点无操作权限):

  • 查看集群所有节点
    1. docker node ls
    复制代码
  • 查看指定节点详情
    1. docker node inspect <节点名称> --pretty
    复制代码
  • 节点升级与降级
    1. bash复制编辑docker node promote <节点名称>   # 将 Worker 升级为 Manager
    2. docker node demote <节点名称>     # 将 Manager 降级为 Worker
    复制代码
  • 节点下线(暂停任务调度)
    1. docker node update --availability drain <节点名称>
    复制代码
  • 节点上线
    1. docker node update --availability active <节点名称>
    复制代码
6. 服务管理

6.1 服务定义

创建服务时常用的命令格式如下:
  1. bash复制编辑docker service create --name <服务名> \
  2.   [-d] [-p] [-e] [--network] [--replicas] [--mount] \
  3.   image:tag
复制代码
示例


  • 测试 1:指定副本数、端口映射
    1. docker service create -d --name web-nginx --replicas 2 -p 80:80 nginx
    复制代码
  • 测试 2:传递环境变量
    1. bash复制编辑docker service create -d --name mysql --replicas=1 \
    2.   -p 3306:3306 \
    3.   -e MYSQL_ROOT_PASSWORD=123456 \
    4.   -e MYSQL_DATABASES=test \
    5.   mysql:5.7
    复制代码
6.2 服务查看


  • 查看所有服务:
    1. docker service ls
    复制代码
  • 查看指定服务及其任务分布:
    1. docker service ps <服务名>
    复制代码
示例输出:
  1. docker service lsID             NAME        MODE         REPLICAS   IMAGE          PORTS0jlt1yx8dcox   mysql       replicated   1/1        mysql:5.7      *:3306->3306/tcpfxha9cy659vu   web-nginx   replicated   3/3        nginx:1.24.0   *:80->80/tcpdocker service ps <服务名>mysqlID             NAME      IMAGE       NODE      DESIRED STATE   CURRENT STATE           ERROR     PORTSwit44m5i6plf   mysql.1   mysql:5.7   master    Running         Running 3 minutes ago
复制代码
6.3 服务移除
  1. docker service rm <服务名称>
复制代码
6.4 服务模式及调度


  • 服务模式

    • Replicated 模式(默认):在指定节点上运行多个副本。
    • Global 模式:在每个节点上都运行一个副本(适合日志收集、监控等场景)。
    示例:
    1. docker service create --name cadvisor --mode global \
    2.   --mount type=bind,src=/,dst=/rootfs,readonly \
    3.   --mount type=bind,src=/var/run,dst=/var/run \
    4.   --mount type=bind,src=/sys,dst=/sys,readonly \
    5.   --mount type=bind,src=/var/lib/docker/,dst=/var/lib/docker,readonly \
    6.   --publish 8888:8080 \
    7.   gcr.io/cadvisor/cadvisor:latest
    复制代码
  • 调度约束
    通过指定调度约束,可以控制服务任务只在符合要求的节点上运行。

    • 根据节点主机名调度:
      1. docker service create --name my-service \
      2.   --constraint 'node.hostname == node01' \
      3.   nginx:latest
      复制代码
    • 根据自定义标签调度:

      • 给节点添加自定义 Label
        在 Manager 节点上执行(假设给 node01 添加 hm=node01):
        1. docker node update --label-add hm=node01 node01
        复制代码
        查看节点标签:
        1. docker node inspect node01 --pretty
        复制代码
      • 使用标签调度创建服务
        1. docker service create --name my-service \
        2.   --constraint 'node.labels.hm == node01' \
        3.   nginx:latest
        复制代码
      在 docker-compose.yml 文件中也可通过 deploy.placement.constraints 设置:
      1. version: '3.8'
      2. services:
      3.   web:
      4.     image: nginx:latest
      5.     deploy:
      6.       replicas: 1
      7.       placement:
      8.         constraints:
      9.           - "node.labels.hm == node01"
      10.     ports:
      11.       - "80:80"
      复制代码
      部署命令:
      1. docker stack deploy -c docker-compose.yml mystack
      复制代码

  • 移除节点标签
    1. docker node update --label-rm hm node01
    复制代码
6.5 服务日志

查看服务日志:
  1. docker service logs <服务名>
复制代码
7. Swarm 集群的弹性伸缩

弹性伸缩指动态增加或减少服务任务数。

  • 创建服务时指定副本数
    1. docker service create -d --name mysql --replicas=2 \
    2.   -p 3306:3306 \
    3.   -e MYSQL_ROOT_PASSWORD=123456 \
    4.   mysql:5.7
    复制代码
  • 在线伸缩命令

    • 使用 update 命令:
      1. docker service update --replicas <新副本数> <服务名>
      复制代码
    • 或者使用 scale 命令:
      1. docker service scale <服务名>=<副本数>
      复制代码

8. Swarm 集群服务的滚动更新

滚动更新允许在不中断服务的情况下更新服务。常用于灰度发布与镜像升级。
8.1 更新命令示例

例如升级 MySQL 服务镜像版本,从 v5.7 到 v8.0,同时调整副本数量:
  1. docker service update --replicas 5 \
  2.   --image mysql:8.0 \
  3.   --update-delay 60s \
  4.   --update-parallelism 5 \
  5.   mysql
复制代码
参数说明:

  • --update-delay:指定滚动更新每个任务之间的延时(支持秒、分钟、小时)。
  • --update-parallelism:指定同时更新的任务数。
8.2 镜像版本回退

有两种方式:

  • 方式一:使用 rollback 命令
    1. docker service rollback mysql
    复制代码
    此命令会回滚到上次成功部署的状态。
  • 方式二:手动指定旧版本进行更新
    1. docker service update --image mysql:5.7 mysql
    复制代码
  • 查看更新状态
    1. docker service inspect --pretty mysql
    复制代码
    输出中 UpdateConfig 部分会显示当前服务的更新状态,例如 rollback_completed 表示已回滚。
9. 使用 Docker Compose 部署 Swarm 集群

9.1 docker service create 的局限

该命令一次只能创建一个服务,多个服务时较为繁琐,因此推荐使用 Compose 文件配合 docker stack deploy 部署整个应用堆栈。
9.2 Docker Compose 文件中的 Swarm 配置

在 Compose 文件中,可在 deploy 下配置与 Swarm 相关的属性。请注意,使用 docker-compose up 时会忽略 deploy 部分,因此必须通过 docker stack deploy 部署。
示例:
  1. yaml复制编辑version: '3.8'
  2. services:
  3.   web:
  4.     image: nginx:latest
  5.     deploy:
  6.       replicas: 2                   # 服务副本数
  7.       mode: replicated              # 服务模式:replicated(默认)或 global
  8.       placement:
  9.         constraints:
  10.           - "node.hostname == node01"      # 根据主机名调度
  11.           - "node.labels.hm == node01"       # 根据自定义标签调度
  12.       restart_policy:
  13.         condition: on-failure     # 仅在容器异常退出时重启
  14.         delay: 10s                # 尝试重启的间隔时间
  15.         max_attempts: 3           # 最大重启尝试次数
  16.     ports:
  17.       - "80:80"
复制代码
9.3 部署 Stack

使用以下命令部署堆栈:
  1. docker stack deploy -c docker-compose.yml mystack
复制代码

  • 查看堆栈列表:
    1. docker stack ls
    复制代码
  • 查看堆栈服务:
    1. docker stack services mystack
    复制代码
  • 查看堆栈任务:
    1. docker stack ps mystack
    复制代码
  • 删除堆栈:
    1. docker stack rm mystack
    复制代码

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册