Подтвердить что ты не робот

Docker Игнорирует limit.conf(пытается решить ошибку "слишком много открытых файлов" )

Я запускаю веб-сервер, который обрабатывает много тысяч параллельных сетевых подключений. Чтобы это было возможно, на Debian linux (мое базовое изображение google/debian: wheezy, работающее на GCE), где по умолчанию для открытых файлов установлено значение 1000, я обычно просто устанавливаю ulimit на нужный номер (64 000),

Это отлично работает, за исключением того, что, когда я выполнил док-версию моего приложения и развернул его, я обнаружил, что тип докеров игнорирует ограничения. Я пробовал следующее (все на главной машине, а не на самом контейнере):

MAX=64000
sudo bash -c "echo \"* soft nofile $MAX\" >> /etc/security/limits.conf"
sudo bash -c "echo \"* hard nofile $MAX\" >> /etc/security/limits.conf"
sudo bash -c "echo \"ulimit -c $MAX\" >>  /etc/profile"
ulimit -c $MAX

После ряда исследований я обнаружил, что люди смогли решить подобную проблему, выполнив следующие действия:

sudo bash -c "echo \"limit nofile 262144 262144\" >> /etc/init/docker.conf"

и перезагрузка/перезапуск службы докеров.

Однако все вышеперечисленное не работает: я получаю сообщение об ошибке "слишком много открытых файлов", когда мое приложение запускается внутри контейнера (выполнение ниже без докера решает проблему).

Я попытался запустить ulimit -a внутри контейнера, чтобы получить указание, если работала установка ulimit, но при этом возникает ошибка, из-за которой ulimit не является исполняемым файлом, который является частью PATH.

Кто-нибудь столкнулся с этим и/или может предложить способ получить докер, чтобы узнать пределы?

4b9b3361

Ответ 1

Мне удалось устранить эту проблему со следующей конфигурацией:

Я использовал ubuntu 14.04 linux для докерной машины и хост-машины.

На машине хост вам необходимо:

  • обновите /etc/security/limits.conf, чтобы включить: * - nofile 64000
  • добавить в /etc/sysctl.conf: fs.file-max = 64000
  • restart sysctl: sudo sysctl -p

Ответ 2

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

docker run --ulimit nofile=5000:5000 <image-tag>

Ответ 3

С помощью docker-compose вы можете настроить ulimits.

https://docs.docker.com/compose/compose-file/#ulimits

Вы можете добавить мягкие/жесткие пределы в качестве отображения.

ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 40000

Хотя это не идеальный вариант, вы можете запускать контейнер с привилегированным вариантом (в основном для быстрого неоптимального решения для среды Dev, не рекомендуется, если безопасность является проблемой).

docker run --privileged

Пожалуйста, смотрите:

https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities