Skip to content

第 11 章 · Docker 容器化运行

本章目标:使用官方 Docker 镜像运行 Locust,通过 Docker Compose 编排 master + workers 分布式压测,并掌握自定义镜像与 OpenTelemetry 镜像的用法。

11.1 为什么用 Docker 运行 Locust

在本地跑单机压测很方便,但生产级压测通常面临三个问题:

  1. 环境一致性——压测机依赖版本不一致会导致结果不可复现;
  2. 资源隔离——压测进程与应用进程争抢 CPU/内存会扭曲结果;
  3. 快速扩容——需要临时拉起多个 worker 节点。

Docker 解决了以上全部:镜像锁定环境、容器天然隔离、docker compose up --scale 一行扩容。

11.2 使用官方镜像

官方镜像托管在 Docker Hub 的 locustio/locust。假设当前目录有 locustfile.py

bash
docker run -p 8089:8089 -v $PWD:/mnt/locust locustio/locust -f /mnt/locust/locustfile.py

参数解读:

参数说明
-p 8089:8089将容器的 8089 端口(Web UI)映射到宿主机
-v $PWD:/mnt/locust将当前目录挂载进容器,让 Locust 能读取 locustfile
-f /mnt/locust/locustfile.py指定 locustfile 路径

Windows 用户注意

Windows 下 -v 挂载偶尔报错,改用 --mount 形式:

bash
docker run -p 8089:8089 --mount type=bind,source=%cd%,target=/mnt/locust locustio/locust -f /mnt/locust/locustfile.py

启动后访问 http://localhost:8089 即可看到 Web UI。

无头模式运行(不打开浏览器):

bash
docker run -p 8089:8089 -v $PWD:/mnt/locust locustio/locust \
  -f /mnt/locust/locustfile.py --headless -u 100 -r 10 --run-time 60s

11.3 Docker Compose 编排分布式压测

分布式压测需要一个 master 节点(分发任务、汇总结果)和多个 worker 节点(产生实际负载)。以下 compose 文件一键编排:

yaml
# docker-compose.yml
version: '3'
services:
  master:
    image: locustio/locust
    ports:
      - "8089:8089"
    volumes:
      - ./:/mnt/locust
    command: -f /mnt/locust/locustfile.py --master -H http://master:8089

  worker:
    image: locustio/locust
    volumes:
      - ./:/mnt/locust
    command: -f /mnt/locust/locustfile.py --worker --master-host master

关键参数说明:

参数说明
--master标记此节点为 master
-H http://master:8089告诉 master 它自己的地址(供 worker 连接)
--worker标记此节点为 worker
--master-host masterworker 通过服务名 master 找到主节点

启动 master + 4 个 worker:

bash
docker-compose up --scale worker=4

动态扩容到 10 个 worker(运行中):

bash
docker-compose up --scale worker=10 -d

11.4 自定义镜像:安装第三方依赖

当你的 locustfile 需要额外 Python 包时,以官方镜像为基础构建自定义镜像:

dockerfile
# Dockerfile
FROM locustio/locust
RUN pip install some-package
RUN pip install faker pandas
bash
docker build -t my-locust .
docker run -p 8089:8089 -v $PWD:/mnt/locust my-locust -f /mnt/locust/locustfile.py

在 Docker Compose 中替换 image: locustio/locustimage: my-locust 即可。

不要在容器内 pip install 后提交容器

正确做法是写入 Dockerfile 并重新 build——保证可重复构建。

11.5 OpenTelemetry 镜像

如果需要将压测指标导出到 OpenTelemetry 后端(Jaeger、Prometheus 等),Locust 提供了预装 locust[otel] extras 的专用镜像:

bash
docker run -p 8089:8089 -v $PWD:/mnt/locust locustio/locust-otel \
  -f /mnt/locust/locustfile.py --otel

配合 Grafana 可以实时查看 RPS 曲线、响应时间分位数和错误率热力图。

本章小结

  • 官方镜像 locustio/locust,挂载 $PWD:/mnt/locust 即可运行;
  • Docker Compose 用 --scale worker=N 一行扩容 worker 数量;
  • 第三方依赖写入 Dockerfile 以官方镜像为 base 构建;
  • 需要 OTel 支持时使用 locustio/locust-otel 镜像并传 --otel 参数。

🧪 随堂测验

点击你认为正确的选项。答错时会展示正确答案与原因解析。

1. Locust 官方 Docker 镜像的名称是什么?

2. 在 Docker Compose 中,如何动态增加 worker 数量到 10?

3. Worker 节点连接 Master 的关键参数是哪个?

4. 需要在 Locust 中使用 OpenTelemetry 导出指标,应该怎么做?

🛠️ 动手实践

  1. 编写一个简单的 locustfile(访问 httpbin.org/get),用 Docker 单机运行并观察 Web UI 数据。
  2. 用 Docker Compose 启动 1 master + 4 workers 的分布式压测,然后在 Web UI 中查看各 worker 的状态。
  3. 创建一个自定义 Dockerfile 安装 faker 库,编写一个生成随机用户数据的压测脚本并运行。

掌握容器化后,下一章学习在 Kubernetes 上用 Operator 大规模编排压测。