如何将多服务应用程序部署为 Docker Swarm 堆栈

DockerBeginner
立即练习

简介

在本教程中,我们将探索使用 Docker Swarm(一个强大的容器编排平台)部署多服务应用程序的过程。你将学习如何利用 Docker Compose 定义应用程序的服务,然后将它们无缝部署为 Docker Swarm 堆栈,确保可扩展性和高可用性。

理解 Docker Swarm

Docker Swarm 是一种用于 Docker 容器的原生集群和编排解决方案。它允许你管理一组 Docker 主机,并在这些主机上部署应用程序,从而提供高可用性和可扩展性。

什么是 Docker Swarm?

Docker Swarm 是 Docker 的一项内置功能,使你能够创建和管理一组 Docker 主机,称为 Swarm。在一个 Swarm 中,多个 Docker 主机(节点)作为一个单一的虚拟 Docker 主机协同工作。这使你能够在 Swarm 中部署应用程序和服务,并且 Docker 将为你处理负载均衡、扩展和故障转移。

Docker Swarm 中的关键概念

  • Swarm:一组已配置为协同工作的 Docker 主机。
  • 节点:作为 Swarm 一部分的单个 Docker 主机。
  • 服务:一种声明式方式,用于定义你的应用程序或服务应如何在 Swarm 中部署和扩展。
  • 任务:作为服务一部分运行的容器的单个实例。
  • 覆盖网络:一种虚拟网络,连接 Swarm 中的所有节点,允许容器相互通信。

Docker Swarm 的优点

  • 高可用性:Docker Swarm 自动管理你的服务的健康状况和可用性,重新启动失败的任务并在 Swarm 中重新分配它们。
  • 可扩展性:你可以通过调整副本数量轻松扩展或缩小你的服务。
  • 负载均衡:Docker Swarm 提供内置的负载均衡,将传入请求分布到你的服务的任务中。
  • 简单性:Docker Swarm 是 Docker 的原生功能,便于设置和管理你的容器化应用程序。
graph TD A[Docker 主机] --> B[Docker 主机] B[Docker 主机] --> C[Docker 主机] C[Docker 主机] --> A[Docker 主机] A[Docker 主机] -- Swarm --> B[Docker 主机] B[Docker 主机] -- Swarm --> C[Docker 主机] C[Docker 主机] -- Swarm --> A[Docker 主机]

使用 Docker Compose 部署多服务应用程序

Docker Compose 是一个允许你定义和运行多容器应用程序的工具。当你需要部署一个由多个服务组成的复杂应用程序,且每个服务都有其自身的一组需求时,它特别有用。

创建 Docker Compose 文件

要使用 Docker Compose 部署多服务应用程序,你需要创建一个 docker-compose.yml 文件,该文件定义服务、它们的配置以及它们应如何连接。以下是一个示例:

version: "3"
services:
  web:
    image: labex/web-app:v1
    ports:
      - "80:8080"
    depends_on:
      - db
  db:
    image: labex/database:v1
    volumes:
      - db-data:/var/lib/postgresql/data
volumes:
  db-data:

在此示例中,我们有两个服务:webdbweb 服务使用 labex/web-app:v1 镜像,并将主机端口 80 映射到容器端口 8080。它还依赖于 db 服务。db 服务使用 labex/database:v1 镜像,并为数据库数据挂载一个卷。

部署应用程序

要部署应用程序,你可以使用以下命令:

## 构建镜像(如有必要)
docker-compose build

## 部署应用程序
docker-compose up -d

docker-compose up -d 命令将在后台启动所有服务。

扩展应用程序

使用 Docker Compose 的好处之一是能够轻松扩展你的服务。例如,要将 web 服务扩展到 3 个副本,你可以运行:

docker-compose scale web=3

这将创建另外两个 web 服务实例,并且 Docker Compose 将自动在它们之间进行流量负载均衡。

graph LR client[客户端] --> load_balancer[负载均衡器] load_balancer --> web1[Web 服务] load_balancer --> web2[Web 服务] load_balancer --> web3[Web 服务] web1 --> db[数据库服务] web2 --> db web3 --> db

管理和扩展 Docker Swarm 堆栈

一旦你将多服务应用程序部署为 Docker Swarm 堆栈,就可以使用各种命令来管理和扩展它。

部署堆栈

要将应用程序部署为 Docker Swarm 堆栈,可以使用 docker stack deploy 命令:

docker stack deploy -c docker-compose.yml my-app

这将根据 docker-compose.yml 文件中的配置创建 Swarm 服务。

监控堆栈

你可以使用以下命令来监控 Swarm 堆栈的状态:

## 列出正在运行的服务
docker stack services my-app

## 列出某个服务的任务(容器实例)
docker service ps my-app_web

## 查看某个服务的日志
docker service logs my-app_web

扩展堆栈

要扩展 Swarm 堆栈中的服务,可以使用 docker service scale 命令:

## 将 "web" 服务扩展到 5 个副本
docker service scale my-app_web=5

这将创建另外 4 个 web 服务实例,并且 Docker Swarm 将自动在它们之间进行流量负载均衡。

graph LR client[客户端] --> load_balancer[负载均衡器] load_balancer --> web1[Web 服务] load_balancer --> web2[Web 服务] load_balancer --> web3[Web 服务] load_balancer --> web4[Web 服务] load_balancer --> web5[Web 服务] web1 --> db[数据库服务] web2 --> db web3 --> db web4 --> db web5 --> db

更新堆栈

要使用服务的新版本更新 Swarm 堆栈,可以使用 docker service update 命令:

## 更新 "web" 服务以使用新镜像
docker service update my-app_web --image labex/web-app:v2

这将滚动更新 web 服务,用新容器替换旧容器,而不会中断服务。

通过使用这些命令,你可以有效地管理和扩展 Docker Swarm 堆栈,以确保多服务应用程序的高可用性和性能。

总结

在本教程结束时,你将对 Docker Swarm 以及如何使用它来部署和管理多服务应用程序有深入的理解。你将能够设置一个 Docker Swarm 集群,使用 Docker Compose 定义应用程序的服务,并将整个堆栈部署为一个可扩展且具有弹性的系统。