Docker Swarm 的 YAML 文件(通常为 docker-compose.yml 或 stack.yml)的详细解析

以下是 Docker Swarm 的 YAML 文件(通常为 docker-compose.yml 或 stack.yml)的详细解析,包含所有核心配置项及其作用:


一、基础结构示例

version: '3.8'  # 必须 ≥3.0 才支持 Swarm 模式

services:
  web:
    image: nginx:alpine
    deploy:
      replicas: 3
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
    networks:
      - frontend
    ports:
      - "8080:80"

networks:
  frontend:
    driver: overlay

二、核心配置项详解

1. deploy 部署配置(Swarm 特有)

deploy:
  replicas: 3                # 副本数(Replicated 模式)
  mode: replicated           # 或 global(每个节点运行1个副本)
  update_config:             # 滚动更新策略
    parallelism: 2           # 每次更新副本数
    delay: 10s               # 批次间隔
    failure_action: rollback # 失败时回滚
    order: start-first       # 新容器启动后再停止旧容器
  rollback_config:           # 回滚策略(同update_config)
  restart_policy:            # 重启策略
    condition: on-failure    # any|on-failure|none
    delay: 5s
    max_attempts: 3
    window: 120s
  placement:                 # 调度约束
    constraints:
      - "node.role==worker"  # 只在Worker节点运行
      - "engine.labels.storage==ssd"
    preferences:
      - spread: node.labels.zone  # 按zone标签均匀分布
  resources:                 # 资源限制
    limits:
      cpus: '0.5'
      memory: 512M
    reservations:            # 资源预留
      memory: 256M

2. services 服务配置

services:
  app:
    image: username/app:1.0  # 镜像地址
    command: ["python", "app.py"]  # 覆盖默认命令
    environment:             # 环境变量
      - DB_HOST=db
      - REDIS_CACHE=true
    env_file:               # 从文件加载环境变量
      - .env.prod
    configs:                # 配置文件
      - source: nginx_conf
        target: /etc/nginx/nginx.conf
    secrets:               # 敏感数据
      - source: db_password
        target: /run/secrets/dbpass
    volumes:              # 数据卷
      - "data:/var/lib/mysql"
    healthcheck:          # 健康检查
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      timeout: 10s
      retries: 3
    depends_on:           # 服务依赖(仅控制启动顺序)
      - db
      - redis

3. networks 网络配置

networks:
  frontend:
    driver: overlay       # Swarm必须用overlay跨主机通信
    attachable: true      # 允许独立容器连接
    driver_opts:         # 驱动参数
      encrypted: "yes"   # 加密网络流量
    ipam:               # IP地址管理
      config:
        - subnet: 10.1.0.0/24
          gateway: 10.1.0.1

4. volumes 数据卷配置

volumes:
  dbdata:
    driver: local
    driver_opts:
      type: nfs          # 使用NFS共享存储
      o: addr=192.168.1.100,rw
      device: ":/path/to/nfs"

5. configs 配置文件

configs:
  nginx_conf:
    file: ./nginx.conf    # 本地文件路径
    name: nginx_prod_conf # Swarm中显示的配置名

6. secrets 密钥管理

secrets:
  db_password:
    file: ./db_pass.txt   # 本地密钥文件

三、完整生产级示例

version: '3.8'

services:
  web:
    image: nginx:1.25
    deploy:
      replicas: 6
      update_config:
        parallelism: 2
        delay: 10s
      resources:
        limits:
          cpus: '1.0'
          memory: 1G
    configs:
      - source: nginx_conf
        target: /etc/nginx/conf.d/default.conf
    networks:
      - frontend
    ports:
      - "80:80"
      - "443:443"

  db:
    image: postgres:14
    deploy:
      placement:
        constraints:
          - "node.labels.db==true"
    secrets:
      - db_password
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD_FILE: /run/secrets/db_password

networks:
  frontend:
    driver: overlay
    attachable: true

volumes:
  pgdata:
    driver: local

configs:
  nginx_conf:
    file: ./nginx/nginx.conf

secrets:
  db_password:
    file: ./secrets/db_pass.txt

四、关键注意事项

  1. 版本兼容性:

    • Swarm 模式需要 version: '3.0' 及以上

    • 部分新功能(如 rollback_config)需 ≥3.7

  2. 部署命令:

    # 部署Stack
    docker stack deploy -c docker-compose.yml myapp
    
    # 查看服务
    docker stack services myapp
  3. 与普通 Compose 的区别:

    特性Swarm YAML普通 Compose YAML
    deploy 配置 ✅ 支持 ❌ 忽略
    build 指令 ❌ 不支持(需提前构建镜像) ✅ 支持
    network 驱动 必须 overlay 跨主机 通常用 bridge
  4. 最佳实践:

    • 使用 configs 管理配置文件,而非直接挂载

    • 敏感数据必须用 secrets 而非 environment

    • 为生产环境设置资源 limits 和 restart_policy


通过合理配置这些 YAML 选项,您可以高效管理 Swarm 集群中的服务编排、资源调度和网络拓扑。实际应用中建议结合 docker stack deploy 命令进行部署。

posted @ 2025-06-30 11:50  郭慕荣  阅读(137)  评论(0)    收藏  举报