news 2026/1/19 9:45:42

Docker Compose 和 Docker Swarm

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Docker Compose 和 Docker Swarm

Docker Swarm 和 Docker Compose 都是Docker 官方提供的容器编排工具,但它们的应用场景和目标有所不同,它们的关系可以概括为:分工不同、可以结合使用

1. 🎯 用途和范围的不同

特性Docker ComposeDocker Swarm
应用范围单主机/单服务器多主机集群
主要目标管理单个应用多个容器的生命周期(启动、停止、重建等)。管理整个集群服务的部署、扩容、负载均衡和高可用性。
配置文件docker-compose.yml也使用docker-compose.yml,但通过docker stack deploy命令部署为Service (服务)
编排类型多容器应用编排集群服务编排
命令行工具docker-compose up/downdocker 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

version:'3.8'services:web:image:nginx:latest# 使用 Nginx 作为简单的 Web 服务ports:-"8080:80"# 将集群的 8080 端口映射到容器的 80 端口deploy:replicas:3# **Swarm 特有配置:** 部署 3 个副本,实现负载均衡和高可用restart_policy:condition:on-failurenetworks:-app-netredis:image:redis:6.2-alpine# 使用 Redis 作为缓存服务networks:-app-net# 在 Swarm 中,默认情况下,服务只有 1 个副本,除非明确指定 replicasnetworks:app-net:driver:overlay# **Swarm 特有配置:** 必须使用 overlay 网络,以便跨节点通信

🔑 关键区别:在 Swarm 中,Compose 文件中的deploy部分是专门用于 Swarm 模式的配置,它定义了服务的高可用性replicas)和重启策略等。此外,网络驱动必须使用overlay


第二步:初始化或加入 Swarm 集群

如果您还没有 Swarm 集群,您需要在您的主机上初始化一个:

# 在 Manager 节点上执行docker swarm init

如果您已有一个集群,请确保您在 Manager 节点上执行后续的部署操作。


第三步:使用docker stack deploy部署应用

使用docker stack deploy命令,指定您的 Compose 文件和您希望给这个应用堆栈取的名字(例如:my-stack)。

# 在 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. 查看堆栈和服务列表
docker stackls# 查看已部署的堆栈docker stack services my-stack# 查看堆栈中包含的服务及其状态

示例输出 (docker stack services my-stack):

IDNAMEMODEREPLICASIMAGEPORTS
aj1…my-stack_webReplicated3/3nginx:latest*:8080->80/tcp
qb3…my-stack_redisReplicated1/1redis:6.2-alpine
2. 查看服务详情和任务 (Task) 分布
dockerservicepsmy-stack_web# 查看 web 服务的所有运行中的容器 (Tasks)

您会看到三个my-stack_web的任务,它们可能分布在集群的不同节点上,这表明Swarm 正在进行高可用和负载均衡


第五步:访问应用

由于我们在web服务中将端口8080映射到了容器的80端口,您可以访问集群中任一节点8080端口来访问 Nginx 服务。

# 假设任意一个节点(Manager 或 Worker)的 IP 是 192.168.1.10http://192.168.1.10:8080

得益于 Swarm 的路由网格 (Routing Mesh),无论哪个节点接收到请求,它都会自动将请求路由到正在运行的web服务副本中的一个。


第六步:清理应用

当您完成测试后,可以使用docker stack rm命令轻松移除整个应用堆栈:

docker stackrmmy-stack

总结:

docker-compose.yml文件是应用的蓝图docker stack deploy命令将这个蓝图应用到整个Docker Swarm 集群,由 Swarm 来负责将应用转换为可扩展、高可用的Service

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/14 2:02:28

26、Linux设备驱动与init程序详解

Linux设备驱动与init程序详解 1. 发现硬件配置 设备驱动通常用于与硬件进行交互,但虚拟驱动仅操作内存结构,缺乏与真实硬件的交互。要与硬件交互,首先要能够发现硬件,因为在不同的配置下,硬件可能位于不同的地址。 1.1 硬件自动提供信息 某些情况下,硬件自身会提供相…

作者头像 李华
网站建设 2025/12/14 2:01:40

37、Linux 性能分析工具全解析

Linux 性能分析工具全解析 1. 符号表与编译标志 在对系统进行性能分析时,我们会立刻遇到一个问题。虽然观察系统的自然状态很重要,但工具往往需要额外的信息才能理解事件。 部分工具需要特殊的内核选项,比如 perf、Ftrace 和 LTTng。因此,可能需要构建并部署一个新的内核…

作者头像 李华
网站建设 2026/1/12 12:30:34

39、Linux性能分析与实时编程指南

Linux性能分析与实时编程指南 1. Linux性能分析工具概述 在Linux系统中,有众多用于性能分析和跟踪的工具,以下是一些常见工具的介绍: - top :当系统性能不佳时,可先用 top 命令初步识别问题。 - perf record/report :若问题出在单个应用程序,可用此工具对其进行…

作者头像 李华
网站建设 2025/12/14 1:53:45

视频进度控制脚本

// 视频进度控制脚本 - 直接复制到浏览器控制台运行 // 支持左右箭头键快进/快退视频(function () {use strict;// 配置const SEEK_SECONDS 5; // 每次跳转的秒数const LONG_SEEK_SECONDS 10; // 长按Shift时跳转的秒数console.log(🎬 视频键盘控制已启用);consol…

作者头像 李华
网站建设 2026/1/18 11:38:41

一篇拿下!C++:类和对象(上)、封装、实例化和this指针详解

一、类的定义类的定义格式class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。为了区分…

作者头像 李华