如何使用 docker compose alpha scale 命令扩展服务

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何使用 docker compose alpha scale 命令来扩展 Docker Compose 项目中定义的服务。我们将从准备一个简单的 Docker Compose 项目开始,包括安装 Docker Compose、创建一个基础的 web 应用,并定义其 Dockerfile 和依赖项。

完成项目设置后,你将探索如何使用 docker compose alpha scale 来扩展单个服务、同时扩展多个服务,以及在不启动依赖项的情况下扩展服务。通过动手实践,你将体会到 scale 命令在管理服务运行实例数量方面的灵活性和强大功能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/run -.-> lab-555071{{"如何使用 docker compose alpha scale 命令扩展服务"}} docker/ls -.-> lab-555071{{"如何使用 docker compose alpha scale 命令扩展服务"}} docker/ps -.-> lab-555071{{"如何使用 docker compose alpha scale 命令扩展服务"}} docker/rm -.-> lab-555071{{"如何使用 docker compose alpha scale 命令扩展服务"}} docker/build -.-> lab-555071{{"如何使用 docker compose alpha scale 命令扩展服务"}} end

准备一个简单的 Docker Compose 项目

在这一步中,我们将准备一个简单的 Docker Compose 项目。由于 LabEx 环境中没有预装 Docker Compose,我们将首先安装它。然后,我们会创建一个简单的 web 应用和一个 Docker Compose 文件来定义并运行它。

首先,让我们安装 Docker Compose。我们将下载 Docker Compose 二进制文件并赋予可执行权限。

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

现在,让我们通过检查 Docker Compose 版本来验证安装。

docker-compose --version

你应该能在输出中看到已安装的 Docker Compose 版本。

接下来,我们将创建一个简单的 web 应用。我们将使用一个基础的 Python Flask 应用。为项目创建一个目录并进入该目录。

mkdir my-web-app
cd my-web-app

my-web-app 目录中,创建一个名为 app.py 的文件,内容如下:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, Docker Compose!'

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')

这是一个简单的 Flask 应用,当被访问时会返回 "Hello, Docker Compose!"。

现在,我们需要一个 Dockerfile 来为我们的 Flask 应用构建 Docker 镜像。在 my-web-app 目录中创建一个名为 Dockerfile 的文件,内容如下:

FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

EXPOSE 5000

CMD ["python", "app.py"]

这个 Dockerfile 使用了精简版的 Python 3.9 镜像,设置了工作目录,从 requirements.txt 复制并安装依赖项,复制应用代码,暴露 5000 端口,并指定了运行应用的命令。

我们还需要一个 requirements.txt 文件来声明 Flask 依赖。在 my-web-app 目录中创建一个名为 requirements.txt 的文件,内容如下:

Flask==2.2.2

最后,我们将创建一个 docker-compose.yml 文件来定义我们的服务。在 my-web-app 目录中创建一个名为 docker-compose.yml 的文件,内容如下:

version: "3.8"

services:
  web:
    build: .
    ports:
      - "5000:5000"

这个 docker-compose.yml 文件定义了一个名为 web 的服务。它告诉 Docker Compose 使用当前目录(.)中的 Dockerfile 构建镜像,并将主机的 5000 端口映射到容器内的 5000 端口。

现在,让我们使用 Docker Compose 构建并运行服务。确保你位于 ~/project/my-web-app 目录中。

docker-compose up -d

这个命令会构建镜像(如果尚未构建),为 web 服务创建容器,并以分离模式(-d)启动它。

你可以使用 docker ps 命令检查容器是否在运行。

docker ps

你应该能看到一个名为 my-web-app-web-1 的服务容器正在运行。

要验证应用是否正常工作,你可以使用 curl 访问它。

curl http://localhost:5000

你应该能看到输出 "Hello, Docker Compose!"。

使用 docker compose alpha scale 扩展服务

在这一步中,我们将学习如何使用 docker compose alpha scale 命令来扩展服务。扩展服务意味着增加或减少该服务的运行实例(容器)数量,这对于处理增加的负载或实现高可用性非常有用。

docker compose alpha scale 命令允许你为特定服务设置所需的副本数量。alpha 子命令表明这是 Docker Compose 中的一个较新功能。

请确保你位于包含 docker-compose.yml 文件的 ~/project/my-web-app 目录中。

当前,我们有一个 web 服务实例正在运行。我们可以通过列出运行中的容器并按服务名称过滤来验证这一点。

docker ps --filter "name=my-web-app-web"

你应该只能看到一个容器被列出。

现在,让我们将 web 服务扩展到 3 个实例。我们将使用 docker compose alpha scale 命令,后跟服务名称和所需的副本数量。

docker compose alpha scale web=3

该命令将为 web 服务启动两个新容器,使实例总数达到 3 个。

运行命令后,你可以再次检查运行中的容器以查看扩展后的实例。

docker ps --filter "name=my-web-app-web"

你现在应该能看到三个列出的容器,每个容器都有不同的容器 ID 和名称(例如 my-web-app-web-1my-web-app-web-2my-web-app-web-3)。

docker compose alpha scale 命令是一种无需修改 docker-compose.yml 文件并重新运行 docker compose up 即可动态调整服务副本数量的便捷方法。

要将服务缩减规模,你可以使用相同的命令并指定较小的数字。例如,缩减到 1 个实例:

docker compose alpha scale web=1

这将停止并移除额外的容器,只保留一个实例运行。

让我们为下一步将其重新扩展到 3 个实例。

docker compose alpha scale web=3

同时扩展多个服务

在这一步中,我们将学习如何使用 docker compose alpha scale 命令同时扩展多个服务。当你的应用中有多个需要协同扩展以应对负载增加或保持架构平衡的服务时,这个功能非常有用。

为了演示这一点,我们将在 docker-compose.yml 文件中添加另一个简单的 Nginx 服务来提供静态内容。

首先,为 Nginx 静态内容创建一个目录。

mkdir static

static 目录中,创建一个名为 index.html 的简单 HTML 文件,内容如下:

<!doctype html>
<html>
  <head>
    <title>Static Content</title>
  </head>
  <body>
    <h1>Hello from Nginx!</h1>
  </body>
</html>

现在,让我们更新 ~/project/my-web-app 目录中的 docker-compose.yml 文件以包含 Nginx 服务。使用 nano 打开 docker-compose.yml 文件。

nano docker-compose.yml

web 服务下方添加以下服务定义:

nginx:
  image: nginx:latest
  ports:
    - "80:80"
  volumes:
    - ./static:/usr/share/nginx/html

更新后的 docker-compose.yml 文件应如下所示:

version: "3.8"

services:
  web:
    build: .
    ports:
      - "5000:5000"

  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./static:/usr/share/nginx/html

这添加了一个 nginx 服务,它使用 nginx:latest 镜像,将主机的 80 端口映射到容器的 80 端口,并将 ./static 目录挂载到 Nginx 的默认网站根目录(/usr/share/nginx/html)。

保存 docker-compose.yml 文件并退出 nano(Ctrl+X,Y,Enter)。

现在,让我们启动新服务。由于我们修改了 docker-compose.yml 文件,需要再次运行 docker compose up-d 参数表示在后台运行容器。

docker compose up -d

Docker Compose 将创建并启动 nginx 服务。web 服务应该已经在之前的步骤中运行。

你可以使用 docker ps 验证两个服务是否都在运行。

docker ps

你应该能看到 my-web-app-web-1my-web-app-web-2my-web-app-web-3my-web-app-nginx-1 的容器。

现在,让我们同时将 web 服务扩展到 5 个实例,将 nginx 服务扩展到 2 个实例。我们可以在 docker compose alpha scale 命令中列出服务及其所需的副本数量来实现这一点。

docker compose alpha scale web=5 nginx=2

该命令将 web 服务扩展到 5 个实例,将 nginx 服务扩展到 2 个实例。

运行命令后,再次检查运行中的容器。

docker ps

你现在应该能看到 5 个 web 服务容器和 2 个 nginx 服务容器。

这演示了如何通过单个 docker compose alpha scale 命令扩展多个服务,从而高效管理应用组件的扩展。

独立扩展服务(不启动依赖项)

在本步骤中,我们将探索如何使用 docker compose alpha scale 命令单独扩展特定服务,而不启动其依赖项。默认情况下,当你扩展服务时,Docker Compose 可能会同时启动或确保其依赖项处于运行状态。但在某些场景下,你可能希望仅扩展单个服务而不影响其他组件。

为了演示这一点,我们将为 web 服务添加一个依赖项。这里我们会添加一个简单的数据库服务(尽管在这个示例中我们不会在 web 应用中实现实际的数据库逻辑),仅用于展示依赖关系概念。

使用 nano 打开 ~/project/my-web-app 目录中的 docker-compose.yml 文件:

nano docker-compose.yml

添加一个新的数据库服务定义(例如使用 postgres 镜像),并在 web 服务中添加 depends_on 部分:

version: "3.8"

services:
  web:
    build: .
    ports:
      - "5000:5000"
    depends_on:
      - db

  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./static:/usr/share/nginx/html

  db:
    image: postgres:latest
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydatabase

更新后的 docker-compose.yml 文件现在包含一个使用 postgres:latest 镜像的 db 服务,且 web 服务添加了 depends_on: - db 行,表明其依赖 db 服务。

保存文件并退出 nano(Ctrl+X,Y,Enter)。

现在使用更新后的配置启动服务:

docker compose up -d

由于 web 服务依赖 db 服务,Docker Compose 现在会同时创建并启动 db 服务。

你可以使用以下命令验证所有服务是否正常运行:

docker ps

应该能看到 webnginxdb 的容器。

假设我们现在希望仅将 web 服务扩展到 4 个实例,而不启动或影响 db 服务(如果它原本没有运行)。默认情况下,docker compose alpha scale 命令会遵循依赖关系。但在这个特定场景中,当我们只想扩展目标服务时,标准的 docker compose alpha scale 命令已经足够,因为它主要关注目标服务的实例数量调整。depends_on 关系主要影响使用 docker compose up 时的启动顺序,而 docker compose alpha scale 则专注于调整指定服务的实例数量。

web 服务扩展到 4 个实例:

docker compose alpha scale web=4

该命令会扩展 web 服务到 4 个实例。如果 db 服务原本没有运行,这个命令不会显式启动它;但由于之前通过 docker compose up 启动了,它会保持运行状态。关键点在于:docker compose alpha scale 的设计目的是扩展指定服务,而不会主动触发未运行依赖项的启动。

验证运行的 web 服务容器数量:

docker ps --filter "name=my-web-app-web"

现在应该能看到 4 个 web 服务容器,同时 db 服务容器也应保持运行。

这证明了 docker compose alpha scale 专注于目标服务的扩展操作。

最后,停止所有服务:

docker compose down

该命令将停止并移除 Docker Compose 为本项目创建的所有容器、网络和卷。

总结

在本实验中,我们学习了如何准备一个简单的 Docker Compose 项目。这包括在 LabEx 环境中安装 Docker Compose、验证安装,然后创建一个基本的 Python Flask Web 应用程序。我们还创建了 Dockerfile 来为应用程序构建 Docker 镜像,以及 requirements.txt 文件来列出应用程序的依赖项。这个初始设置为探索 Docker Compose 功能奠定了基础,特别是在后续步骤中重点关注的扩展服务功能。