Docker Swarm 和 Docker Compose 都是 Docker 官方提供的容器编排工具 ,但它们的应用场景和目标有所不同,它们的关系可以概括为:分工不同、可以结合使用。
1. 🎯 用途和范围的不同
| 特性 | Docker Compose | Docker Swarm |
|---|---|---|
| 应用范围 | 单主机/单服务器 | 多主机集群 |
| 主要目标 | 管理单个应用 的多个容器的生命周期(启动、停止、重建等)。 | 管理整个集群 的服务的部署、扩容、负载均衡和高可用性。 |
| 配置文件 | docker-compose.yml |
也使用 docker-compose.yml,但通过 docker stack deploy 命令部署为 Service (服务)。 |
| 编排类型 | 多容器应用编排 | 集群服务编排 |
| 命令行工具 | docker-compose up/down |
docker swarm init/join,docker stack deploy |
-
Docker Compose (多容器管理工具):
- 它用于在单个 Docker 主机上定义和运行多容器 Docker 应用程序。
- 通过一个
docker-compose.yml文件,您可以定义组成应用程序的所有服务(如 Web 服务器、数据库、缓存等)及其配置、网络和卷。 - 它非常适合用于开发环境、测试环境或在单个服务器上运行小型应用程序。
-
Docker Swarm (集群和服务编排工具):
- 它是 Docker 的原生集群管理和编排工具 ,用于将多个 Docker 主机(节点)组合成一个虚拟的集群 (Swarm)。
- 它用于在集群中部署、维护和扩展应用程序,提供高可用性、容错能力和负载均衡。
- 它更适合用于生产环境,需要跨多个服务器进行扩展和保障服务不中断的场景。
2. 🤝 如何结合使用
最关键的一点是:您可以在 Docker Swarm 模式下使用 docker-compose.yml 文件。
- Compose 文件的复用: 您定义好的
docker-compose.yml文件不仅可以在单主机上用docker-compose up运行,也可以在 Docker Swarm 集群中通过docker stack deploy命令来部署。 - Stack (堆栈): 当您在 Swarm 集群中部署
docker-compose.yml文件时,它会被视为一个 Stack (堆栈) ,文件中的每个服务都会被部署为 Swarm 的 Service (服务)。 - 服务与容器: Swarm 的 Service 负责确保所需数量的容器(称为 Tasks 或副本)在集群中运行。Swarm 会自动处理服务间的负载均衡、故障转移和扩缩容。
总结来说:
- Docker Compose 帮助您定义多容器应用程序的结构和配置。
- Docker Swarm 使用这个定义文件(Stack),将应用部署到多主机环境 中,并提供集群级别的管理和高可用性。
下面演示一个标准的流程,使用一个简单的 docker-compose.yml 文件来部署一个包含 Web 服务和 Redis 缓存的应用到 Docker Swarm 集群。
🚀 部署到 Docker Swarm 的演示步骤
假设您已经有了一个包含多个节点的 Docker Swarm 集群(至少一个 Manager 节点)。
第一步:准备 docker-compose.yml 文件
我们将创建一个名为 demo-app.yml 的文件,定义一个 Web 服务和相应的 Redis 缓存服务。
demo-app.yml
yaml
version: '3.8'
services:
web:
image: nginx:latest # 使用 Nginx 作为简单的 Web 服务
ports:
- "8080:80" # 将集群的 8080 端口映射到容器的 80 端口
deploy:
replicas: 3 # **Swarm 特有配置:** 部署 3 个副本,实现负载均衡和高可用
restart_policy:
condition: on-failure
networks:
- app-net
redis:
image: redis:6.2-alpine # 使用 Redis 作为缓存服务
networks:
- app-net
# 在 Swarm 中,默认情况下,服务只有 1 个副本,除非明确指定 replicas
networks:
app-net:
driver: overlay # **Swarm 特有配置:** 必须使用 overlay 网络,以便跨节点通信
🔑 关键区别: 在 Swarm 中,Compose 文件中的
deploy部分是专门用于 Swarm 模式的配置,它定义了服务的高可用性 (replicas)和重启策略 等。此外,网络驱动必须使用overlay。
第二步:初始化或加入 Swarm 集群
如果您还没有 Swarm 集群,您需要在您的主机上初始化一个:
bash
# 在 Manager 节点上执行
docker swarm init
如果您已有一个集群,请确保您在 Manager 节点上执行后续的部署操作。
第三步:使用 docker stack deploy 部署应用
使用 docker stack deploy 命令,指定您的 Compose 文件和您希望给这个应用堆栈取的名字(例如:my-stack)。
bash
# 在 Swarm Manager 节点上执行
docker stack deploy -c demo-app.yml my-stack
命令详解:
-c demo-app.yml: 指定要使用的配置文件。my-stack: 指定这个应用程序在 Swarm 中的堆栈名称 (Stack Name)。
输出示例:
Creating service my-stack_web
Creating service my-stack_redis
第四步:检查部署状态
您可以使用以下命令检查部署后的服务状态:
1. 查看堆栈和服务列表
bash
docker stack ls # 查看已部署的堆栈
docker stack services my-stack # 查看堆栈中包含的服务及其状态
示例输出 (docker stack services my-stack):
| ID | NAME | MODE | REPLICAS | IMAGE | PORTS |
|---|---|---|---|---|---|
| aj1... | my-stack_web | Replicated | 3/3 | nginx:latest | *:8080->80/tcp |
| qb3... | my-stack_redis | Replicated | 1/1 | redis:6.2-alpine |
2. 查看服务详情和任务 (Task) 分布
bash
docker service ps my-stack_web # 查看 web 服务的所有运行中的容器 (Tasks)
您会看到三个 my-stack_web 的任务,它们可能分布在集群的不同节点上,这表明 Swarm 正在进行高可用和负载均衡。
第五步:访问应用
由于我们在 web 服务中将端口 8080 映射到了容器的 80 端口,您可以访问集群中任一节点 的 8080 端口来访问 Nginx 服务。
bash
# 假设任意一个节点(Manager 或 Worker)的 IP 是 192.168.1.10
http://192.168.1.10:8080
得益于 Swarm 的 路由网格 (Routing Mesh) ,无论哪个节点接收到请求,它都会自动将请求路由到正在运行的 web 服务副本中的一个。
第六步:清理应用
当您完成测试后,可以使用 docker stack rm 命令轻松移除整个应用堆栈:
bash
docker stack rm my-stack
总结:
docker-compose.yml 文件是应用的蓝图 。docker stack deploy 命令将这个蓝图应用到整个 Docker Swarm 集群 ,由 Swarm 来负责将应用转换为可扩展、高可用的 Service。