16、Docker swarm-3 - 指南

Docker swarm-3

本章要点

参考文档:Docker Swarm 全面总结dockerSwarm nfs挂载Docker之Swarm详细讲解Docker多主机环境中使用NFS共享存储容器技术—docker stack纳米ai参数接上章

docker stack概述

Docker Stack是Docker生态系统中基于Swarm集群的容器编排工具,用于在多台机器上部署和管理具有依赖关系的服务

  • 核心功能

    • Docker Stack通过单个声明文件(compose文件)定义服务依赖关系,支持应用的完整生命周期管理,包括初始化部署、健康检查、扩容、更新和回滚等操作。它基于Swarm集群实现服务编排,适用于生产环境和大规模部署。
  • 与swarm的关系

    • Stack是Swarm集群的扩展,依赖Swarm提供底层集群管理功能(如服务发现、负载均衡等),解决了 Compose 仅能单机使用、Docker Service 无法编排多服务的痛点。
    • 它允许用户通过单个 docker-compose.yml 文件定义复杂应用(如包含前端、数据库、缓存的完整系统),并一键部署到 Swarm 集群,自动处理服务调度、网络配置和生命周期管理
  • 特性比较

    特性Docker StackDocker ServiceDocker Compose
    部署范围多主机 Swarm 集群多主机 Swarm 集群单主机
    服务数量支持多服务编排(含依赖)仅单服务部署支持多服务编排
    配置文件基于 docker-compose.yml命令行参数或 YAML基于 docker-compose.yml
    核心功能部署、扩缩容、更新、回滚单服务启停、扩缩容单机多服务启停
  • 功能说明

    • Stack 能够在单个声明文件中定义复杂的多服务应用,还提供了简单的方式来部署应用并管理其完整的生命周期:初始化部署 -> 健康检查 -> 扩容 -> 更新 -> 回滚,以及其他功能!可以简单地理解为 Stack 是集群下的Compose。

    • 由于 build 关键字在 Stack 中不受支持,不能在编排的过程中构建镜像,docker stack 部署用到的镜像必须是已经构建发布好并且发布到 docker 仓库的,在服务编排过程中各个节点直接从 docker 仓库拉取。

参数说明

  • docker stack deploy :部署或更新堆栈(基于 Compose 文件)

    选项说明示例
    -c / --compose-file指定 Compose 文件路径docker stack deploy -c docker-compose.yml mystack
    --bundle-file使用 DAB 文件(分布式应用包)docker stack deploy --bundle-file app.dab mystack
    --prune删除未在 Compose 文件中定义的服务docker stack deploy -c docker-compose.yml --prune mystack
  • docker stack ls :列出所有运行中的堆栈

    选项说明示例
    显示基础信息docker stack ls
  • docker stack ps : 查看堆栈中所有任务的运行状态

    选项说明示例
    -f / --filter按条件过滤任务(如状态、节点)docker stack ps -f "desired-state=running" mystack
    --no-trunc显示完整输出(不截断)docker stack ps --no-trunc mystack
  • docker stack rm : 删除指定堆栈及其所有服务

    选项说明示例
    移除堆栈资源docker stack rm mystack
  • docker stack services :列出堆栈内的所有服务

    选项说明示例
    -q / --quiet仅显示服务 IDdocker stack services -q mystack
    --format自定义输出格式(Go 模板语法)docker stack services --format "{{.Name}}: {{.Replicas}}" mystack
  • docker stack down : 停止堆栈中的任务

swarm挂载nfs

nfs搭建继续补充上节的

  • 创建docker-compose-nfs.yml

    mkdir /data/tomcat_stack_nfs
    vim docker-compose-nfs.yaml
    services:
    tomcat:
    image: tomcat:8.5.100
    container_name: t1
    ports:
    - "8088:8080"
    networks:
    - tomcat_nfs
    volumes:
    - tomcat_data:/usr/local/tomcat/webapps
    deploy:
    replicas: 3
    volumes:
    tomcat_data:
    driver: local
    driver_opts:
    type: nfs
    o: addr=10.4.50.139,rw
    device: ":/opt/volumetest/volume/"
    networks:
    tomcat_nfs:
    # 如果是swarm集群,则使用overlay
    driver: overlay
  • 运行

    tomcat_stack_nfs]# docker stack deploy -c docker-compose-nfs.yaml tnfs1
    Creating network tnfs1_tomcat_nfs
    Creating service tnfs1_tomcat
    tomcat_stack_nfs]# curl  http://10.4.50.139:8088/index.jsp
    <div class="hostname">cc7d3b612e24</div>
      <div class="hostname">1d8ce96a35d2</div>
        <div class="hostname">f4d5910060cc</div>
  • 查看通过stack编排出来的网络与存储

    [root@node167 ~]# docker inspect tnfs1_tomcat_data
    [
    {
    "CreatedAt": "2025-10-31T13:41:13+08:00",
    "Driver": "local",
    "Labels": {
    "com.docker.stack.namespace": "tnfs1"
    },
    "Mountpoint": "/var/lib/docker/volumes/tnfs1_tomcat_data/_data",
    "Name": "tnfs1_tomcat_data",
    "Options": {
    "device": ":/opt/volumetest/volume/",
    "o": "addr=10.4.50.139,rw",
    "type": "nfs"
    },
    "Scope": "local"
    }
    ]
    # 查看对应网络
    [root@node167 ~]# docker network ls
    0n0gkryqsga4   tnfs1_tomcat_nfs   overlay   swarm
    [root@node167 ~]# docker network inspect tnfs1_tomcat_nfs
    [
    {
    "Name": "tnfs1_tomcat_nfs",
    "Id": "0n0gkryqsga449luhzo1vt6jm",
    "Created": "2025-10-31T13:42:23.597292224+08:00",
    "Scope": "swarm",
    "Driver": "overlay",
    "IPAM": {
    "Driver": "default",
    "Options": null,
    "Config": [
    {
    "Subnet": "10.0.3.0/24",
    "Gateway": "10.0.3.1"
    }
    ]
    },
    }
    ]

多服务 Swarm 集群部署

这里部署的服务有三个 (nginx服务,visualizer 服务,portainer 服务) 除了 nginx 服务作为示例之外,visualizer(官方地址)和 portainer(官方地址)都是集群 GUI 管理服务。

  • 示例

    • 先用加速下载visualizer与portainer

      ~]# docker pull docker.gh-proxy.com/dockersamples/visualizer
      ~]# docker tag docker.gh-proxy.com/dockersamples/visualizer:latest dockersamples/visualizer:latest
      ~]# docker pull docker.gh-proxy.com/portainer/portainer
      ~]# docker tag docker.gh-proxy.com/portainer/portainer:latest portainer/portainer:latest
    • 编写 docker-compose.yml 文件

      ~]# mkdir swarmGUI
      ~]# cd swarmGUI
      ~]# cat docker-compose.yml
      services:
      visualizer:
      image: dockersamples/visualizer
      ports:
      - "8080:8080"
      volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
      deploy:
      replicas: 1
      placement:
      constraints: [node.role == manager]
      portainer:
      image: portainer/portainer
      ports:
      - "9000:9000"
      volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
      deploy:
      replicas: 1
      placement:
      constraints: [node.role == manager]
    • 部署服务

      [root@node139 swarmGUI]# docker stack deploy -c docker-compoe-portainer.yaml portain
      Creating network portain_default
      Creating service portain_visualizer
      Creating service portain_portainer
      [root@node139 swarmGUI]# docker stack ls
      NAME      SERVICES
      portain   2   <-- 这个是有两个服务
      tnfs1     1   <-- 上面的示例
      [root@node139 swarmGUI]# docker stack ps portain
      ID             NAME                   IMAGE                             NODE      DESIRED STATE   CURRENT STATE           ERROR     PORTS
      zmfb5aj09ujx   portain_portainer.1    portainer/portainer:latest        node139   Running         Running 2 minutes ago
      6pyxrmmuats2   portain_visualizer.1   dockersamples/visualizer:latest   node139   Running         Running 2 minutes ago
    • 访问并配置,设置密码

      请添加图片描述

      如果长时间不用,它会提示个安全问题, 去服务器上找到对应的容器id docker restart 容器id

      请添加图片描述

      请添加图片描述
      请添加图片描述

    • 访问 dockersamples/visualizer 8080的那个服务, 以页面形式展示每台节点,还是蛮不错的,按颜色分组

      请添加图片描述

Docker Swarm 网络管理

  • Swarm 集群产生两种不同类型的流量

    • 控制和管理层面:包括 Swarm 消息管理等,例如请求加入或离开Swarm,这种类型的流量总是被加密的。(涉及到集群内部的hostname、ip-address、subnet、gateway等)
    • 应用数据层面:包括容器与客户端的通信等。(涉及到防火墙、端口映射、网口映射、VIP等)
  • 在 Swarm Service 中有三个重要的网络概念

    • Overlay networks :覆盖物网络,顾名思义是附着在主机底层网络之上的网络, 这个网络保证了不同主机之间容器通信,手动创建

    • ingress network:进入网络,顾名思义是外部客户端访问服务时,服务节点间负载均衡(节点在开放端口上收到请求,上交给IPVS,选择容器),是一种特殊的overlay网络创建集群的时候自动创建
      初始化或加入 Swarm 集群时会自动创建 ingress 网络,大多数情况下,用户不需要自定义配置,但是 docker 17.05 和更高版本可以自定义网络

    • docker_gwbridge是一种桥接网络,将 overlay 网络(包括 ingress 网络)连接到一个单独的 Docker 守护进程的物理网络。默认情况下,服务正在运行的每个容器都连接到本地 Docker 守护进程主机的 docker_gwbridge 网络。

    • docker_gwbridge 网络在初始化或加入 Swarm 时自动创建。大多数情况下,用户不需要自定义配置,但是 Docker 允许自定义。

      • 在初始化或刚加入 Swarm 集群时,会创建一个 Ingress 和 docker-gwbridge 网络

        ~]# docker network ls
        NETWORK ID     NAME               DRIVER    SCOPE
        df4690d294a7   docker_gwbridge    bridge    local
        ntuv8sh1figk   ingress            overlay   swarm

总结一下

组件作用范围核心能力依赖关系
Dockerfile开发环境构建单镜像
Docker Compose单机/开发编排多容器应用依赖本地镜像
Docker Swarm多主机集群集群资源调度与容器编排需初始化Swarm模式
Docker StackSwarm集群部署Compose定义的多服务依赖Swarm与Compose文件
posted @ 2025-11-30 10:58  gccbuaa  阅读(20)  评论(0)    收藏  举报