Docker Swarm 基础
Docker Swarm 是 Docker 内置的容器编排工具。它允许你跨多个 Docker 主机管理和扩展 Docker 应用程序。
本章将向你介绍 Docker Swarm 的基本概念、架构,以及它如何简化容器化应用的部署和扩展。我们将探索 Swarm 集群的关键组件,以及在集群内管理服务的基本命令。这将为后续章节中更高级的主题打下坚实的基础。
1. 理解容器编排
容器编排(Container Orchestration)是指对容器化应用进行自动化的管理、调度、协调和扩展。它负责处理跨机器集群部署和运行应用程序的复杂性,确保高可用性、容错能力以及高效的资源利用率。
1.1 为什么需要容器编排?
如果没有容器编排,管理大量容器将变得极其困难。想象一下,你需要手动在多台服务器上部署和扩展数十个容器,监控它们的健康状况,并确保它们正确连接。这就是像 Docker Swarm 这样的容器编排工具发挥作用的地方。它们将这些任务自动化,让你能够将精力集中在开发应用程序上,而不是管理底层基础设施。
真实案例:
- 电商平台: 一家电商公司使用容器编排来管理其 Web 服务器、数据库服务器和缓存服务器。在购物旺季,编排工具会自动增加 Web 服务器容器的数量以应对激增的流量。如果某台服务器发生故障,编排工具会自动在另一台健康的服务器上重新启动这些容器。
- 流媒体服务: 一家视频流媒体服务公司使用容器编排来管理其视频编码和分发基础设施。编排工具根据优先级和资源需求,动态地将资源分配给不同的视频编码任务。它还会监控流媒体服务器的健康状况,并在其发生故障时自动重启。
假设场景:
一家初创公司正在开发一个基于微服务的应用程序。每个微服务都被打包成一个 Docker 容器。该公司预计业务将快速增长,并需要一种能够轻松地跨多台服务器部署、扩展和管理其应用的方法。如果没有容器编排,他们将不得不手动管理每个容器,这既耗时又容易出错。有了容器编排,他们只需定义应用程序的期望状态(例如:副本数量、资源需求),编排工具就会自动确保应用程序按预期运行。
1.2 容器编排的核心优势
- 高可用性: 自动重启失败的容器,确保应用程序持续在线。
- 弹性伸缩(Scalability): 根据需求轻松地横向扩展(增加)或缩减(减少)应用程序。
- 资源优化: 高效利用机器集群中的计算资源。
- 简化部署: 自动化部署流程,降低出错率和复杂性。
- 滚动更新(Rolling Updates): 实现零停机时间的应用更新。
2. Docker Swarm 简介
Docker Swarm 是 Docker 原生的容器编排解决方案。它提供了一种简单易用的方式来管理 Docker 主机集群,并在其上部署容器化应用。Swarm 直接集成在 Docker Engine 中,对于已经熟悉 Docker 的人来说,它是最自然的选择。
2.1 核心概念
- 节点 (Nodes): 节点是属于 Swarm 集群的物理机或虚拟机。共有两种类型的节点:
- 管理节点 (Manager nodes): 负责管理整个 Swarm 集群。它们处理诸如调度服务、管理集群状态以及响应 API 请求等任务。
- 工作节点 (Worker nodes): 负责执行管理节点分配给它们的任务。它们运行构成你应用程序的实际容器。
- 服务 (Services): 服务定义了应用程序的期望状态。它指定了要使用哪个容器镜像、运行多少个副本、网络配置以及其他相关设置。
- 任务 (Tasks): 任务是服务中单个容器的实例。当你定义一个服务时,Swarm 会根据你期望的副本数量创建相应的任务。
- 负载均衡 (Load Balancing): Swarm 提供了内置的负载均衡功能,可自动将网络流量分发给服务内的各个任务。
3. Swarm 架构
一个 Swarm 集群由一个或多个管理节点,以及零个或多个工作节点组成。管理节点之间会选举出一个领导者 (Leader),由它负责对集群状态做出决策。工作节点加入 Swarm 并执行管理节点分配给它们的任务。
管理节点使用 Raft 共识算法 来维护集群状态的一致性。这确保了即使一个或多个管理节点发生故障,Swarm 集群也能继续正常运行。
架构图示:
+-----------------+ +-----------------+ +-----------------+
| 管理节点 1 |----| 管理节点 2 |----| 管理节点 3 |
+-----------------+ +-----------------+ +-----------------+
| | |
| (领导者) | |
| | |
+-----------------+ +-----------------+ +-----------------+
| 工作节点 1 | | 工作节点 2 | | 工作节点 3 |
+-----------------+ +-----------------+ +-----------------+
| | |
| (任务1, 任务2) | (任务3) | (任务4, 任务5) |
| | |
+-----------------------------------------------------+
| 负载均衡器 (将流量分发到各个任务) |
+-----------------------------------------------------+- 上图展示了一个包含 3 个管理节点和 3 个工作节点的 Swarm 集群。
- 其中一个管理节点被选举为领导者 (Leader)。
- 工作节点负责运行任务 (Tasks),也就是容器的实例。
- 负载均衡器将外部流量分发给这些任务。
4. 搭建 Docker Swarm 集群
在深入探讨更高级的概念之前,让我们先来演示一下 Docker Swarm 的基础搭建过程。这将为你提供基本命令的实操经验。在这个例子中,你需要至少两台安装了 Docker 的机器。它们可以是虚拟机、云服务器,或者是运行 Docker Desktop 的本地机器(尽管使用独立的机器更符合真实世界的设定)。
4.1 初始化 Swarm(管理节点)
在你想要指定为管理节点的机器上,运行以下命令:
docker swarm init --advertise-addr <MANAGER-IP>请将 <MANAGER-IP> 替换为其他节点用来连接该管理节点的 IP 地址。命令执行后的输出将包含一条用于作为工作节点加入 Swarm 的命令。请保存这条命令。
示例:
docker swarm init --advertise-addr 192.168.1.100
# 输出结果:
Swarm 已初始化:当前节点 (xxxxxxxxxxxxxxxxxxxxxxxx) 现在是一个管理节点。
若要向此 swarm 添加一个工作节点,请运行以下命令:
docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 192.168.1.100:2377
若要向此 swarm 添加一个管理节点,请运行 'docker swarm join-token manager' 并按照提示操作。4.2 加入 Swarm(工作节点)
在每一台你想要指定为工作节点的机器上,运行刚才在管理节点初始化时输出的 docker swarm join 命令。
示例:
docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 192.168.1.100:23774.3 验证集群状态
回到管理节点上,运行以下命令来查看当前加入 Swarm 集群的节点:
docker node ls这将输出一个节点列表,包含它们的 ID、主机名、状态 (Ready 或 Down)、可用性 (Active, Pause, Drain) 以及它们是否为管理节点。
输出示例:
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
xxxxxxxxxxxxxxxxxxxxxxxx manager1 Ready Active Leader 20.10.7
yyyyyyyyyyyyyyyyyyyyyyyy worker1 Ready Active 20.10.7
zzzzzzzzzzzzzzzzzzzzzzzz worker2 Ready Active 20.10.75. 在 Swarm 中部署服务
既然你已经搭建好了 Swarm 集群,让我们来部署一个简单的服务。我们将使用 nginx 镜像作为示例。
5.1 创建服务
在管理节点上,运行以下命令来创建一个服务:
docker service create --name web --publish 80:80 --replicas 3 nginx这条命令创建了一个名为 web 的服务,将主机的 80 端口映射发布到容器的 80 端口上。它还指定了我们想要运行 3 个 nginx 容器的副本。
5.2 验证服务
运行以下命令来查看 Swarm 中正在运行的服务:
docker service ls这将输出服务列表,包括它们的 ID、名称、副本数量以及使用的镜像。
输出示例:
ID NAME MODE REPLICAS IMAGE PORTS
xxxxxxxxxxxxxxxx web replicated 3/3 nginx:latest *:80->80/tcp5.3 查看任务状态
运行以下命令来查看属于 web 服务的具体任务正在哪里运行:
docker service ps web这将输出任务列表,包含它们的 ID、运行所在的节点、期望状态、当前状态以及任何报错信息。
输出示例:
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
xxxxxxxxxxxxxxxx web.1 nginx:latest worker1 Running 5 分钟前运行 (Running)
yyyyyyyyyyyyyyyy web.2 nginx:latest worker2 Running 5 分钟前运行 (Running)
zzzzzzzzzzzzzzzz web.3 nginx:latest manager1 Running 5 分钟前运行 (Running)5.4 访问服务
打开你的网页浏览器,访问 Swarm 集群中任意一个节点的 IP 地址。你应该能看到默认的 nginx 欢迎页面。这证明了内置的负载均衡器正在将流量成功分发到各个 nginx 容器上。
6. 弹性伸缩服务
Docker Swarm 的核心优势之一就是能够非常轻松地对服务进行扩容或缩容。让我们将 web 服务扩展到 5 个副本。
6.1 扩缩容操作
在管理节点上,运行以下命令:
docker service scale web=5这条命令告诉 Swarm 更新 web 服务,使其运行 5 个副本。
6.2 验证扩缩容
再次运行 docker service ls 和 docker service ps web 命令,来验证服务是否已成功扩展到 5 个副本。
你应该能在 docker service ls 的输出中看到 REPLICAS 列显示为 5/5,而在 docker service ps web 的输出中看到有 5 个处于 Running (运行中) 状态的任务。
7. 移除服务
当你不再需要某个服务时,可以使用 docker service rm 命令将其移除。
7.1 移除服务操作
在管理节点上,运行以下命令:
docker service rm web这条命令将彻底移除 web 服务。
7.2 验证移除
再次运行 docker service ls 命令,验证该服务已从列表中消失。