Docker Compose 和 Docker Swarm

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/joindocker stack deploy
  • Docker Compose (多容器管理工具):

    • 它用于在单个 Docker 主机上定义和运行多容器 Docker 应用程序。
    • 通过一个 docker-compose.yml 文件,您可以定义组成应用程序的所有服务(如 Web 服务器、数据库、缓存等)及其配置、网络和卷。
    • 它非常适合用于开发环境、测试环境或在单个服务器上运行小型应用程序。
  • Docker Swarm (集群和服务编排工具):

    • 它是 Docker 的原生集群管理和编排工具 ,用于将多个 Docker 主机(节点)组合成一个虚拟的集群 (Swarm)
    • 它用于在集群中部署、维护和扩展应用程序,提供高可用性、容错能力和负载均衡
    • 它更适合用于生产环境,需要跨多个服务器进行扩展和保障服务不中断的场景。

2. 🤝 如何结合使用

最关键的一点是:您可以在 Docker Swarm 模式下使用 docker-compose.yml 文件

  1. Compose 文件的复用: 您定义好的 docker-compose.yml 文件不仅可以在单主机上用 docker-compose up 运行,也可以在 Docker Swarm 集群中通过 docker stack deploy 命令来部署。
  2. Stack (堆栈): 当您在 Swarm 集群中部署 docker-compose.yml 文件时,它会被视为一个 Stack (堆栈) ,文件中的每个服务都会被部署为 Swarm 的 Service (服务)
  3. 服务与容器: 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

相关推荐
春风有信2 小时前
【2026.05.01】Windows10安装Docker Desktop 4.71.0.0步骤及问题解决
运维·docker·容器
sthnyph6 小时前
docker compose安装redis
redis·docker·容器
W.A委员会7 小时前
Docker基本使用流程
运维·docker·容器
gwjcloud8 小时前
Kubernetes从入门到精通(进阶篇)03
云原生·容器·kubernetes
GuokLiu8 小时前
260502-Clawith-Docker安装过程
运维·docker·容器·claw
JesseDev9 小时前
Docker lnmp环境快速搭建开箱即用
运维·docker·容器
空中海10 小时前
Docker入门到精通
java·docker·eureka
小义_10 小时前
【Kubernetes】(十二)配置存储卷
云原生·容器·kubernetes
BduL OWED11 小时前
Docker:基于自制openjdk8镜像 or 官方openjdk8镜像,制作tomcat镜像
docker·容器·tomcat
.柒宇.11 小时前
AI掘金头条项目 Docker Compose 部署完整教程(附踩坑记录)
运维·后端·python·docker·容器·fastapi