CPU资源限制
在Debian系统上,可以通过多种方式为Docker容器设置CPU资源限制,核心方法包括:
--cpus参数:直接限制容器可使用的CPU核心数(支持小数,如0.5表示半个核心)。例如,限制容器使用2个完整CPU核心:docker run -it --cpus="2" debian:latest /bin/bash。--cpuset-cpus参数:将容器绑定到指定的CPU核心(如0-2表示绑定到第0、1、2个核心)。例如:docker run -it --cpuset-cpus="0-2" debian:latest /bin/bash。--cpu-shares参数:设置CPU份额(权重),默认值为1024,数值越大,容器在CPU资源竞争中的优先级越高(如512表示较低优先级):docker run -it --cpu-shares=512 debian:latest /bin/bash。--cpu-quota与--cpu-period参数:通过组合设置CPU时间配额(单位:微秒)。例如,--cpu-quota=50000(50ms)和--cpu-period=100000(100ms)表示容器每100ms周期内最多使用50ms CPU时间。内存资源限制
内存限制需区分硬限制(最大可使用量)与软限制(预留量),常用参数包括:
--memory(或-m)参数:设置容器最大可使用内存(支持b/k/m/g单位,默认b)。例如,限制为512MB:docker run -it -m 512m debian:latest /bin/bash。--memory-swap参数:设置内存与交换空间的总大小(-1表示无限制)。若同时设置--memory,则--memory-swap需大于--memory(如--memory=512m --memory-swap=1g表示内存512MB+交换空间512MB)。--memory-reservation参数:设置内存软限制(预留量),默认值为0(无限制)。软限制仅在内存紧张时生效,确保容器不会过度消耗内存(如--memory=500m --memory-reservation=200m)。--kernel-memory参数:限制容器内核内存使用(无法使用交换空间),防止内核内存耗尽导致系统阻塞(如--kernel-memory=50m)。磁盘I/O资源限制
通过blkio子系统限制容器的磁盘读写速率与操作次数:
--blkio-weight参数:设置磁盘I/O权重(范围10-1000,默认500),数值越大,I/O优先级越高:docker run -it --blkio-weight=500 debian:latest /bin/bash。--device-read-bps与--device-write-bps参数:限制指定设备的读写带宽(如/dev/sda表示第一块硬盘)。例如,限制读取速率为1MB/s:docker run -it --device-read-bps=/dev/sda:1mb debian:latest /bin/bash。--device-read-iops与--device-write-iops参数:限制指定设备的每秒读写操作次数(如/dev/sda)。例如,限制每秒读取操作次数为100:docker run -it --device-read-iops=/dev/sda:100 debian:latest /bin/bash。网络带宽资源限制
目前Docker原生不支持直接限制网络带宽,但可通过第三方工具(如tc命令)或网络插件(如Calico、Cilium)实现。例如,使用tc限制容器出口带宽:
# 获取容器网络命名空间PID
CONTAINER_PID=$(docker inspect -f '{{.State.Pid}}' <container_id>)
# 进入容器网络命名空间
nsenter -t $CONTAINER_PID -n
# 添加带宽限制规则(出方向,1Mbps)
tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms
Ulimit限制
通过--ulimit参数设置容器的用户资源限制(如文件描述符数量),适用于需要控制单个进程资源消耗的场景:
docker run -it --ulimit nofile=1024:2048 debian:latest /bin/bash。docker-compose.yml文件的ulimits字段中配置(如myservice服务):version: '3'
services:
myservice:
image: debian
ulimits:
nofile:
soft: 1024
hard: 2048
/etc/docker/daemon.json文件设置全局默认ulimit(需重启Docker):{
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Soft": 1024,
"Hard": 2048
}
}
}
重启Docker:sudo systemctl restart docker。Daemon全局配置
通过修改Docker Daemon的/etc/docker/daemon.json文件,可设置全局资源限制(如默认ulimit、日志驱动等),适用于所有容器:
{
"exec-opts": ["native.cgroupdriver=systemd"], // 使用systemd作为cgroup驱动
"log-driver": "json-file",
"log-opts": {
"max-size": "100m", // 日志文件最大100MB
"max-file": "3" // 最多保留3个日志文件
}
}
修改后重启Docker生效:sudo systemctl restart docker。