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

相关推荐
敲上瘾4 小时前
MySQL主从集群解析:从原理到Docker实战部署
android·数据库·分布式·mysql·docker·数据库架构
罗不丢4 小时前
docker镜像配置
运维·docker·容器
杰克逊的日记4 小时前
k8s某pod节点资源使用率过高,如何调整
linux·docker·kubernetes
库库的里昂4 小时前
开源设计和原型创作平台Penpot本地docker部署与远程在线协作
docker·容器·开源
CAFEBABE 3413 小时前
linux离线安装docker并启动
linux·docker·eureka
yuguo.im16 小时前
Docker 两大基石:Namespace 和 Cgroups
运维·docker·容器
会飞的土拨鼠呀16 小时前
docker部署 outline(栗子云笔记)
笔记·docker·容器
Jelly-小丑鱼17 小时前
Linux搭建syslog日志服务器
linux·服务器·docker·日志服务器·syslog服务器
没有bug.的程序员17 小时前
高频IO服务优化实战指南
java·jvm·spring·容器