Docker Swarm 是 Docker 原生的集群管理工具,可以轻松地将多个 Docker 主机组成一个集群,实现服务的高可用性和负载均衡。以下是详细的部署步骤:
一、环境准备
1. 服务器要求
- 至少 3 台 Linux 服务器(建议 CentOS/Ubuntu)
- 每台服务器已安装 Docker Engine(版本 19.03+)
- 服务器之间网络互通
- 开放的端口:2377(集群管理)、7946(节点通信)、4789(覆盖网络)
2. 设置主机名和解析(所有节点)
            
            
              bash
              
              
            
          
          # 设置主机名
hostnamectl set-hostname node1  # 在第一台执行
hostnamectl set-hostname node2  # 在第二台执行
hostnamectl set-hostname node3  # 在第三台执行
# 编辑/etc/hosts添加解析
echo "
192.168.1.101 node1
192.168.1.102 node2
192.168.1.103 node3
" >> /etc/hosts二、初始化 Swarm 集群
1. 在主节点(node1)上初始化 Swarm
            
            
              bash
              
              
            
          
          docker swarm init --advertise-addr <node1-IP>输出示例:
Swarm initialized: current node (xyz) is now a manager.
To add a worker to this swarm, run the following command:
    docker swarm join --token SWMTKN-1-xxx 192.168.1.101:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.2. 添加工作节点
在其他节点上运行上面输出的加入命令:
            
            
              bash
              
              
            
          
          docker swarm join --token <worker-token> <node1-IP>:23773. 添加管理节点(可选,实现管理高可用)
            
            
              bash
              
              
            
          
          # 在主节点获取管理令牌
docker swarm join-token manager
# 在其他管理节点运行输出的命令三、验证集群状态
1. 查看节点列表
            
            
              bash
              
              
            
          
          docker node ls输出示例:
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
x3y *   node1      Ready     Active         Leader           20.10.7
z4w     node2      Ready     Active         Reachable        20.10.7
a5b     node3      Ready     Active                          20.10.72. 检查 Swarm 状态
            
            
              bash
              
              
            
          
          docker info | grep -i swarm四、部署高可用服务
1. 创建覆盖网络
            
            
              bash
              
              
            
          
          docker network create --driver overlay --attachable my-overlay2. 部署示例服务(Nginx)
            
            
              bash
              
              
            
          
          docker service create \
  --name nginx \
  --replicas 3 \
  --publish published=8080,target=80 \
  --network my-overlay \
  nginx:latest3. 查看服务状态
            
            
              bash
              
              
            
          
          docker service ls
docker service ps nginx五、实现高可用特性
1. 服务自动重启
            
            
              bash
              
              
            
          
          docker service update \
  --restart-condition any \
  --restart-delay 5s \
  --restart-max-attempts 3 \
  nginx2. 设置滚动更新策略
            
            
              bash
              
              
            
          
          docker service update \
  --update-parallelism 2 \
  --update-delay 10s \
  --image nginx:1.21 \
  nginx3. 配置健康检查
            
            
              bash
              
              
            
          
          docker service update \
  --health-cmd "curl -f http://localhost || exit 1" \
  --health-interval 5s \
  --health-retries 3 \
  --health-timeout 2s \
  nginx六、集群管理
1. 节点维护
            
            
              bash
              
              
            
          
          # 将节点设置为维护模式
docker node update --availability drain node2
# 恢复节点
docker node update --availability active node22. 备份 Swarm 配置
            
            
              bash
              
              
            
          
          # 备份 Raft 日志(在管理节点执行)
docker swarm ca --rotate  # 先轮换证书
tar -czvf swarm-backup.tar.gz /var/lib/docker/swarm/3. 灾难恢复
            
            
              bash
              
              
            
          
          # 在新节点恢复管理角色
docker swarm init --force-new-cluster --advertise-addr <new-ip>七、监控和日志
1. 部署监控栈
            
            
              bash
              
              
            
          
          # 创建监控网络
docker network create --driver overlay monitor
# 部署 Prometheus
docker service create --name prometheus \
  --network monitor \
  --publish published=9090,target=9090 \
  prom/prometheus
# 部署 Grafana
docker service create --name grafana \
  --network monitor \
  --publish published=3000,target=3000 \
  grafana/grafana2. 集中日志收集
            
            
              bash
              
              
            
          
          docker service create --name logspout \
  --mode global \
  --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \
  --network my-overlay \
  gliderlabs/logspout syslog+tls://your-log-server:514八、安全加固
1. 启用 TLS 加密
            
            
              bash
              
              
            
          
          # 初始化 Swarm 时启用 TLS
docker swarm init --advertise-addr <ip> --default-addr-pool 10.10.0.0/16 --data-path-port 4789 --force-new-cluster --listen-addr <ip>:2377 --cert-expiry 2160h2. 定期轮换证书
            
            
              bash
              
              
            
          
          docker swarm ca --rotate3. 限制管理节点访问
            
            
              bash
              
              
            
          
          iptables -A INPUT -p tcp --dport 2377 -s <trusted-ip> -j ACCEPT
iptables -A INPUT -p tcp --dport 2377 -j DROP常见问题解决
- 
节点无法加入集群 - 检查防火墙设置
- 验证令牌是否过期(默认24小时)
- 确保所有节点时间同步
 
- 
服务无法启动 - 检查资源限制 docker service inspect --pretty <service>
- 查看日志 docker service logs <service>
 
- 检查资源限制 
- 
网络连接问题 - 验证覆盖网络 docker network inspect <network>
- 检查 IP 地址池是否冲突
 
- 验证覆盖网络 
通过以上步骤,您已经成功部署了一个高可用的 Docker Swarm 集群。这种架构可以自动处理节点故障、服务扩展和负载均衡,适合生产环境使用。