Ограничения ресурса могут быть установлены Docker во время запуска контейнера, и вы можете настроить эти параметры, используя аргумент --ulimit
при запуске контейнера. Это можно легко проверить с помощью strace
процесса containerd
во время запуска контейнера, например, следующей командой
$ docker run -it --ulimit nofile=1024 alpine
выдаст следующий след:
prlimit64(7246, RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=1024}, <unfinished ...>
и проверка ulimit
в контейнере дает ожидаемое предельное значение:
-n: file descriptors 1024
При запуске контейнера без явно указанного --ulimit
эта проверка дает другое значение (вероятно, унаследованное от containerd
), например ::
-n: file descriptors 1048576
Почему Docker разрешает устанавливать ограничения выше тех, которые вы наблюдаете, проверяя ulimit
на вашем хосте? Давайте откроем man 2 prlimit
:
A privileged process (under Linux: one with the CAP_SYS_RESOURCE capability
in the initial user namespace) may make arbitrary changes to either limit value.
Это означает, что любой процесс с возможностью CAP_SYS_RESOURCE
может установить любое ограничение ресурса, и Docker имеет эту возможность. Вы можете проверить это, проверив поле CapEff
файла /proc/$PID/status
, где $PID
- PID процесса containerd
, и расшифровав это значение, используя capsh --decode
:
$ pidof docker-containerd
675
$ cat /proc/675/status | grep CapEff
CapEff: 0000003fffffffff
$ capsh --decode=0000003fffffffff
0x0000003fffffffff=cap_chown,<...>,cap_sys_resource,<...>
Подводя итог: да, Docker может увеличить лимиты ресурсов для контейнеров, потому что у него есть привилегии для этого, и вы можете настроить эти лимиты, используя аргумент --ulimit
.