第十四篇:《Docker Swarm 生产实践:堆栈部署与配置管理》

上一篇文章介绍了 Swarm 的基础命令。但在生产环境中,我们更希望用声明式的方式定义整个应用栈(多个服务、网络、卷、密钥等)。Docker Stack 允许你使用熟悉的 docker-compose.yml 文件(版本 3 或更高)部署到 Swarm 集群。同时,Swarm 提供了 Secret 和 Config 来管理敏感数据和配置文件。本文将带你完成一个生产级应用的堆栈部署。

一、Docker Stack 概述

docker stack 命令是 Swarm 模式下对 Compose 文件的部署工具。它兼容 Compose 文件格式的 version 3 子集,并将整个应用栈作为一个整体进行管理。

对比:

docker-compose up:适用于单机开发环境。

docker stack deploy:适用于 Swarm 集群,支持多副本、滚动更新、secret/config 等。

二、编写 stack.yml(生产版 Compose)

以下是一个完整的 WordPress + MySQL 堆栈文件,包含 secret、网络、持久卷。

yaml 复制代码
version: '3.8'

services:
  wordpress:
    image: wordpress:latest
    ports:
      - "80:80"
    networks:
      - frontend
    environment:
      WORDPRESS_DB_HOST: mysql:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD_FILE: /run/secrets/db_password
      WORDPRESS_DB_NAME: wordpress
    secrets:
      - db_password
    deploy:
      replicas: 2
      update_config:
        parallelism: 1
        delay: 10s
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
sql 复制代码
 image: mysql:8.0
    networks:
      - backend
    environment:
      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD_FILE: /run/secrets/db_password
    secrets:
      - db_root_password
      - db_password
    volumes:
      - mysql-data:/var/lib/mysql
    deploy:
      placement:
        constraints: [node.role == manager]   # 可以约束到 manager 节点
      resources:
        limits:
          cpus: '1'
          memory: 1G

networks:
  frontend:
    driver: overlay
  backend:
    driver: overlay
    internal: true   # 禁止外部访问

volumes:
  mysql-data:
    driver: local

secrets:
  db_root_password:
    external: false   # 使用外部 secret 或自动创建
  db_password:
    external: false

三、管理 Secrets

Secret 用于存储敏感数据(密码、TLS 证书)。在 Swarm 中,secret 在创建时存储在集群的 Raft 存储中,并被加密传输。只有被授权的服务才能以文件形式挂载到容器内(/run/secrets/<secret_name>)。

3.1 从文件创建 secret

bash 复制代码
echo "rootpass123" | docker secret create db_root_password -
echo "wordpresspass" | docker secret create db_password -

3.2 列出 secret

bash 复制代码
docker secret ls

3.3 在 stack.yml 中引用

如上所示,在 service 的 secrets 字段列出需要使用的 secret 名称,并在 environment 中使用 _FILE 后缀变量(WordPress、MySQL 官方镜像支持读取密码文件)。

3.4 外部 secret

如果 secret 已在 Swarm 中创建,可以设置 external: true:

yaml 复制代码
secrets:
  db_root_password:
    external: true
    external_name: my-db-root-pass

四、管理 Configs

Config 用于非敏感配置信息(如 Nginx 配置文件、环境变量配置)。与 secret 类似,但不加密(更适合 git 管理)。

4.1 创建 config

bash 复制代码
docker config create nginx-conf ./nginx.conf

4.2 在 stack 中使用

yaml 复制代码
services:
  nginx:
    image: nginx
    configs:
      - source: nginx-conf
        target: /etc/nginx/conf.d/default.conf
        mode: 0440
configs:
  nginx-conf:
    external: true

五、部署堆栈

bash 复制代码
docker stack deploy -c stack.yml myapp

myapp 是堆栈名称,资源会以 myapp_ 为前缀。

查看堆栈和服务:

bash 复制代码
docker stack ls
docker stack ps myapp
docker service ls --filter label=com.docker.stack.namespace=myapp

六、更新堆栈

修改 stack.yml 后,再次执行 docker stack deploy 会触发滚动更新。Swarm 会按照 update_config 策略更新服务。

七、服务约束与标签

可以利用节点标签约束服务部署位置。

bash 复制代码
# 给节点打标签
docker node update --label-add storage=ssd worker1

# 在服务中约束
deploy:
  placement:
    constraints:
      - node.labels.storage == ssd
      - node.role == worker

八、滚动更新与健康检查

在服务定义中加入健康检查:

yaml 复制代码
services:
  wordpress:
    image: wordpress
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      timeout: 3s
      retries: 3

配合 update_config 的 monitor 参数,Swarm 可以监控新实例的健康状态,如果失败则停止更新。

九、删除堆栈

bash 复制代码
docker stack rm myapp

这会删除所有相关服务、网络,但不会删除 volumes 和 secrets(需手动清理)。

十、生产环境最佳实践

Manager 节点数量:奇数,推荐 3 或 5。

持久存储:使用 NFS、Rex-Ray 等共享存储插件,保证 Pod 迁移后数据不丢失。

日志管理:使用 logging 驱动(如 syslog、fluentd)集中收集。

监控:部署 Prometheus + Grafana 监控 Swarm 集群(可通过 docker service 部署)。

CI/CD:在流水线中执行 docker stack deploy,实现蓝绿或金丝雀发布。

网络安全:overlay 网络默认加密(可启用 --opt encrypted)。

备份:定期备份 Raft 存储(/var/lib/docker/swarm)。

十一、与 Kubernetes 的对比

十二、小结

通过 Docker Stack,你可以将多服务应用以声明式方式部署到 Swarm 集群,并享受滚动更新、secret、config 等生产级特性。Swarm 是中小团队尝试容器编排的绝佳入口。

相关推荐
qq_452396232 小时前
第十三篇:《Docker Swarm 集群基础》
运维·docker·容器
biter down2 小时前
6:参数化
运维·服务器
海域云-罗鹏3 小时前
企业服务器遭到网络攻击该如何解决?应急处理与长效防护方案
运维·服务器·安全
取经蜗牛4 小时前
docker环境中redis连接三种场景配置指南,物理机、wsl、docker
redis·docker·容器
YOU OU4 小时前
Linux基本使用和程序部署
linux·运维·服务器
尼莫点nemo4 小时前
docker-builder:把 .devcontainer/ 从手写变成一句话生成
docker
AI行业学习4 小时前
PuTTY 工具下载部署、基础配置及 SSH 远程服务器连接完整操作指南Windows 平台 【2026.6.1】
运维·windows·ssh
jiayong234 小时前
CI/CD深度解析01-核心概念与原理
运维·git·ci/cd
fred_kang4 小时前
如何找到 Linux 服务器上某个 URL 路径对应的实际部署位置
linux·运维·服务器