限制 docker 容器内启动的进程数

Limit number of processes started inside docker container

我正在尝试将 docker 容器内的叉形炸弹造成的损坏降至最低。

我正在使用 pam_limits 并且 /etc/security/limits.conf 文件是

1000:1128 hard nproc 40
1000:1128 soft nproc 40

这意味着 ID 在 [1000..1128] 范围内的任何用户最多可以拥有 40 个进程。如果我 运行 forkbomb in shell by user with such id.

这工作正常

但是当我 运行 在 docker 容器内叉炸弹时,这些限制没有被应用,所以当我 运行 命令

# docker run -u 1000 ubuntu bash -c ":() { : | : & }; :; while [[ true ]]; do sleep 1; done"

我有尽可能多的进程,所有这些进程都属于id=1000的用户。

怎么了?我该如何解决?

与PAM无关,但你可以用"docker create"命令限制Docker容器,例如Enduro/X项目使用了一些IPC队列限制,但你可以用同样的方式设置一些其他的 ulimit 设置,与进程数一样,它将是“-ulimit nproc=256:512”,即软限制和硬限制。

例如:

$ sudo docker create --name bankapp-inst -it \
  --sysctl fs.mqueue.msg_max=10000 \
  --sysctl fs.mqueue.msgsize_max=1049600 \
  --sysctl fs.mqueue.queues_max=10000 \
  --ulimit msgqueue=-1 \
  --ulimit nproc=256:512 \
  bankapp 

所以nproc设置后,最多可以产生256个进程,如果ulimit改变了,那么上限是512个进程。希望这对您有所帮助!

当运行一个容器时,有一个选项可以限制pid的数量:

--pids-limit: Tune container pids limit (set -1 for unlimited)

命令为:

docker container run --pids-limit 100 your-image

参考:https://docs.docker.com/engine/reference/commandline/run/#options