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
- 
创建
docker-compose-nfs.ymlbashmkdir /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 - 
运行
bashtomcat_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文件 |