Docker--Docker Swarm集群:从单机到集群的跃迁
大家好,我是技术博主小明。今天我们来聊聊 Docker Swarm------Docker 原生的集群管理工具。很多开发者刚开始接触 Docker 时,都是在单机上跑容器,但到了生产环境,一个容器挂了怎么办?流量大了怎么扩容?这时候,你就需要集群了。Docker Swarm 就是让你把多台 Docker 主机"粘"成一个虚拟的"超级计算机"的神器。## 什么是 Docker Swarm?想象一下,你有一堆服务器(可以是物理机或虚拟机),每台都安装了 Docker。Docker Swarm 就像一个"管家",它把这些服务器组织成一个集群,让你可以像操作一台机器一样部署和管理容器。Swarm 的核心特点:- 原生集成 :不用额外安装,Docker 自带 Swarm 模式。- 声明式服务 :你只需告诉 Swarm"我要跑 3 个 Nginx 容器",它会自动调度。- 高可用 :如果某个节点挂了,Swarm 会把容器自动迁移到其他节点。- 负载均衡 :内置路由,自动把请求分发到不同容器。## 核心概念:节点、服务、任务在 Swarm 中,有几个关键概念:- 节点 (Node) :集群中的一台 Docker 主机,分为管理者 (Manager) 和工作节点 (Worker)。 - 管理者负责集群管理、调度、状态维护。建议奇数个(如 3、5 个)以防脑裂。 - 工作节点只负责运行容器。- 服务 (Service) :你定义的容器运行规则,比如镜像、副本数、端口映射。- 任务 (Task) :一个具体的容器实例。Swarm 会根据服务定义,在节点上创建任务。## 搭建一个 Swarm 集群### 环境准备假设你有三台 Linux 服务器(或者用虚拟机、云主机),都安装了 Docker(版本 ≥ 1.12)。我们给它们起名:- manager1:192.168.1.10(管理者)- worker1:192.168.1.11(工作节点)- worker2:192.168.1.12(工作节点)### 步骤 1:在 manager1 上初始化 SwarmSSH 登录到 manager1,执行:bash# 初始化 Swarm 集群,指定 IP 地址(根据你的网络配置)docker swarm init --advertise-addr 192.168.1.10# 输出示例:# Swarm initialized: current node (abc123) is now a manager.# # To add a worker to this swarm, run the following command:# docker swarm join --token SWMTKN-1-xxxx 192.168.1.10:2377## To add a manager, run 'docker swarm join-token manager' and follow the instructions.解释 :--advertise-addr 指定管理者节点的 IP,其他节点会通过这个地址连接。2377 端口是 Swarm 的默认管理端口。### 步骤 2:添加工作节点在 worker1 和 worker2 上分别执行上面输出的 docker swarm join 命令:bash# 在 worker1 上执行docker swarm join --token SWMTKN-1-xxxx 192.168.1.10:2377# 在 worker2 上执行同样的命令docker swarm join --token SWMTKN-1-xxxx 192.168.1.10:2377注意 :每个节点加入后,管理节点会分配一个唯一 ID。如果忘了 token,可以在 manager 上通过 docker swarm join-token worker 查看。### 步骤 3:验证集群状态回到 manager1,查看节点列表:bashdocker node ls# 输出类似:# ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS# abc123... * manager1 Ready Active Reachable# def456... worker1 Ready Active # ghi789... worker2 Ready Active ````*` 表示当前连接的节点。`MANAGER STATUS` 列只有管理者节点有值。现在集群搭建完毕!## 实战:部署一个高可用 Nginx 服务### 创建服务我们部署一个 Nginx 服务,跑 3 个副本,并暴露 80 端口:bash# 创建一个名为 web 的服务,使用 nginx:latest 镜像,副本数 3,映射端口 80:80docker service create --name web --replicas 3 -p 80:80 nginx:latest### 查看服务状态bash# 列出所有服务docker service ls# 查看服务的详细信息(包括任务分布)docker service ps web# 输出示例:# ID NAME IMAGE NODE DESIRED STATE CURRENT STATE# xyz1... web.1 nginx:latest worker1 Running Running 2 minutes ago# xyz2... web.2 nginx:latest manager1 Running Running 2 minutes ago# xyz3... web.3 nginx:latest worker2 Running Running 2 minutes ago可以看到 3 个容器被自动调度到了不同的节点上。访问任何一个节点的 IP(如 `http://192.168.1.10`),都能看到 Nginx 欢迎页面。这是因为 Swarm 内置了路由网络(Ingress 网络),会自动把请求负载均衡到所有容器。## 代码示例:弹性伸缩与故障恢复### 示例 1:水平伸缩假设你的网站流量暴增,需要将 Nginx 副本数从 3 扩展到 5:bash# 将 web 服务的副本数调整为 5docker service scale web=5# 验证docker service ps web# 你会看到 5 个容器分布在集群中如果流量下降,可以缩容:bashdocker service scale web=2Swarm 会自动停止多余的容器,且保证服务始终可用。### 示例 2:模拟故障恢复我们模拟 worker1 节点宕机,看看 Swarm 如何自动恢复。bash# 在 worker1 上手动停止 Docker 服务(模拟宕机)sudo systemctl stop docker# 回到 manager1,查看服务状态docker service ps web# 输出示例:# ID NAME IMAGE NODE DESIRED STATE CURRENT STATE# xyz1... web.1 nginx:latest worker1 Running Shutdown (宕机了)# xyz4... web.4 nginx:latest manager1 Running Running (新调度)# xyz2... web.2 nginx:latest manager1 Running Running# xyz3... web.3 nginx:latest worker2 Running Running```关键点 :原本在 worker1 上的 web.1 任务变成了 Shutdown,而 Swarm 自动在 manager1 上创建了一个新的 web.4 来替代它。整个过程对用户无感知,服务始终是 3 个副本在运行。## 管理技巧与注意事项1. 日志查看 :docker service logs web 可以查看所有副本的日志。2. 更新服务 :docker service update --image nginx:1.21 web 可以滚动更新镜像版本。3. 网络隔离 :Swarm 支持 Overlay 网络,可以让不同服务的容器互相通信,同时隔离外部访问。4. 持久化数据 :使用 --mount 参数挂载卷,注意卷需要所有节点都能访问(如 NFS 或共享存储)。5. 安全 :Swarm 默认使用 TLS 加密,token 是敏感信息,不要泄露。## 总结Docker Swarm 是 Docker 生态中开箱即用的集群管理方案。它让多台服务器变成了一个逻辑整体,你只需声明"我要跑几个容器",Swarm 就会自动调度、负载均衡、故障恢复。相比 Kubernetes,Swarm 更轻量、配置更简单,特别适合中小型团队或对运维复杂度敏感的场景。通过本文,你已经学会了:- 初始化 Swarm 集群- 添加工作节点- 部署和伸缩服务- 观察故障自动恢复下次你的应用需要高可用和弹性伸缩时,不妨试试 Docker Swarm------它可能比你想象中更简单。如果你有任何问题,欢迎在评论区交流!---扩展阅读:Swarm 还支持堆栈(Stack)部署,可以通过 docker-compose.yml 文件一键部署整个应用,感兴趣的话可以深入研究。