在CentOS上限制Docker容器资源的主要方法
docker run命令参数(最常用)docker run命令提供了丰富的参数,可直接在启动容器时设置资源限制,适用于临时或一次性容器的资源管控。
--cpus=<value>:限制容器可使用的CPU核心数(支持小数,如1.5表示1.5核)。例如,限制容器使用2核:docker run -it --cpus=2 ubuntu:latest /bin/bash。--cpuset-cpus="<cpu_list>":将容器绑定到指定的CPU核心(如0,2表示仅使用第0和第2核),适用于多核环境的隔离优化。--cpu-shares=<weight>:设置CPU相对权重(默认1024),当多个容器竞争CPU时,权重高的容器获得更多CPU时间(如--cpu-shares 512的容器资源占用约为--cpu-shares 1024的一半)。-m/--memory=<size>:设置容器最大可用内存(如512m表示512MB、2g表示2GB),超出会触发OOM(Out of Memory) Killer终止容器。例如:docker run -it --memory=512m ubuntu:latest /bin/bash。--memory-swap=<size>:设置内存+交换空间的总限制(必须大于-m的值,如-m 512m --memory-swap=1g表示内存最多用512MB,交换空间最多用512MB)。--memory-reservation=<size>:设置内存软限制(当容器内存使用超过该值时,Docker会尝试回收资源,但不强制终止)。--blkio-weight=<weight>:设置块设备I/O权重(范围10-1000,默认500),权重越高,磁盘I/O优先级越高(如--blkio-weight=800的容器优先级高于默认)。--device-read-bps=<device>:<rate>/--device-write-bps=<device>:<rate>:限制指定设备的读/写速度(如--device-read-bps=/dev/sda:1mb表示限制/dev/sda的读取速度为1MB/s)。--network模式(如bridge)和tc(Traffic Control)工具,或使用--device-read-bps/--device-write-bps限制网络接口的带宽(如--device-read-bps=eth0:1mb限制eth0的读取速度为1MB/s)。通过docker-compose.yml文件定义资源限制,便于多容器应用的统一管理和部署(需Docker Compose版本≥3)。
version: '3'
services:
web:
image: nginx:latest
deploy:
resources:
reservations: # 最低资源保证(启动容器时分配)
cpus: '0.5' # 至少0.5核
memory: 256M # 至少256MB内存
limits: # 最大资源限制(运行时上限)
cpus: '1' # 最多1核
memory: 512M # 最多512MB内存
reservations用于保证容器的最低资源需求(避免因宿主机资源不足导致容器无法启动),limits用于限制容器的最大资源使用(防止过度占用)。Docker底层依赖Linux cgroups(控制组)实现资源限制,可通过直接操作cgroups文件系统进行更细粒度的调整(适用于高级用户或自动化脚本)。
ls /sys/fs/cgroup/(常见子目录包括cpu、memory、blkio等)。/sys/fs/cgroup/cpu/docker/<container_id>)。cpu.cfs_quota_us(配额,单位微秒)和cpu.cfs_period_us(周期,默认100000微秒,如echo 200000 > cpu.cfs_quota_us表示限制为2核)。memory.limit_in_bytes(如echo 536870912 > memory.limit_in_bytes表示限制为512MB)。tasks文件:echo <container_pid> > tasks(使限制生效)。通过修改Docker守护进程的配置文件/etc/docker/daemon.json,可设置全局默认资源限制(适用于所有新创建的容器)。
{
"default-ulimits": {
"nofile": { // 文件描述符限制
"Name": "nofile",
"Hard": 65535,
"Soft": 65535
},
"nproc": { // 进程数限制
"Name": "nproc",
"Hard": 65535,
"Soft": 65535
}
},
"exec-opts": ["native.cgroupdriver=systemd"], // 推荐使用systemd作为cgroup驱动
"log-driver": "json-file",
"log-opts": {
"max-size": "100m" // 日志文件大小限制
}
}
sudo systemctl restart docker。docker run参数、Compose文件或Daemon配置需在容器创建时指定,运行后无法直接修改(需重建容器)。