пул соединений перезапуска docker-compose заполнен

Моя команда и я преобразуем часть нашей инфраструктуры в докер, используя docker-compose. Кажется, все работает отлично, единственная проблема, с которой я столкнулся, это перезагрузка, которая дает мне ошибку «пул соединений заполнен». Я пытаюсь выяснить, что является причиной этого. Если я удаляю 2 контейнера или (1 полная установка), все работает нормально.

Немного предыстории того, что я пытаюсь сделать. Это приложение Ruby on Rails, которое запускается с несколькими различными конфигурациями для разных команд внутри организации. Всего на сервере работает 14 различных контейнеров. ОС хост-сервера — CentOS, а команда compose запускается с MacBook Pro в той же сети. Я также пробовал это с виртуальной машиной boot2docker с тем же результатом.

Вот подробный вывод команды (с использованием виртуальной машины boot2docker) /5e6dfe34ec3e8dbb8f02c0755991ef11

Любая помощь или указатели приветствуются.


person Ryan Condron    schedule 03.04.2018    source источник


Ответы (4)


Я также боролся с этим сообщением об ошибке в своей среде разработки, в которой используется более десяти контейнеров, выполняемых через docker-compose.

WARNING: Connection pool is full, discarding connection: localhost

Я думаю, что обнаружил основную причину этой проблемы. Библиотека python requests поддерживает пул HTTP-соединений, которые библиотека docker использует для взаимодействия с Docker API и, предположительно, с самими контейнерами. Моя гипотеза заключается в том, что только те из нас, кто использует docker-compose с более чем 10 контейнерами, когда-либо увидят это. Проблема двоякая.

  • requests по умолчанию устанавливает размер пула соединений равным 10, и
  • похоже, нет никакого способа внедрить больший размер пула из библиотек docker-compose или docker

Я взломал решение. Мои библиотеки для requests находились в ~/.local/lib/python2.7/site-packages. Я нашел requests/adapters.py и изменил DEFAULT_POOLSIZE с 10 на 1000.

Это не производственное решение, оно довольно неясно и не выдержит обновления пакета.

person Squirrelsama    schedule 20.03.2019
comment
Итак, это проблема докера, знаете ли вы, была ли она решена в самых последних версиях или если для этого открыта проблема, я не смог найти ничего о - person gaber84; 22.01.2020

Вы можете попробовать сбросить сетевой пул перед развертыванием

$ docker network prune

Доки здесь: https://docs.docker.com/engine/reference/commandline/network_prune/

person andriy-baran    schedule 04.04.2018
comment
Спасибо за ответ, это, к сожалению, решило проблему. Это также никогда не бывает одним и тем же контейнером, он запускает один и тот же код, но не один и тот же конкретный экземпляр. - person Ryan Condron; 04.04.2018

У меня такая же проблема с моим приложением Django. Запуск около 70 контейнеров в docker-compose. Этот пост помог мне, так как кажется, что обрезка необходима после установки COMPOSE_PARALLEL_LIMIT.

Я сделал:

docker-compose down
export COMPOSE_PARALLEL_LIMIT=1000
docker network prune
docker-compose up -d
person Jimmy Engelbrecht    schedule 28.04.2020

Для будущих читателей. Небольшое дополнение к ответу @andriy-baran. Вам нужно остановить все контейнеры, удалить их и запустить сетевую обрезку (поскольку команда обрезки удаляет только неиспользуемые сети)

Что-то вроде этого:

docker kill $(docker ps -q)
docker rm $(docker ps -a -q)
docker network prune
person Tal Joffe    schedule 07.05.2020