使用 Locust 对 docker-compose 应用程序进行性能测试时连接被拒绝错误 (111)

Connection refused error (111) when using Locust for Performance Testing against docker-compose app

我正在使用性能测试工具 Locust 对在 docker-compose 中设置为 运行 的应用程序进行负载测试。对于每个请求,我都收到以下错误(连接被拒绝,错误 111):

Error report
 # occurrences      Error
--------------------------------------------------------------------------------------------------------------------------------------------
 5                  GET /parties/: 'ConnectionError(MaxRetryError("HTTPConnectionPool(host=\'localhost\', port=8080): Max retries exceeded with url: /parties/ (Caused by NewConnectionError(\'<urllib3.connection.HTTPConnection object at 0x7fa6f294df28>: Failed to establish a new connection: [Errno 111] Connection refused\',))",),)'

我从 docker 容器中 运行ning Locust,如下所示:

docker run --volume /mydir/locustfile:/mnt/locust -e LOCUSTFILE_PATH=/mnt/locust/locustfile.py -e TARGET_URL=https://localhost:8080/parties -e LOCUST_OPTS="--clients=1 --no-web --run-time=600" locustio/locust

奇怪的是,当我使用 curl 命中完全相同的 URL 时,它工作正常。

curl http://localhost:8080/parties

感谢任何帮助!

localhost 可能是在您的上下文中使用的错误主机名。使用容器时,主机名必须与容器的名称相匹配。所以使用你的容器名称而不是 localhost.

参考文献:

https://github.com/elastic/elasticsearch-py/issues/715

https://docs.locust.io/en/latest/running-locust-docker.html

https://docs.locust.io/en/stable/configuration.html

一般假设:

locustfile.py存在于当前工作目录

docker组成的分布式示例:

例如,以下 docker-compose.yml 文件配置将起作用:

services:
  web:
    build: .
    command: python manage.py runserver 0:8000
    volumes:
      - .:/code/
    ports:
      - "8000:8000"
  master:
    image: locustio/locust
    ports:
      - "8089:8089"
    volumes:
      - ./:/mnt/locust
    command: -f /mnt/locust/locustfile.py --master -H http://web:8000
  worker:
    image: locustio/locust
    volumes:
      - ./:/mnt/locust
    command: -f /mnt/locust/locustfile.py --worker --master-host master

以下行中的 -H 标志(--host 的别名)可以解决问题:

command: -f /mnt/locust/locustfile.py --master -H http://web:8000

使用 docker 编写的非分布式示例:

services:
  web:
    build: .
    command: python manage.py runserver 0:8000
    volumes:
      - .:/code/
    ports:
      - "8000:8000"
  locust:
    image: locustio/locust
    ports:
      - "8089:8089"
    volumes:
      - ./:/mnt/locust
    command: -f /mnt/locust/locustfile.py --host=http://web:8000

您还可以指定一个配置文件,而不是在命令行上定义标志。假设文件 locust.conf 存在于当前工作目录中:

locust.conf:

host: http://web:8000

所以在你的 docker-compose.yml 中你会:

command: -f /mnt/locust/locustfile.py --config=/mnt/locust/locust.conf

而不是:

command: -f /mnt/locust/locustfile.py --host=http://web:8000

没有docker的非分布式例子:

容器必须在同一个网络上,这样它们才能相互通信。为此,让我们创建一个名为 locustnw:

的通用桥接网络

docker network create --driver bridge locustnw

现在 运行 您的应用容器在此网络中。假设它正在侦听端口 8000 并命名为 web:

docker run -p 8000:8000 --network=locustnw --name web <my_image>

现在 运行 您的 Locust 容器,也在同一网络内。假设它正在监听 8089 端口:

docker run -p 8089:8089 --network=locustnw -v $PWD:/mnt/locust locustio/locust -f /mnt/locust/locustfile.py --host=http://web:8000

--network--name--host 标志是关键!