news 2026/4/8 2:58:58

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进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/3 20:09:17

从零开始:Docker Compose YAML 文件深度解析与最佳实践

在现代应用开发中,一个应用通常由多个服务组成:Web 服务器、数据库、缓存、消息队列等。手动启动和管理这些容器不仅繁琐,而且容易出错。 Docker Compose 正是解决这一痛点的利器。它允许你使用一个声明式的 YAML 文件来定义整个应用栈的结构…

作者头像 李华
网站建设 2026/3/31 15:34:13

29、Linux 系统的电源管理与进程线程模型解析

Linux 系统的电源管理与进程线程模型解析 1. CPUIdle 驱动 CPUIdle 与 CPUFreq 子系统类似,由属于板级支持包(BSP)的驱动和决定策略的调节器组成。但与 CPUFreq 不同的是,CPUIdle 的调节器在运行时不能更改,也没有用户空间调节器的接口。 CPUIdle 在 /sys/devices/syst…

作者头像 李华
网站建设 2026/3/31 0:37:35

Flutter应用嵌入鸿蒙智慧座舱数字孪生界面的实现

欢迎大家加入[开源鸿蒙跨平台开发者社区](https://openharmonycrossplatform.csdn.net),一起共建开源鸿蒙跨平台生态。Flutter应用嵌入鸿蒙智慧座舱数字孪生界面的实现Flutter作为跨平台开发框架,结合鸿蒙系统的分布式能力,可以在智慧座舱场景…

作者头像 李华
网站建设 2026/4/3 20:29:00

33、深入理解内存管理:交换、映射与泄漏检测

深入理解内存管理:交换、映射与泄漏检测 1. 内存交换(Swapping) 内存交换的核心思想是预留一些存储空间,让内核可以将未映射到文件的内存页面放置其中,从而释放内存以供其他用途。通过交换文件的大小,有效增加了物理内存的大小。不过,这并非万能之策,将页面复制到交换…

作者头像 李华
网站建设 2026/4/7 4:10:45

34、Linux内存管理与GDB调试全解析

Linux内存管理与GDB调试全解析 1. 内存耗尽问题 在Linux系统中,标准的内存分配策略是过度提交(over - commit),即内核允许应用程序分配的内存超过实际物理内存。多数情况下,这一策略运行良好,因为应用程序通常会请求比实际所需更多的内存。同时,这也有利于 fork(2) …

作者头像 李华
网站建设 2026/4/7 10:29:54

【打印】默认长边装订

只要正面 背面,方向正常对齐,不需要翻转阅读 → 选“长边装订”即可。 下面我给你讲清楚为什么选这个。 ✅ 你现在的需求是什么? 你说: “只是把第二页放在第一页的背面”想要普通书本那种阅读方式不需要倒着翻、不需要侧着翻 …

作者头像 李华