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 enable3. 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 web4.3 数据持久化方案
Swarm推荐两种数据管理方式:
Volume挂载:
docker service create \ --mount type=volume,source=db-data,target=/var/lib/mysql \ mysql:5.7NFS共享存储:
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 web5.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若跨节点通信异常,验证:
- 所有节点4789/UDP端口是否开放
- 节点间网络延迟是否过高(超过默认的5秒心跳间隔)
- 是否启用
--opt encrypted导致性能下降
6. 生产环境优化实践
6.1 资源限制与预留
防止单个服务耗尽资源:
docker service create \ --limit-cpu 2 \ --limit-memory 1GB \ --reserve-cpu 0.5 \ --reserve-memory 256M \ nginx6.2 滚动更新策略
配置金丝雀发布策略:
docker service update \ --update-parallelism 2 \ --update-delay 10s \ --update-failure-action rollback \ --image nginx:1.21 \ web6.3 服务约束与标签
定向部署到特定节点:
# 给节点打标签 docker node update --label-add disk=ssd node1 # 部署时使用约束 docker service create \ --constraint 'node.labels.disk == ssd' \ redis7. 安全加固措施
7.1 TLS证书配置
启用集群加密通信:
docker swarm init --autolock # 重启后需解锁 docker swarm unlock7.2 密钥管理
安全存储敏感数据:
# 创建密钥 echo "db_password" | docker secret create db_pass - # 使用密钥 docker service create \ --secret source=db_pass,target=/run/secrets/db_pass \ mysql7.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