Docker Swarm 集群实战指南:从搭建到生产落地的完整攻略

Docker Swarm 集群实战指南:从搭建到生产落地的完整攻略

在容器编排领域,Kubernetes 的强大无需多言,但对于中小规模应用或追求轻量化部署的场景,Docker 原生的 Swarm 集群工具更具优势 ------ 无需额外部署复杂组件,与 Docker 引擎深度集成,上手成本低且能满足高可用、弹性扩缩容的核心需求。本文将从核心概念拆解、集群搭建实战、生产环境落地三个维度,带你全面掌握 Docker Swarm 的使用技巧。

一、Docker Swarm 核心概念解析

Docker Swarm 的本质是将多台 Docker 主机抽象为一个虚拟集群,通过统一入口管理所有节点的容器资源。理解以下核心概念,是掌握 Swarm 集群的基础:

1.1 集群架构核心组件

组件 核心作用 关键说明
管理节点(Manager Node) 集群控制中心,负责配置管理、服务调度、状态同步 需部署奇数个(3/5 个) 保证高可用,通过 Raft 一致性协议同步配置,避免脑裂
工作节点(Worker Node) 接收管理节点指令,运行容器实例 无集群管理权限,数量可根据算力需求灵活扩展
服务(Service) 集群编排核心单元 定义容器镜像、副本数、网络配置等规则,替代单机 docker run 命令
任务(Task) 服务的最小执行单元 对应一个具体容器实例,服务副本数为 3 时会创建 3 个任务分发到不同节点
栈(Stack) 多服务组合管理单元 基于 Compose 文件(版本 ≥3.0),支持一键部署/更新/销毁关联应用(如前端+后端+数据库)

1.2 关键网络与存储概念

概念 类型 核心作用
Overlay 网络 跨节点虚拟网络 实现不同节点容器互通,内置服务发现(容器可通过服务名直接通信)
Ingress 网络 特殊 Overlay 网络 Swarm 自动创建,用于服务负载均衡,外部请求通过 IPVS 路由到可用容器
集群卷(Volume) 数据持久化存储 支持本地卷/网络卷(NFS/GlusterFS),跨节点共享数据需用网络卷保证一致性

二、Docker Swarm 集群搭建实战

2.1 前置准备条件

  1. 操作系统:所有节点系统一致(推荐 Ubuntu 20.04+/CentOS 7+);
  2. 网络配置:关闭防火墙或放行关键端口:
    • 2377/tcp(集群管理)
    • 7946/tcp/udp(节点通信)
    • 4789/udp(Overlay 网络);
  3. Docker 环境:所有节点安装 Docker ≥19.03,启动服务并配置镜像加速;
  4. 网络互通:节点间可通过 IP/主机名访问,无网络隔离。

2.2 集群搭建步骤

(1)初始化管理节点

在选定的主管理节点执行初始化命令,指定内网 IP 确保其他节点可访问:

bash 复制代码
docker swarm init --advertise-addr 192.168.1.100

执行成功后会输出工作节点/管理节点的加入命令(含唯一令牌),需妥善保存。

(2)添加高可用管理节点

为避免单节点故障,需添加备用管理节点(总数保持奇数,推荐 3 个):

bash 复制代码
# 1. 主管理节点生成加入令牌
docker swarm join-token manager

# 2. 备用管理节点执行生成的命令(示例)
docker swarm join --token SWMTKN-1-xxxx 192.168.1.100:2377
(3)添加工作节点
bash 复制代码
# 1. 主管理节点生成工作节点令牌
docker swarm join-token worker

# 2. 所有工作节点执行生成的命令(示例)
docker swarm join --token SWMTKN-1-xxxx 192.168.1.100:2377
(4)验证集群状态

在任意管理节点执行命令查看节点列表:

bash 复制代码
docker node ls

输出示例(3 管理节点 + 2 工作节点)

复制代码
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
abc123...                     manager-1  Ready     Active         Leader           20.10.21
def456...                     manager-2  Ready     Active         Reachable        20.10.21
ghi789...                     manager-3  Ready     Active         Reachable        20.10.21
jkl012...                     worker-1   Ready     Active         None             20.10.21
mno345...                     worker-2   Ready     Active         None             20.10.21

Leader:当前主管理节点;Reachable:备用管理节点。

2.3 核心管理操作实战

(1)服务管理
bash 复制代码
# 1. 创建 Nginx 服务(3 副本,端口映射 80:80)
docker service create --name nginx-service --replicas 3 -p 80:80 nginx:1.24

# 2. 查看服务列表
docker service ls

# 3. 查看服务详情(运行节点、任务状态)
docker service ps nginx-service

# 4. 扩缩容服务(调整至 5 副本)
docker service scale nginx-service=5

# 5. 升级服务镜像(1.24 → 1.25)
docker service update --image nginx:1.25 nginx-service

# 6. 删除服务
docker service rm nginx-service
(2)栈(Stack)部署多服务应用

创建 docker-compose.yml 文件(定义 Web + MySQL 组合):

yaml 复制代码
version: "3.8"
services:
  web:
    image: nginx:1.24
    ports:
      - "80:80"
    deploy:
      replicas: 3
      restart_policy:
        condition: on-failure  # 故障时自动重启
        max_attempts: 3       # 最大重启次数
      placement:
        constraints: [node.role == worker]  # 仅调度到工作节点
  db:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    volumes:
      - db-data:/var/lib/mysql  # 挂载持久化卷
    deploy:
      placement:
        constraints: [node.labels.type == db-node]  # 调度到带 db-node 标签的节点

volumes:
  db-data:  # 定义持久化卷

栈部署与管理命令:

bash 复制代码
# 部署栈(myapp 为栈名,-c 指定 Compose 文件)
docker stack deploy -c docker-compose.yml myapp

# 查看栈中服务
docker stack services myapp

# 销毁栈(删除所有关联服务)
docker stack rm myapp
(3)节点与网络管理
bash 复制代码
# 1. 给节点打标签(用于调度约束)
docker node update --label-add type=db-node worker-1

# 2. 禁止节点调度(维护前操作)
docker node update --availability drain worker-1

# 3. 恢复节点调度
docker node update --availability active worker-1

# 4. 创建 Overlay 网络(多服务通信)
docker network create --driver overlay my-overlay-network

# 5. 创建 NFS 网络卷(跨节点共享数据)
docker volume create --driver local \
  --opt type=nfs \
  --opt o=addr=192.168.1.200,rw \
  --opt device=:/nfs/share \
  my-nfs-volume

三、生产环境落地经验与思考

3.1 集群架构设计建议

结合电商后台服务(日均 PV 10 万+)落地案例,生产环境推荐架构:

组件 配置建议 部署要求
管理节点 3 台,2 核 4G 分布在不同机柜,避免物理机故障
工作节点 4 核 8G 起步 分可用区部署(如机房 A 4 台 + 机房 B 4 台)
网络 自定义 Overlay 网络 按业务隔离,外部流量通过 Nginx 接入 Ingress 网络
存储 核心数据:NFS/EFS;非核心数据:本地卷 核心数据保证一致性,非核心数据提升读写性能

3.2 高可用与稳定性保障

  1. 管理节点高可用:必须部署 3/5 个管理节点,Raft 协议要求多数节点在线才能正常提供服务;

  2. 服务重启策略 :所有服务配置重启规则,防止容器异常退出:

    yaml 复制代码
    restart_policy:
      condition: on-failure
      max_attempts: 3
      delay: 5s
  3. 资源限制 :为每个服务设置 CPU/内存限制,避免耗尽节点资源:

    yaml 复制代码
    deploy:
      resources:
        limits:
          cpus: '0.5'    # 最大 0.5 核
          memory: 512M   # 最大 512MB
        reservations:
          cpus: '0.2'    # 预留 0.2 核
          memory: 256M   # 预留 256MB
  4. 滚动更新与回滚 :升级时控制并行数和延迟,避免服务不可用:

    bash 复制代码
    # 滚动升级(每次更新 1 个副本,间隔 10 秒)
    docker service update --image nginx:1.25 --update-parallelism 1 --update-delay 10s nginx-service
    
    # 升级失败回滚
    docker service rollback nginx-service

3.3 安全与配置管理

  1. 私有镜像仓库 :生产环境必须使用私有仓库(Harbor/AWS ECR),镜像打版本标签(禁止 latest);

  2. 敏感信息管理 :使用 Docker Secret 存储密码/密钥,避免硬编码:

    bash 复制代码
    # 创建 Secret(从标准输入读取密码)
    echo "123456" | docker secret create mysql_root_pwd -

    在 Compose 文件中引用:

    yaml 复制代码
    services:
      db:
        image: mysql:8.0
        secrets:
          - mysql_root_pwd
        environment:
          - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql_root_pwd
    secrets:
      mysql_root_pwd:
        external: true

3.4 监控与故障排查

(1)监控工具选型
  • 资源监控:Prometheus + Grafana(节点/容器 CPU、内存、磁盘);
  • 日志收集:ELK 栈 / Sematext(实时分析容器日志)。
(2)常用排查命令
bash 复制代码
# 实时查看服务日志
docker service logs -f nginx-service

# 查看节点资源使用情况
docker stats

# 查看集群详细信息
docker info

# 检查节点健康状态
docker node inspect --format '{{.Status}}' worker-1

3.5 选型场景思考

维度 Docker Swarm Kubernetes
适合场景 中小规模集群(≤50 节点)、无状态服务、快速部署、运维人力有限 大规模集群(≥100 节点)、复杂有状态服务、高级调度需求
核心优势 轻量、易上手、Docker 原生集成 功能强大、生态丰富、社区成熟
学习/运维成本
相关推荐
白云偷星子2 小时前
RHCSA笔记2
linux·运维
好好学习天天向上~~2 小时前
9_Linux学习总结_进程状态_僵尸进程_孤儿进程
linux·运维·学习
北观止2 小时前
服务器登录脚本
运维·服务器
丿BAIKAL巛2 小时前
Docker部署的Mysql数据库自动化备份
数据库·mysql·docker
l1t2 小时前
利用Docker安装PostgreSQL 19 dev版
docker·postgresql·容器
Linux运维技术栈2 小时前
禅道一键包:跨服务器迁移 + 迁移至LVM分区 实战运维笔记
运维·服务器·禅道
至此流年莫相忘2 小时前
Kubernetes核心概念
java·容器·kubernetes
予枫的编程笔记2 小时前
【Docker进阶篇】从入门到精通:Java应用Docker打包,最佳实践与多阶段构建详解
java·docker·容器化·dockerfile·多阶段构建·docker最佳实践·java镜像优化
一匹电信狗2 小时前
【Linux我做主】从 fopen 到 open:Linux 文件 I/O 的本质与内核视角
linux·运维·服务器·c++·ubuntu·小程序·开源