Ошибка в соединении (111) при использовании Locust для тестирования производительности для приложения docker-compose

Я использую 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\',))",),)'

Я запускаю 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

Любая помощь приветствуется!


person Eric Broda    schedule 05.03.2020    source источник


Ответы (1)


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 compose:

например, будет работать следующая конфигурация файла 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 compose:

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 compose:

контейнеры должны находиться в одной сети, чтобы они могли связываться друг с другом. для этого создадим общую мостовую сеть с именем locustnw:

docker network create --driver bridge locustnw

теперь запустите контейнер вашего приложения в этой сети. Предположим, он прослушивает порт 8000 с именем web:

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

Теперь запустите свой контейнер с саранчой в той же сети. Предположим, он прослушивает порт 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 - это ключи!

person victor israe    schedule 03.06.2020
comment
Docker-compose.yml на странице примера, на которую вы указали ссылку, содержит только службы master и worker. Я попробовал эту настройку - я запускаю свою службу из IDE и docker-compose up, но в конечном итоге сталкиваюсь с той же проблемой, что и @Eric Broda: я могу открыть веб-интерфейс, но когда я запускаю тест, я вижу ConnectionError(MaxRetryError .... AFAIU рабочие не могут общаться вне сети, созданной docker-compose. В вашем примере служба является частью файла создания, поэтому находится в той же сети. Есть ли способ сделать мою службу (которую я начал не в составе compose) доступной для рабочих? - person Anton Daneyko; 28.10.2020
comment
Просто хотел поблагодарить вас за ваш ответ, потому что это единственное подробное объяснение этой настройки, которое я нашел до сих пор. - person Anton Daneyko; 30.10.2020
comment
Я рада, что смогла тебе помочь. Хотя, думаю, я не смогу помочь вам в этом конкретном случае, потому что все, что я знаю о нем, основано на эмпирических попытках и наблюдениях за документами. Все, что я мог бы сказать об этом, было бы лишь моими предположениями. Я думаю, что, возможно, изменив веб-интерфейс, вы сможете получить желаемый результат. На мой взгляд, интерфейс (стиль моста) в этом случае не будет лучшим решением. Возможно, вы можете посмотреть сетевые интерфейсы докеров: ссылка - person victor israe; 18.11.2020