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.ymlmkdir /data/tomcat_stack_nfs vim docker-compose-nfs.yaml services:tomcat:image: tomcat:8.5.100container_name: t1ports:- "8088:8080"networks:- tomcat_nfsvolumes:- tomcat_data:/usr/local/tomcat/webappsdeploy:replicas: 3volumes:tomcat_data:driver: localdriver_opts:type: nfso: addr=10.4.50.139,rwdevice: ":/opt/volumetest/volume/"networks:tomcat_nfs:# 如果是swarm集群,则使用overlaydriver: overlay -  
运行
tomcat_stack_nfs]# docker stack deploy -c docker-compose-nfs.yaml tnfs1 Creating network tnfs1_tomcat_nfs Creating service tnfs1_tomcattomcat_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 ls0n0gkryqsga4 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.ymlservices:visualizer:image: dockersamples/visualizerports:- "8080:8080"volumes:- "/var/run/docker.sock:/var/run/docker.sock"deploy:replicas: 1placement:constraints: [node.role == manager]portainer:image: portainer/portainerports:- "9000:9000"volumes:- "/var/run/docker.sock:/var/run/docker.sock"deploy:replicas: 1placement: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 Stack | Swarm集群 | 部署Compose定义的多服务 | 依赖Swarm与Compose文件 | 
