第 11 章 · Docker 容器化运行
本章目标:使用官方 Docker 镜像运行 Locust,通过 Docker Compose 编排 master + workers 分布式压测,并掌握自定义镜像与 OpenTelemetry 镜像的用法。
11.1 为什么用 Docker 运行 Locust
在本地跑单机压测很方便,但生产级压测通常面临三个问题:
- 环境一致性——压测机依赖版本不一致会导致结果不可复现;
- 资源隔离——压测进程与应用进程争抢 CPU/内存会扭曲结果;
- 快速扩容——需要临时拉起多个 worker 节点。
Docker 解决了以上全部:镜像锁定环境、容器天然隔离、docker compose up --scale 一行扩容。
11.2 使用官方镜像
官方镜像托管在 Docker Hub 的 locustio/locust。假设当前目录有 locustfile.py:
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 形式:
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。
无头模式运行(不打开浏览器):
docker run -p 8089:8089 -v $PWD:/mnt/locust locustio/locust \
-f /mnt/locust/locustfile.py --headless -u 100 -r 10 --run-time 60s11.3 Docker Compose 编排分布式压测
分布式压测需要一个 master 节点(分发任务、汇总结果)和多个 worker 节点(产生实际负载)。以下 compose 文件一键编排:
# 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 master | worker 通过服务名 master 找到主节点 |
启动 master + 4 个 worker:
docker-compose up --scale worker=4动态扩容到 10 个 worker(运行中):
docker-compose up --scale worker=10 -d11.4 自定义镜像:安装第三方依赖
当你的 locustfile 需要额外 Python 包时,以官方镜像为基础构建自定义镜像:
# Dockerfile
FROM locustio/locust
RUN pip install some-package
RUN pip install faker pandasdocker build -t my-locust .
docker run -p 8089:8089 -v $PWD:/mnt/locust my-locust -f /mnt/locust/locustfile.py在 Docker Compose 中替换 image: locustio/locust 为 image: my-locust 即可。
不要在容器内 pip install 后提交容器
正确做法是写入 Dockerfile 并重新 build——保证可重复构建。
11.5 OpenTelemetry 镜像
如果需要将压测指标导出到 OpenTelemetry 后端(Jaeger、Prometheus 等),Locust 提供了预装 locust[otel] extras 的专用镜像:
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 导出指标,应该怎么做?
🛠️ 动手实践
- 编写一个简单的 locustfile(访问 httpbin.org/get),用 Docker 单机运行并观察 Web UI 数据。
- 用 Docker Compose 启动 1 master + 4 workers 的分布式压测,然后在 Web UI 中查看各 worker 的状态。
- 创建一个自定义 Dockerfile 安装
faker库,编写一个生成随机用户数据的压测脚本并运行。
掌握容器化后,下一章学习在 Kubernetes 上用 Operator 大规模编排压测。