Docker - исключить различия между контейнером и хостом - PullRequest
0 голосов
/ 06 ноября 2018

Я думал, что docker контейнеры поделились этими свойствами с хостом. Однако на одном docker хосте есть следующие настройки ulimit:

ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 63399
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 63399
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Но внутри контейнера можно получить:

ulimit -a
-f: file size (blocks)             unlimited
-t: cpu time (seconds)             unlimited
-d: data seg size (kb)             unlimited
-s: stack size (kb)                8192
-c: core file size (blocks)        unlimited
-m: resident set size (kb)         unlimited
-l: locked memory (kb)             64
-p: processes                      unlimited
-n: file descriptors               65536
-v: address space (kb)             unlimited
-w: locks                          unlimited
-e: scheduling priority            0
-r: real-time priority             0

Если обратить особое внимание на настройку -n - Контейнер ограничен 1024 открытыми файлами, потому что хост ограничен? Кто-нибудь может объяснить, пожалуйста, различия между значением ulimit внутри контейнера и значением основного хоста docker?

1 Ответ

0 голосов
/ 06 ноября 2018

Ограничения ресурса могут быть установлены 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...