一、介绍
Default-ulimits是Docker配置中的一个选项,用于设置容器默认的资源限制。通过在Docker守护进程的配置文件中设置default-ulimits,可以为所有新创建的容器设置默认的资源限制,包括文件描述符数量、CPU使用时间等。
二、配置方法
- 编辑Docker配置文件
找到并编辑Docker守护进程的配置文件/etc/docker/daemon.json。如果该文件不存在,可以创建它。在配置文件中添加以下内容来设置默认的资源限制:
{
"default-ulimits": {
"nofile": {
"name": "nofile",
"hard": 65535,
"soft": 65535
},
"nproc": {
"name": "nproc",
"hard": 4096,
"soft": 4096
},
"core": {
"name": "core",
"hard": 0,
"soft": 0
},
"locks": {
"name": "locks",
"hard": 1024,
"soft": 512
}
}
}
参数说明:
nofile:控制单个容器最大文件描述符数量(默认值常为1024:1024)
nproc:限制容器内用户级进程总数(防止fork炸弹攻击)
core:配置核心转储文件大小(影响故障诊断能力)
locks:约束文件锁持有数量(避免存储子系统死锁)
- 重启Docker守护进程
sudo systemctl daemon-reload
sudo systemctl restart docker
- 通过docker run -ulimit参数设置
docker run --ulimit nofile=1024:1024 --rm debian sh -c "ulimit -n"
三、配置优先级
/etc/security/limits.conf :宿主机的全局配置
daemon.json:Docker的default-ulimits设置
镜像Dockerfile中定义的RUN ulimit ...命令
优先级:RUN ulimit> daemon.json中的default-ulimits> 宿主机的全局配置limits.conf
四、应用场景
通过设置default-ulimits,可以确保所有新创建的容器都遵循预定义的资源限制,从而避免单个容器过度消耗系统资源,影响系统的稳定性和安全性。例如,限制文件描述符的数量可以防止容器打开过多的文件,从而减少系统崩溃的风险。
1.微服务治理
为Java应用容器设置 nofile=65535:65535,避免高并发场景下的 IOException: Too many open files
2.安全加固
在公共云环境限制非特权容器的 nproc=256:512,防御 fork炸弹攻击:
docker run --ulimit nproc=64:64 --rm debian sh -c "fork() { fork | fork & }; fork"
# 将快速触发资源不足错误
3.多租户隔离
在K8s集群中通过PodSecurityPolicy统一配置:
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
spec:
defaultAddCapabilities: []
allowedCapabilities: []
requiredDropCapabilities: []
hostNetwork: false
hostIPC: false
hostPID: false
runAsUser: { rule: 'MustRunAsNonRoot' }
fsGroup: { rule: 'RunAsAny' }
defaultUlimits:
- name: nofile
hard: 65535
soft: 32768
五、总结
--ulimit不是简单的参数配置,而是容器安全防护体系的最后一道防线。通过合理设置这些"紧箍咒",既能保障业务弹性,又能构建起预防级故障隔离机制——这正是云原生架构设计的精妙之处。