docker swarm(长文解析)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

在当今微服务架构和云原生技术蓬勃发展的背景下,容器化技术成为现代应用部署的基石。Docker 作为容器技术的代表,通过标准化的镜像和轻量化的运行环境,极大简化了开发与运维的复杂性。然而,当应用需要跨多台服务器实现高可用、弹性扩缩容和自动化管理时,单机容器管理的局限性便凸显出来。Docker Swarm 作为 Docker 官方推出的容器集群编排工具,正是为了解决这一痛点而生。它通过将多台 Docker 主机聚合为一个逻辑集群,提供服务发现、负载均衡、自动故障转移等功能,让开发者能够像操作单个容器一样管理分布式应用。

本文将从基础概念、集群搭建、服务管理到高级功能,以循序渐进的方式展开,结合实际案例和代码示例,帮助读者掌握 Docker Swarm 的核心能力,并理解其在 DevOps 流程中的实际应用场景。


一、Docker Swarm 的核心概念与类比

1.1 节点(Nodes)与集群模式

Docker Swarm 将物理或虚拟服务器称为“节点”(Nodes)。每个节点可以是运行容器的“工作节点”(Worker Node),或是负责集群管理的“管理节点”(Manager Node)。

  • 管理节点:如同交响乐团的指挥,负责集群的调度、服务编排和状态监控。
  • 工作节点:如同乐团中的乐手,执行具体的任务(即容器实例)。

集群模式分为两种:

  • 管理节点模式:仅用于集群管理,不运行容器。
  • 工作节点模式:专注于运行容器,不参与集群决策。

1.2 服务(Services)与任务(Tasks)

在 Docker Swarm 中,应用以“服务”为单位部署。一个服务可以理解为一组逻辑上的容器实例(即任务)。例如,部署一个 Web 应用服务时,可以指定运行 3 个任务,分布在不同节点上,实现负载均衡。

比喻
服务就像一家连锁餐厅的品牌(如“麦当劳”),而任务则是具体的分店。品牌(服务)定义了分店的统一标准,而每个分店(任务)独立运行,但遵循品牌规范。


二、快速搭建 Docker Swarm 集群

2.1 环境准备

确保所有节点已安装 Docker 1.12 或更高版本,并关闭防火墙或开放必要端口(如 2377、7946、4789)。

2.2 初始化集群

在管理节点执行以下命令,创建集群:

docker swarm init --advertise-addr <管理节点IP>

执行后会返回一个 docker swarm join 命令,用于后续工作节点加入集群。

2.3 加入工作节点

在工作节点执行管理节点返回的 docker swarm join 命令,例如:

docker swarm join --token SWMTKN-1-xxx <管理节点IP>:2377

2.4 验证集群状态

通过以下命令查看节点列表:

docker node ls

输出示例:

ID                            HOSTNAME            STATUS    AVAILABILITY  MANAGER STATUS  
j5v1xxx...  manager-node       Ready     Active     Leader  
w2a2xxx...  worker-node1       Ready     Active  

三、服务管理与容器编排实战

3.1 部署基础服务

使用 docker service create 命令部署一个 Nginx 服务,并指定副本数为 3:

docker service create --name web-server --replicas 3 -p 80:80 nginx:latest

此命令会:

  1. 在集群中随机选择 3 个节点启动 Nginx 容器。
  2. 将容器的 80 端口映射到节点的 80 端口,实现外部访问。

3.2 扩容与缩容

通过以下命令动态调整副本数:

docker service scale web-server=5  # 扩容到5个副本  
docker service update --replicas 2 web-server  # 缩容到2个副本  

3.3 更新策略与滚动部署

当需要更新服务时,Docker Swarm 支持滚动更新(Rolling Update),确保服务不中断:

docker service update --image nginx:latest --update-parallelism 1 web-server

参数解释:

  • --image: 指定新镜像版本。
  • --update-parallelism 1: 每次只更新一个副本,其余保持运行。

3.4 健康检查与自动恢复

通过 --health-cmd 参数配置健康检查,当容器异常时自动重启:

docker service create --name db-service \
  --health-cmd="wget -qO- http://localhost:3306/health" \  
  --health-interval="15s" \  
  --health-retries=3 \  
  mysql:5.7  

此命令会每 15 秒检查一次 MySQL 的健康状态,失败 3 次后重启容器。


四、网络与存储配置:集群通信与数据持久化

4.1 Overlay 网络

Docker Swarm 使用 Overlay 网络实现跨节点容器通信。创建 Overlay 网络的命令如下:

docker network create --driver overlay --subnet 192.168.0.0/24 my-overlay

在部署服务时指定该网络:

docker service create --network my-overlay --name redis redis:alpine

4.2 持久化存储:Docker Volume

通过 Docker Volume 将数据与容器解耦,避免因容器销毁导致数据丢失。例如:

docker volume create my-data
docker service create --mount type=volume,source=my-data,target=/var/lib/mysql mysql:5.7

五、高级功能与最佳实践

5.1 负载均衡与外部访问

通过 Ingress 端口将服务暴露给外部:

docker service create --name frontend --publish published=80,target=80 nginx:latest

此时,集群中的任意节点 IP:80 均可访问 Nginx 服务,流量由 Swarm 自动分配。

5.2 节点标签与资源约束

为节点添加标签,实现服务的精细化调度:

docker node update --label-add env=production manager-node
docker service create --constraint 'node.labels.env==production' my-production-app

5.3 安全与监控

  • TLS 加密:通过 docker swarm update --autolock 启用集群锁定。
  • 监控工具:集成 Prometheus 和 Grafana,监控集群资源使用率。

六、实际案例:电商应用的 Docker Swarm 部署

6.1 场景描述

假设需要部署一个包含前端、API 后端和数据库的电商应用,要求:

  • 前端服务 3 副本,负载均衡。
  • 后端服务 2 副本,与数据库通信。
  • 数据库存储持久化。

6.2 部署步骤

  1. 创建网络与存储
    docker network create --driver overlay app-net  
    docker volume create app-db  
    
  2. 部署数据库
    docker service create \  
      --name app-db \  
      --network app-net \  
      --mount type=volume,source=app-db,target=/var/lib/mysql \  
      mysql:5.7  
    
  3. 部署后端服务
    docker service create \  
      --name app-api \  
      --network app-net \  
      --replicas 2 \  
      --env DB_HOST=app-db \  
      my-registry/app-api:latest  
    
  4. 部署前端服务
    docker service create \  
      --name app-frontend \  
      --network app-net \  
      --replicas 3 \  
      --publish published=80,target=80 \  
      my-registry/app-frontend:latest  
    

6.3 验证与扩展

  • 访问集群任意节点的 80 端口,观察负载均衡效果。
  • 使用 docker service logs app-frontend 查看实时日志。
  • 根据流量增长,通过 docker service scale app-frontend=5 动态扩容。

结论:Docker Swarm 的应用价值与未来展望

通过本文的学习,读者应已掌握 Docker Swarm 的核心概念、集群搭建、服务管理及实际案例。其轻量级、易用性、无缝集成 Docker 生态的特点,使其成为中小型团队构建分布式系统的首选工具。

对于开发者而言,Docker Swarm 不仅简化了多节点环境的运维复杂度,还通过声明式 API 和滚动更新等机制,降低了应用升级的风险。未来,随着云原生技术的进一步发展,Docker Swarm 与 Kubernetes 的协同(如通过 K3s 轻量级 Kubernetes 发行版)将为开发者提供更多选择。

建议读者通过实际部署练习加深理解,并参考官方文档探索更多高级功能。掌握 Docker Swarm,是迈向高效 DevOps 流程的重要一步。

最新发布