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 Stack Docker Service Docker 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 仅显示服务 ID docker stack services -q mystack
    --format 自定义输出格式(Go 模板语法) docker stack services --format "{``{.Name}}: {``{.Replicas}}" mystack
  • docker stack down : 停止堆栈中的任务

swarm挂载nfs

nfs搭建继续补充上节的

  • 创建docker-compose-nfs.yml

    bash 复制代码
    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    
  • 运行

    bash 复制代码
    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编排出来的网络与存储

    bash 复制代码
    [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

      bash 复制代码
      ~]# 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 文件

      bash 复制代码
      ~]# 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]
    • 部署服务

      bash 复制代码
      [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 网络

        bash 复制代码
        ~]# docker network ls
        NETWORK ID     NAME               DRIVER    SCOPE
        df4690d294a7   docker_gwbridge    bridge    local
        ntuv8sh1figk   ingress            overlay   swarm

总结一下

组件 作用范围 核心能力 依赖关系
Dockerfile 开发环境 构建单镜像
Docker Compose 单机/开发 编排多容器应用 依赖本地镜像
Docker Swarm 多主机集群 集群资源调度与容器编排 需初始化Swarm模式
Docker Stack Swarm集群 部署Compose定义的多服务 依赖Swarm与Compose文件
相关推荐
贝锐2 分钟前
多校区互通、临时联网、远程运维,校园网络升级用蒲公英更省心!
运维·组网
云川之下12 分钟前
【k8s】Docker inspect 命令
docker·容器·kubernetes
游戏开发爱好者830 分钟前
App Store 上传 IPA 自动化,.p8 密钥认证与 CI/CD 接入实战
android·运维·ci/cd·小程序·uni-app·自动化·iphone
天疆说38 分钟前
04 稳定性与性能调优实录:OOM 崩溃、并发槽位、前缀缓存与 DSpark 调参
linux·运维·缓存
微硬创新39 分钟前
大点数模拟量采集落地:耐达讯自动化32路0-20mA适配PROFINET总线实践解析
运维·人工智能·网络协议·自动化·信息与通信
猫吃了源码1 小时前
CentOS7使用Kubeadm安装部署K8s(Kubernetes)最新稳定版本1.26.x
云原生·容器·kubernetes
GIS数据转换器1 小时前
村镇无人机物流配送与跨域监测一体化平台
大数据·运维·人工智能·科技·无人机
倔强的石头1062 小时前
飞牛OS部署Mtab:Docker搭建自托管书签导航并实现远程访问
运维·docker·容器
张忠琳2 小时前
【k3s】AutoK3s v0.9.3 —— Part 7 辅助模块超深度逐行分析
云原生·容器·kubernetes·k3s·autok3s
jerryinwuhan11 小时前
《系统部署与运维》开篇 课程介绍
运维