首页
/ Docker Swarm部署实战:解析example-voting-app的docker-stack.yml文件

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数据库服务

网络架构设计

该应用采用了清晰的前后端分离网络架构:

  1. frontend网络:处理用户交互

    • vote服务(前端交互界面)
    • Redis(缓存数据)
  2. 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

部署策略

  1. 副本控制

    • vote和worker服务都配置了2个副本,确保服务高可用
    • 无状态服务适合多副本部署,而有状态服务(db, redis)保持单实例
  2. 资源隔离

    • 通过独立网络划分安全边界
    • 前端服务暴露端口,后端服务仅内部访问
  3. 数据持久化

    • 仅为PostgreSQL配置了持久化卷
    • Redis作为缓存不持久化,符合其设计定位

部署实践指南

  1. 初始化Swarm集群:

    docker swarm init
    
  2. 部署应用栈:

    docker stack deploy -c docker-stack.yml voteapp
    
  3. 验证服务状态:

    docker service ls
    
  4. 访问应用:

    • 交互界面:http://:5000
    • 结果界面:http://:5001

生产环境建议

  1. 安全加固:

    • 修改默认数据库凭证
    • 考虑添加TLS加密
    • 配置网络访问控制
  2. 监控扩展:

    • 添加Prometheus监控
    • 配置日志收集系统
  3. 高可用优化:

    • 为数据库配置主从复制
    • 考虑使用Redis集群

总结

这个docker-stack.yml文件展示了一个典型的微服务应用在Docker Swarm上的部署方案。通过分析我们可以学习到:

  1. 合理的服务拆分和网络隔离设计
  2. 无状态服务的多副本部署策略
  3. 有状态服务的持久化配置
  4. 前后端分离架构的实现方式

这种架构不仅适用于该应用,也可以作为其他类似Web应用的部署参考模板。理解这个配置文件的设计思路,将有助于开发者在实际项目中构建更健壮的容器化系统。