Docker--Docker Swarm集群

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 文件一键部署整个应用,感兴趣的话可以深入研究。

相关推荐
難釋懷1 小时前
Nginx-proxy缓存断点续传缓存 range
运维·nginx·缓存
井川廊咏2 小时前
【总集篇】Linux | 如何创建一个 home 目录在 /data 磁盘的 sudo 用户(补档)
linux·运维·服务器
敖行客 Allthinker2 小时前
docker容器安装Python反推镜像步骤(适用于临时调试用)
python·docker·容器
Kina_C2 小时前
LVS负载均衡的十二种核心调度算法
linux·运维·算法·负载均衡·lvs
AOwhisky2 小时前
Linux(CentOS)系统管理入门笔记(第十五期)——文件系统与存储管理(上篇):设备识别、挂载与文件查找
linux·运维·笔记·centos·文件系统
tonydf3 小时前
传统老手艺之容器编排
后端·容器·aiops
维核科技3 小时前
算力机房高负荷期稳供指南:GPU前置维保与应急处置方案
运维·服务器维修·gpu维修·算力卡维修
worilb3 小时前
Spring Cloud 学习与实践(16):Elasticsearch 商品搜索、中文分词与索引一致性
运维·jenkins
张忠琳3 小时前
【NVIDIA】NVIDIA k8s-device-plugin v0.19.3 配置API模块深度分析之二
云原生·容器·架构·kubernetes·nvidia