☰
Docker Swarm集群部署与运维实战指南
2026/10/29 14:37:30 网站建设 项目流程

1. Docker Swarm 集群部署实战

在容器编排领域,Docker Swarm 作为 Docker 原生的集群管理工具,以其轻量级和易用性著称。与 Kubernetes 相比,Swarm 更适合中小规模部署场景,学习曲线平缓,五分钟内就能完成基础集群搭建。我在生产环境中使用 Swarm 管理超过50个节点的容器服务,其稳定的服务发现和负载均衡机制给我留下了深刻印象。

本次部署将采用三节点架构:1个管理节点(Manager)和2个工作节点(Worker)。Manager节点负责集群状态维护和任务调度,Worker节点执行具体的容器实例。这种设计既保证了集群的高可用性,又避免了单点故障风险。实际部署时建议Manager节点数量为奇数(3/5/7),以便Raft共识算法正常运作。

2. 环境准备与节点配置

2.1 系统要求与依赖安装

所有节点需安装 Docker Engine 20.10.0 及以上版本。在 Ubuntu 22.04 上可通过以下命令安装最新版 Docker:

# 卸载旧版本 sudo apt-get remove docker docker-engine docker.io containerd runc # 安装依赖 sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release # 添加Docker官方GPG密钥 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 设置稳定版仓库 echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装Docker引擎 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

注意:若遇到"virtualization support not detected"错误,需在BIOS中开启VT-x/AMD-V虚拟化支持,Windows用户还需启用Hyper-V和WSL2功能。

2.2 防火墙与端口配置

Swarm 集群依赖以下端口通信,需在所有节点开放:

  • TCP 2377:集群管理通信
  • TCP/UDP 7946:节点间通信
  • UDP 4789:覆盖网络(overlay)流量

配置示例(使用UFW防火墙):

sudo ufw allow 22/tcp sudo ufw allow 2377/tcp sudo ufw allow 7946/tcp sudo ufw allow 7946/udp sudo ufw allow 4789/udp sudo ufw enable

3. Swarm 集群初始化与管理

3.1 创建管理节点

在选定的Manager节点执行:

sudo docker swarm init --advertise-addr <MANAGER_IP>

成功后会输出加入Worker节点的命令,形如:

docker swarm join --token SWMTKN-1-xxx <MANAGER_IP>:2377

关键参数说明:

  • --advertise-addr:指定其他节点连接本节点的IP
  • --listen-addr:默认为0.0.0.0,如需限制监听地址可指定
  • --data-path-addr:用于数据路径的独立IP(适用于多网卡环境)

3.2 加入工作节点

在每个Worker节点运行上述join命令。验证节点状态:

# 在Manager节点执行 docker node ls

正常输出应显示所有节点状态为"Ready",Manager节点的MANAGER STATUS列显示"Reachable"或"Leader"。

3.3 集群高可用配置

为提高Manager节点可用性,可提升其他节点为Manager:

docker node promote <NODE-ID>

Swarm使用Raft算法维护一致性,建议遵循:

  • 3个Manager可容忍1个故障
  • 5个Manager可容忍2个故障
  • 最多不超过7个Manager(避免选举性能下降)

4. 服务部署与网络配置

4.1 创建覆盖网络

跨主机的容器通信需要overlay网络:

docker network create --driver overlay --attachable my-overlay

关键参数:

  • --attachable:允许非Swarm服务连接此网络
  • --subnet:手动指定子网(避免自动分配冲突)
  • --opt encrypted:启用网络流量加密

4.2 部署示例服务

部署一个包含3个副本的Nginx服务:

docker service create \ --name web \ --network my-overlay \ --replicas 3 \ --publish published=8080,target=80 \ nginx:alpine

服务管理常用命令:

# 扩缩容 docker service scale web=5 # 滚动更新 docker service update --image nginx:latest web # 查看服务详情 docker service ps --no-trunc web

4.3 数据持久化方案

Swarm推荐两种数据管理方式:

  1. Volume挂载:

    docker service create \ --mount type=volume,source=db-data,target=/var/lib/mysql \ mysql:5.7
  2. NFS共享存储:

    docker service create \ --mount 'type=volume,src=nfsvol,dst=/var/lib/mysql,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/path/on/nfs/server,'"volume-opt=o=addr=nfs-server-ip,rw" \ mysql:5.7

5. 运维监控与故障排查

5.1 集群健康检查

查看节点详细状态:

docker node inspect <NODE-ID> --pretty

检查服务日志:

docker service logs --tail 100 --follow web

5.2 常见问题处理

节点失联处理:

# 查看节点状态 docker node ls # 若节点显示Down状态且无法恢复 docker node rm --force <NODE-ID> # 重新加入集群(需在新节点生成新的join token) docker swarm join-token worker

服务卡在"Preparing"状态: 通常因镜像拉取失败导致,可尝试:

# 查看具体错误 docker service ps --no-trunc web # 手动在问题节点拉取镜像 docker pull nginx:alpine # 强制重新部署 docker service update --force web

网络连通性问题: 检查overlay网络状态:

docker network inspect my-overlay

若跨节点通信异常,验证:

  1. 所有节点4789/UDP端口是否开放
  2. 节点间网络延迟是否过高(超过默认的5秒心跳间隔)
  3. 是否启用--opt encrypted导致性能下降

6. 生产环境优化实践

6.1 资源限制与预留

防止单个服务耗尽资源:

docker service create \ --limit-cpu 2 \ --limit-memory 1GB \ --reserve-cpu 0.5 \ --reserve-memory 256M \ nginx

6.2 滚动更新策略

配置金丝雀发布策略:

docker service update \ --update-parallelism 2 \ --update-delay 10s \ --update-failure-action rollback \ --image nginx:1.21 \ web

6.3 服务约束与标签

定向部署到特定节点:

# 给节点打标签 docker node update --label-add disk=ssd node1 # 部署时使用约束 docker service create \ --constraint 'node.labels.disk == ssd' \ redis

7. 安全加固措施

7.1 TLS证书配置

启用集群加密通信:

docker swarm init --autolock # 重启后需解锁 docker swarm unlock

7.2 密钥管理

安全存储敏感数据:

# 创建密钥 echo "db_password" | docker secret create db_pass - # 使用密钥 docker service create \ --secret source=db_pass,target=/run/secrets/db_pass \ mysql

7.3 用户权限控制

创建管理角色:

# 创建swarm-admin用户组 sudo groupadd swarm-admin # 添加用户到组 sudo usermod -aG swarm-admin $USER # 配置Docker守护进程 sudo mkdir -p /etc/docker echo '{ "group": "swarm-admin" }' | sudo tee /etc/docker/daemon.json

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询