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文件
相关推荐
null or notnull6 小时前
java服务器空间不够时:将多个服务器的文件存放至同一个服务器上(使用映射器的办法)
java·运维·服务器·java-ee
Freshman小白6 小时前
python算法打包为docker镜像(边缘端api服务)
python·算法·docker
盈创力和20076 小时前
物联网 “神经” 之以太网:温湿度传感器的工业级 “高速干道”
运维·服务器·网络·嵌入式硬件·以太网温湿度传感器
eddy-原6 小时前
阿里云核心服务解析与应用实践
linux·运维·阿里云·云计算
路由侠内网穿透.6 小时前
外网访问可视化工具 Grafana (Linux版本)
linux·运维·服务器·grafana·远程工作
麦兜*6 小时前
Spring Boot 应用 Docker 监控:Prometheus + Grafana 全方位监控
spring boot·后端·spring cloud·docker·prometheus
爱吃糖的小秦同学6 小时前
Docker爆红且安装非C盘处理方案
运维·docker·容器
睿本云6 小时前
产品月报|睿本云10月产品功能迭代
运维·服务器·apache
!chen7 小时前
k8s-应用部署和组件及常用命令
云原生·容器·kubernetes