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.
Кто-нибудь столкнулся с этим и/или может предложить способ получить докер, чтобы узнать пределы?
Ответы
Ответ 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