Docker Swarm部署实战:解析example-voting-app的docker-stack.yml文件
2025-07-08 02:54:59作者:蔡怀权
前言
在现代微服务架构中,Docker Swarm作为轻量级的容器编排工具,为开发者提供了简单高效的集群管理方案。本文将以example-voting-app项目的docker-stack.yml文件为例,深入剖析如何通过Docker Swarm部署一个完整的应用系统。
文件概览
这个docker-stack.yml文件定义了一个典型的应用架构,包含以下核心组件:
- 前端交互服务(vote)
- 结果展示服务(result)
- 后台处理服务(worker)
- Redis缓存服务
- PostgreSQL数据库服务
网络架构设计
该应用采用了清晰的前后端分离网络架构:
-
frontend网络:处理用户交互
- vote服务(前端交互界面)
- Redis(缓存数据)
-
backend网络:处理数据存储和计算
- result服务(结果展示)
- db服务(PostgreSQL数据库)
- worker服务(数据处理)
这种设计实现了良好的网络隔离,提高了系统安全性,同时worker服务作为桥梁连接了两个网络,确保数据能在前后端间安全流动。
服务详解
Redis服务
redis:
image: redis:alpine
networks:
- frontend
- 使用轻量级的alpine版本Redis镜像
- 部署在frontend网络,为vote服务提供高速缓存
- 存储临时数据,减轻数据库压力
PostgreSQL数据库
db:
image: postgres:15-alpine
environment:
POSTGRES_USER: "postgres"
POSTGRES_PASSWORD: "postgres"
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
- 使用PostgreSQL 15的alpine版本
- 配置了默认用户和密码(生产环境应修改)
- 通过命名卷db-data持久化数据
- 仅对backend网络开放,确保数据安全
交互服务(vote)
vote:
image: dockersamples/examplevotingapp_vote
ports:
- 5000:80
networks:
- frontend
deploy:
replicas: 2
- 用户交互的Web界面
- 映射主机5000端口到容器80端口
- 部署2个副本实现负载均衡和高可用
- 通过frontend网络与Redis通信
结果服务(result)
result:
image: dockersamples/examplevotingapp_result
ports:
- 5001:80
networks:
- backend
- 展示处理结果的Web界面
- 映射主机5001端口到容器80端口
- 通过backend网络访问数据库
工作服务(worker)
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
replicas: 2
- 数据处理后台服务
- 同时连接frontend和backend网络
- 部署2个副本确保处理能力
- 从Redis获取数据,处理后存入PostgreSQL
部署策略
-
副本控制:
- vote和worker服务都配置了2个副本,确保服务高可用
- 无状态服务适合多副本部署,而有状态服务(db, redis)保持单实例
-
资源隔离:
- 通过独立网络划分安全边界
- 前端服务暴露端口,后端服务仅内部访问
-
数据持久化:
- 仅为PostgreSQL配置了持久化卷
- Redis作为缓存不持久化,符合其设计定位
部署实践指南
-
初始化Swarm集群:
docker swarm init
-
部署应用栈:
docker stack deploy -c docker-stack.yml voteapp
-
验证服务状态:
docker service ls
-
访问应用:
- 交互界面:http://:5000
- 结果界面:http://:5001
生产环境建议
-
安全加固:
- 修改默认数据库凭证
- 考虑添加TLS加密
- 配置网络访问控制
-
监控扩展:
- 添加Prometheus监控
- 配置日志收集系统
-
高可用优化:
- 为数据库配置主从复制
- 考虑使用Redis集群
总结
这个docker-stack.yml文件展示了一个典型的微服务应用在Docker Swarm上的部署方案。通过分析我们可以学习到:
- 合理的服务拆分和网络隔离设计
- 无状态服务的多副本部署策略
- 有状态服务的持久化配置
- 前后端分离架构的实现方式
这种架构不仅适用于该应用,也可以作为其他类似Web应用的部署参考模板。理解这个配置文件的设计思路,将有助于开发者在实际项目中构建更健壮的容器化系统。