第十四篇:《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、网络、持久卷。version:3.8services:wordpress:image:wordpress:latestports:-80:80networks:-frontendenvironment:WORDPRESS_DB_HOST:mysql:3306WORDPRESS_DB_USER:wordpressWORDPRESS_DB_PASSWORD_FILE:/run/secrets/db_passwordWORDPRESS_DB_NAME:wordpresssecrets:-db_passworddeploy:replicas:2update_config:parallelism:1delay:10srestart_policy:condition:on-failureresources:limits:cpus:0.5memory:512Mimage: mysql:8.0networks:-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.rolemanager]# 可以约束到 manager 节点resources: limits: cpus:1memory:1G networks: frontend: driver: overlay backend: driver: overlay internal:true# 禁止外部访问volumes: mysql-data: driver:localsecrets: db_root_password: external:false# 使用外部 secret 或自动创建db_password: external:false三、管理 SecretsSecret 用于存储敏感数据密码、TLS 证书。在 Swarm 中secret 在创建时存储在集群的 Raft 存储中并被加密传输。只有被授权的服务才能以文件形式挂载到容器内/run/secrets/secret_name。3.1 从文件创建 secretechorootpass123|dockersecret create db_root_password -echowordpresspass|dockersecret create db_password -3.2 列出 secretdockersecretls3.3 在 stack.yml 中引用如上所示在 service 的 secrets 字段列出需要使用的 secret 名称并在 environment 中使用 _FILE 后缀变量WordPress、MySQL 官方镜像支持读取密码文件。3.4 外部 secret如果 secret 已在 Swarm 中创建可以设置 external: truesecrets:db_root_password:external:trueexternal_name:my-db-root-pass四、管理 ConfigsConfig 用于非敏感配置信息如 Nginx 配置文件、环境变量配置。与 secret 类似但不加密更适合 git 管理。4.1 创建 configdockerconfig create nginx-conf ./nginx.conf4.2 在 stack 中使用services:nginx:image:nginxconfigs:-source:nginx-conftarget:/etc/nginx/conf.d/default.confmode:0440configs:nginx-conf:external:true五、部署堆栈dockerstack deploy-cstack.yml myappmyapp 是堆栈名称资源会以 myapp_ 为前缀。查看堆栈和服务dockerstacklsdockerstackpsmyappdockerservicels--filterlabelcom.docker.stack.namespacemyapp六、更新堆栈修改 stack.yml 后再次执行 docker stack deploy 会触发滚动更新。Swarm 会按照 update_config 策略更新服务。七、服务约束与标签可以利用节点标签约束服务部署位置。# 给节点打标签dockernodeupdate --label-addstoragessd worker1# 在服务中约束deploy: placement: constraints: - node.labels.storagessd - node.roleworker八、滚动更新与健康检查在服务定义中加入健康检查services:wordpress:image:wordpresshealthcheck:test:[CMD,curl,-f,http://localhost]interval:30stimeout:3sretries:3配合 update_config 的 monitor 参数Swarm 可以监控新实例的健康状态如果失败则停止更新。九、删除堆栈dockerstackrmmyapp这会删除所有相关服务、网络但不会删除 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 是中小团队尝试容器编排的绝佳入口。